2011-12-02 15 views
44

Zacząłem czytać kilka tutoriali na temat RequireJS. W żadnym z nich słowo "zdefiniuj" nie zostało wyjaśnione w sposób zadowalający. Czy ktoś może mi pomóc z następujących:Wyjaśnienie definicji biblioteki RequireJS

define(
    ["Models/Person", "Utils/random", "jquery"], 
    function (Person, randomUtility, $) {..} 
) 

Co to jest "zdefiniuj"? Czy jest zdefiniowana funkcja z tablicą i anonimową funkcją wewnątrz niej? A może to coś innego? Czy ktoś może podać mi więcej informacji na temat tego rodzaju definicji?

Dodawanie: Dziękuję nnnnnn i pradeek za odpowiedzi. Tutaj w Europie było 2:30 w nocy, kiedy zamieszczałem pytanie. Może dlatego nie rozpoznałem, że było to proste wywołanie funkcji.

Odpowiedz

57

define nie jest specyficzne dla RequireJS, jest częścią AMD specification. Burke zauważy, że RequireJS nie implementuje dokładnie tego, jak AMD to określa, ponieważ AMD tak naprawdę nie myślało o przeglądarkach.

define nie ma funkcji anonimowej. define to metoda udostępniana plikom JavaScript opartym na AMD do wczytywania ich danych. Biblioteki takie jak RequireJS sprawiają, że jest to dostępne. Konkretna implementacja prawdopodobnie nie jest dla ciebie cenna. Przejdę więc do tego, który podałeś, ponieważ jest to najczęstszy sposób deklarowania modułu.

define([array], object);

Array jest lista modułów, że ten moduł zależy. Między modułami i plikami istnieje zależność 1: 1. Nie możesz mieć wielu modułów w pliku ani wielu plików dla jednego modułu.

Obiekt to definiowany moduł. Może to być wszystko, struktura lub funkcja, która zwraca strukturę. Przeczytaj dokumentację na temat RequireJS, aby uzyskać więcej informacji.

Jeśli obiekt jest funkcją, argumenty przekazane do funkcji są modułami wymienionymi jako zależności w pierwszym zdefiniującym argumencie. Ważne jest również, aby pamiętać, że gdy przejdziesz funkcję jako object, uruchomi się tylko jeden raz. Dostęp do metod lub właściwości utworzonych w tym jednym wystąpieniu można uzyskać w dowolnym momencie, a następnie można uzyskać do nich dostęp za pomocą innych modułów, które wymieniają ten moduł jako zależność.

Powodzenia, polecam bawić się z tym i czytać dokumenty, gdy coś nie ma sensu. Dokumenty RequiJS są świetne jako szybki start na temat działania modułów AMD.

1

Bardzo mi pomogła ta strona Why AMD?. Podsumowując z tej strony, specyfikacja AMD jest pomocna w przezwyciężaniu "napisz kilka tagów skryptów z niejawnymi zależnościami, które musisz ręcznie zamówić". Jest pomocny przy ładowaniu zależności przed wykonaniem wymaganych funkcji, podobnie jak w przypadku import w innych językach programowania, takich jak python. AMD zapobiega również problemowi zanieczyszczenia globalnego obszaru nazw. Sprawdź sekcję "It is an improvement over the web's current "globals and script tags" because".

5

Znalazłem zdefiniowany w dolnej części wymagania.js (Ja też zastanawiałem się, jakiego rodzaju rzeczy to define słowo jest, i to jest odpowiedź I szukał):

/** 
* The function that handles definitions of modules. Differs from 
* require() in that a string for the module should be the first argument, 
* and the function to execute after dependencies are loaded should 
* return a value to define the module corresponding to the first argument's 
* name. 
*/ 
define = function (name, deps, callback) { 
    var node, context; 

    //Allow for anonymous modules 
    if (typeof name !== 'string') { 
     //Adjust args appropriately 
     callback = deps; 
     deps = name; 
     name = null; 
    } 

    //This module may not have dependencies 
    if (!isArray(deps)) { 
     callback = deps; 
     deps = null; 
    } 

    //If no name, and callback is a function, then figure out if it a 
    //CommonJS thing with dependencies. 
    if (!deps && isFunction(callback)) { 
     deps = []; 
     //Remove comments from the callback string, 
     //look for require calls, and pull them into the dependencies, 
     //but only if there are function args. 
     if (callback.length) { 
      callback 
       .toString() 
       .replace(commentRegExp, '') 
       .replace(cjsRequireRegExp, function (match, dep) { 
        deps.push(dep); 
       }); 

      //May be a CommonJS thing even without require calls, but still 
      //could use exports, and module. Avoid doing exports and module 
      //work though if it just needs require. 
      //REQUIRES the function to expect the CommonJS variables in the 
      //order listed below. 
      deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps); 
     } 
    } 

    //If in IE 6-8 and hit an anonymous define() call, do the interactive 
    //work. 
    if (useInteractive) { 
     node = currentlyAddingScript || getInteractiveScript(); 
     if (node) { 
      if (!name) { 
       name = node.getAttribute('data-requiremodule'); 
      } 
      context = contexts[node.getAttribute('data-requirecontext')]; 
     } 
    } 

    //Always save off evaluating the def call until the script onload handler. 
    //This allows multiple modules to be in a file without prematurely 
    //tracing dependencies, and allows for anonymous module support, 
    //where the module name is not known until the script onload event 
    //occurs. If no context, use the global queue, and get it processed 
    //in the onscript load callback. 
    (context ? context.defQueue : globalDefQueue).push([name, deps, callback]); 
}; 
0

myślę RequireJs API specification podsumowuje to całkiem dobrze:

Jeśli moduł ma zależności, pierwszy argument powinien być tablicą nazw zależności, a drugi argument powinien być funkcją definicji. Funkcja zostanie wywołana w celu zdefiniowania modułu po załadowaniu wszystkich zależności. Funkcja powinna zwrócić obiekt, który definiuje moduł.

Wymieniają przykłady wszystkich różnych form składniowych definicji.