Wenn (oder warum) mit AMD -Modulen (oder warum) in Ordnung () in Define () in Ordnung ist?
Frage
Mein Verständnis von AMD -Modulen (beispielsweise unter Verwendung von Anforderungen oder curl.js) lautet:
require()
wird verwendet, um asynchron zu unterschiedlichen Modulen zu laden, und beim Laden wird der Rückruf fn ausgeführt.
Und um ein Modul zu definieren, hätten Sie separate Skripte, die verwendet werden define()
Aber ich habe einige Module verwendet require()
In ihrer Funktionsdefinition, z. B.
define([a, b, c], function(i, ii, iii){
require([d, e, f], function(d, e, f) {
// do some stuff with these require()'d dependancies
})
/* rest of the code for this module */
})
Aber ich finde das verwirrend, weil ich gedacht hätte, wenn ein Modul abhängig ist, sollten sie über die Hauptsache durchlaufen werden define([dependancies], fnDefinition)
Funktion und nicht in ihm über durch require()
gemäß dem obigen Beispiel.
Gibt es eine Argumentation dahinter?
Lösung
Es gibt einige Gründe, warum Sie vielleicht verwenden möchten require()
in einem Modul.
Stellen Sie jedoch zunächst sicher, dass Sie einen Verweis auf die richtige Anlage anfordern require
Variable. In Ihrem Beispiel der Verweis auf require
ist ein global. Sie möchten einen Verweis auf a require
Das wird in den Kontext Ihres Moduls (manchmal als "lokaler Anforderung" bezeichnet). Das ist einfach:
define(["a", "b", "c", "require"], function(i, ii, iii, require){
require(["d", "e", "f"], function(moduleD, moduleE, moduleF) {
// do some stuff with these require()'d dependencies
})
/* rest of the code for this module */
});
Der Hauptgrund dafür ist wichtig, sicherzustellen, dass relative Modul -IDs (z. B. "./Peermodule" oder "../unclepad/cousinmodule") korrekt aufgelöst werden. (Dies ist einer der Gründe, Curl.js hat keine globale require
standardmäßig.)
Gründe für die Verwendung eines Lokalen require
:
- Sie wissen nicht
- Sie möchten ausdrücklich das Laden einiger Module verschieben, bis sie benötigt werden
- Sie möchten eine Variation eines Moduls basierend auf den Ergebnissen der Feature -Erkennung laden (obwohl so etwas wie das "Has!" -Erglee -Plugin eine bessere Lösung sein könnte (sorry, Link, der mir entzieht))
Schließlich definiert AMD eine zweite Verwendung von require
Für die Kompatibilität mit Modulen, die in den CommonJS -Modulen/1.1 verfasst wurden, die dann in a eingewickelt sind define
. Diese sehen so aus:
define(function(require, exports, module){
var a = require("pkgZ/moduleA"), // dependency
b = require("pkgZ/moduleB"); // dependency
/* rest of the code for this module */
});
Serverseitige JavaScript-Entwickler finden dieses Format möglicherweise attraktiv. :)
Einige AMD -Lader (z. require
Anrufe.