Wenn (oder warum) mit AMD -Modulen (oder warum) in Ordnung () in Define () in Ordnung ist?

StackOverflow https://stackoverflow.com/questions/7835116

  •  27-10-2019
  •  | 
  •  

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?

War es hilfreich?

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:

  1. Sie wissen nicht
  2. Sie möchten ausdrücklich das Laden einiger Module verschieben, bis sie benötigt werden
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top