Kiedy powinienem używać wymaga (), a kiedy definiować ()?

316

Przez ostatnie kilka dni bawiłem się z RequJs. Próbuję zrozumieć różnice między definiowaniem a wymaganiem.

Zdaje się, że Zdefiniuj pozwala na separację modułów i pozwala na przestrzeganie kolejności zależności. Ale pobiera wszystkie pliki, których potrzebuje na początek. Chociaż wymagają tylko ładunków, których potrzebujesz, gdy ich potrzebujesz.

Czy tych dwóch można używać razem i do jakich celów należy używać każdego z nich?

skinnybrit51
źródło

Odpowiedzi:

331

Po definezarejestrowaniu modułu w pliku wymaga.js, na którym możesz polegać w innych definicjach modułu lub wymagać instrukcji. Z requiretobą „po prostu” załaduj / użyj modułu lub pliku javascript, który może zostać załadowany przez request.js. Przykłady znajdziesz w dokumentacji

Moja ogólna zasada:

  • Zdefiniuj: jeśli chcesz zadeklarować moduł, inne części twojej aplikacji będą zależeć.

  • Wymagaj: jeśli chcesz tylko załadować i używać rzeczy.

wischan
źródło
331

Z kodu źródłowego wymagania.js (wiersz 1902):

/**
 * 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()Funkcja przyjmuje dwa opcjonalne parametry (ciąg reprezentować identyfikator modułu i tablicę wymaganych modułów) i wymagany jeden parametr (metoda fabryczne).

Zwrócenie metody fabrycznej MUSI zwrócić implementację modułu (w taki sam sposób, jak robi to wzorzec modułu ).

require()Funkcja nie ma powrotu wdrożenie nowego modułu.

Za pomocą define()tego pytasz: „uruchom funkcję, którą przekazuję, jako parametr i przypisz wszelkie zwracane identyfikatory, które przekazuję, ale wcześniej sprawdź, czy te zależności są załadowane” .

Używając require()mówisz coś w stylu „funkcja, którą przekazuję, ma następujące zależności, sprawdź, czy te zależności są ładowane przed uruchomieniem” .

require()Funkcja jest gdzie wykorzystać swoje określone moduły, aby mieć pewność, że moduły są zdefiniowane, ale nie definiują nowe moduły tam.

Robert
źródło
2
Czy jest jakaś różnica w tym, czy wymagany jest używany w zdefiniowanym module, czy poza nim? Jeśli jest używany w module, to dlaczego nie ustawić wymagań w definicji modułu zamiast używać wymagania?
Petri
Dlaczego ta odpowiedź jest tak różna od tego, co tutaj czytam, wymagajs.org/docs/api.html#deffunc ??
James Lin
2
@Petri, wygląda na to, że widzisz zachowanie RequireJS w wersji 2 podczas asynchronicznego ładowania modułów. „RequireJS 2.0 nie wykona funkcji fabrycznej modułu (funkcja przekazana do define()), dopóki nie pojawi się require([])wywołanie, które o to poprosiło, lub coś, co zależy od tego.” github.com/jrburke/requirejs/wiki/…
alxndr
2

„Zdefiniuj” metodę ułatwiającą definicję modułu i „wymagającą” metodę obsługi ładowania zależności

Zdefiniuj służy do definiowania nazwanych lub nienazwanych modułów na podstawie propozycji przy użyciu następującego podpisu:

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

Z drugiej strony wymagany jest zwykle używany do ładowania kodu do pliku JavaScript najwyższego poziomu lub w module, jeśli chcesz dynamicznie pobierać zależności

Więcej informacji można znaleźć na stronie https://addyosmani.com/writing-modular-js/ .

refaktor
źródło
2

Główne zasady:

  1. Używasz funkcji definiuj, kiedy chcesz zdefiniować moduł, który będzie ponownie używany

  2. Używasz wymaga, aby po prostu załadować zależność

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });
    

Mam nadzieję, że to ci pomoże.

Humayoun_Kabir
źródło
1

Wymagane () i zdefiniowane () oba służą do ładowania zależności. Istnieje duża różnica między tymi dwiema metodami.

To bardzo proste chłopaki

Wymagaj (): Metoda służy do uruchamiania natychmiastowych funkcjonalności. Zdefiniuj (): Metoda służy do definiowania modułów do użycia w wielu lokalizacjach (ponowne użycie).

Baalu
źródło