Wann sollte ich require () verwenden und wann definiere ich ()?


316

Ich habe in den letzten Tagen mit Requirejs herumgespielt. Ich versuche die Unterschiede zwischen definieren und erfordern zu verstehen.

Define scheint die Modultrennung zu ermöglichen und die Einhaltung der Abhängigkeitsreihenfolge zu ermöglichen. Es werden jedoch alle Dateien heruntergeladen, mit denen es beginnen muss. Sie benötigen zwar nur das, was Sie brauchen, wenn Sie es brauchen.

Können diese beiden zusammen verwendet werden und für welche Zwecke sollte jeder von ihnen verwendet werden?

Antworten:


331

Mit defineeinem Modul in require.js registrieren , dass Sie dann in anderen Moduldefinitionen sind abhängig von oder Aussagen erfordern. Mit requireIhnen "nur" laden / verwenden Sie ein Modul oder eine Javascript-Datei, die von require.js geladen werden kann. Beispiele finden Sie in der Dokumentation

Meine Faustregel:

  • Definieren: Wenn Sie ein Modul deklarieren möchten, hängen andere Teile Ihrer Anwendung davon ab.

  • Erforderlich: Wenn Sie nur Dinge laden und verwenden möchten.


331

Aus dem Quellcode require.js (Zeile 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.
 */

Das define() Funktion akzeptiert zwei optionale Parameter (eine Zeichenfolge, die eine Modul-ID und ein Array erforderlicher Module darstellt) und einen erforderlichen Parameter (eine Factory-Methode).

Die Rückgabe der Factory-Methode MUSS die Implementierung für Ihr Modul zurückgeben (auf die gleiche Weise wie das Modulmuster ).

Die require()Funktion muss die Implementierung eines neuen Moduls nicht zurückgeben.

Wenn define()Sie verwenden, fragen Sie etwas wie "Führen Sie die Funktion aus, die ich als Parameter übergebe, und weisen Sie der übergebenen ID alle Rückgaben zu, überprüfen Sie jedoch zuvor, ob diese Abhängigkeiten geladen sind" .

Wenn require()Sie etwas sagen wie "Die Funktion, die ich übergebe, hat die folgenden Abhängigkeiten, überprüfen Sie, ob diese Abhängigkeiten geladen sind, bevor Sie sie ausführen" .

In dieser require()Funktion verwenden Sie Ihre definierten Module, um sicherzustellen, dass die Module definiert sind, aber Sie definieren dort keine neuen Module.


2
Gibt es einen Unterschied, ob require innerhalb eines definierten Moduls oder außerhalb dieses Moduls verwendet wird? Wenn es innerhalb eines Moduls verwendet wird, warum nicht einfach die Anforderungen in der Moduldefinition festlegen, anstatt die Anforderungen zu verwenden?
Petri

Warum unterscheidet sich diese Antwort so sehr von dem, was ich hier lese ? Requirejs.org/docs/api.html#deffunc ??
James Lin

2
@Petri, hört sich so an, als ob Sie das Verhalten von RequireJS Version 2 beim asynchronen Laden von Modulen sehen. "RequireJS 2.0 führt die Factory-Funktion des Moduls (die an übergebene Funktion define()) erst aus, wenn ein require([])Aufruf danach gefragt wurde oder etwas, das davon abhängt." github.com/jrburke/requirejs/wiki/…
alxndr

2

"define" -Methode zur Erleichterung der Moduldefinition und "require" -Methode zur Behandlung des Abhängigkeitsladens

Mit define werden benannte oder unbenannte Module basierend auf dem Vorschlag mit der folgenden Signatur definiert:

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

require wird normalerweise zum Laden von Code in eine JavaScript-Datei der obersten Ebene oder in ein Modul verwendet, wenn Sie Abhängigkeiten dynamisch abrufen möchten

Weitere Informationen finden Sie unter https://addyosmani.com/writing-modular-js/ .


2

Allgemeine Regeln:

  1. Sie verwenden define, wenn Sie ein Modul definieren möchten, das wiederverwendet wird

  2. Sie verwenden require, um einfach eine Abhängigkeit zu laden

    //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
    });
    

Hoffe das hilft dir.


1

require () und define () werden beide zum Laden von Abhängigkeiten verwendet. Es gibt einen großen Unterschied zwischen diesen beiden Methoden.

Es sind sehr einfache Leute

Require (): Die Methode wird verwendet, um sofortige Funktionen auszuführen. define (): Mit dieser Methode werden Module für die Verwendung an mehreren Standorten definiert (Wiederverwendung).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.