2013-06-28 13 views
49

Bei Modulen gebe ich kein Objekt zurück, das ich benötigt habe, anstatt definieren. Zum Beispiel sagen, dass ich die folgende jQuery-Plugin (jquery.my-plugin.js) haben:RequireJs - Define vs Require

require(['jquery'], function($) { 
    $.fn.myPlugin = function(options) { 
     ... 
    }; 
}); 

Nun, wenn ich folgendes in einem anderen Modul sagen:

require(['jquery', 'jquery.my-plugin'], function($) { 
    $('#element').myPlugin(); 
}); 

Ich habe festgestellt, das doesn‘ t arbeiten, weil myPlugin nicht registriert wurde. Wenn ich jedoch das Require zu einer Definition innerhalb meines jquery.my-Plugin-Moduls ändere, funktioniert es einwandfrei.

Ich würde es schätzen, wenn jemand klären könnte, warum ich das tun muss. Ich mag es, etwas vollständig zu verstehen, bevor ich es benutze. Danke

+2

möglich Duplikat [zu verwenden, wenn erforderlich und wann benutze define] (http://stackoverflow.com/questions/9507606/when-to-use-require-and-when-of-use-define) – Armand

Antwort

90

Im Wesentlichen, wenn Sie require verwenden, sagen Sie "ich will dieses, aber ich will alle seine Abhängigkeiten auch". Im unten stehenden Beispiel benötigen wir A, müssen jedoch nach allen Abhängigkeiten suchen und sicherstellen, dass sie geladen sind, bevor Sie fortfahren.

require(['a'], function(a) { 
    // b, c, d, e will be loaded 
}); 

// File A 
define(['b','c','d','e'], function() { 
    return this; 
}); 

Faustregel ist, dass Sie define verwenden, wenn Sie ein Modul definieren möchten, die von Ihrer Anwendung wiederverwendet werden und Sie verwenden require einfach eine Abhängigkeit zu laden.

+2

Viel besser gesagt als meins :) Wird meins entfernen. – oooyaya

+0

Danke, aber warum kann ich nicht require anstatt für Datei A definieren? Im Wesentlichen würde es dasselbe sagen, dass Datei A b, c, d und e benötigt, bevor sie ausgeführt werden kann. – nfplee

+51

Die allgemeine Faustregel ist, dass Sie 'define' verwenden, wenn Sie ein Modul definieren möchten, das von Ihrer Anwendung wiederverwendet wird, und Sie' require' verwenden, um einfach eine Abhängigkeit zu laden. –

2

Unten ist der Code, der diedefiniert ein Modul innerhalb jquery.my-plugin.js werden sollte ‚jquery.my-Plugin‘ genannt, die an anderer Stelle als Abhängigkeit verwendet werden kann.

define(['jquery'], function($) { //jquery is a dependency to the jquery.my-plugin module 
    $.fn.myPlugin = function(options) { //adds a function to the *global* jQuery object, $ (global since jQuery does not follow AMD) 
     ... 
    }; 
}); 

Unten ist ein Codeabschnitt, wo Sie Ihre Plugin-Funktion auf die globale jQuery-Objekt anhängen wollen und dann verwenden, ...

require(['jquery.my-plugin'], function() { // jquery.my-plugin is loaded which attaches the plugin to the global JQuery object as shown above, then this function fires 

    //the only reason $ is visible here is because it's global. If it was a module, you would need to include it as a dependency in the above require statement 
    $('#element').myPlugin(); //the $ refers to the global object that has the plugin attached 
}); 
+1

Alles sieht gut aus mit mir. Ja, das $ -Objekt ist global definiert, daher denke ich, dass es optional ist, ob es in die require-Anweisung aufgenommen wird oder nicht.Dadurch vermeiden Sie potenzielle Probleme mit in Konflikt stehenden Bibliotheken und stimmen mit der obigen Definition überein. – nfplee