Avec des modules AMD, quand (ou pourquoi) est-il correct d'utiliser require () dans define ()?
Question
Ma compréhension des modules AMD (en utilisant par exemple RequireJs ou curl.js) est:
require()
est utilisée pour charger de façon asynchrone des modules différents et lorsqu'il est chargé, puis le fn de rappel est exécutée.
Et pour définir un module, vous auriez des scripts distincts que l'utilisation define()
Mais j'ai vu certains modules utilisent require()
dans leur définition de la fonction, par exemple.
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 */
})
Mais je trouve cette confusion parce que je l'aurais pensé que si un module a alors ils devraient dépendances être passés à travers la fonction principale de define([dependancies], fnDefinition)
et non dans via require()
comme dans l'exemple ci-dessus fait.
Y at-il un raisonnement derrière cela?
La solution
Il y a quelques raisons pour lesquelles vous voudrez peut-être utiliser require()
dans un module.
Mais d'abord, assurez-vous de demander une référence à la variable require
correcte. Dans votre exemple, la référence à require
est global . Vous voulez une référence à un require
qui scope au contexte de votre module (parfois appelé un « besoin local »). C'est facile:
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 */
});
La raison principale ce qui est important est de veiller à ce que ids du module relatif (par exemple « ./peerModule » ou « ../unclePath/cousinModule ») sont correctement. (Ceci est une des raisons, curl.js ne dispose pas d'un require
global par défaut.)
Les raisons d'utiliser un require
local:
- vous ne savez pas quels modules sont nécessaires au moment de la construction (ou temps de chargement) en raison des conditions d'exécution
- vous voulez explicitement le chargement de certains defer modules jusqu'à ce qu'ils soient nécessaires
- vous voulez charger une variante d'un module en fonction des résultats de détection de caractéristiques (bien que quelque chose comme plug-in « a » peut-être de dojo une meilleure solution (désolé, lien me éludant))
Enfin, AMD définit une seconde utilisation de require
pour la compatibilité avec les modules écrit dans les CommonJS modules / 1,1, qui sont ensuite enveloppés dans un define
. Celles-ci ressemblent à ceci:
define(function(require, exports, module){
var a = require("pkgZ/moduleA"), // dependency
b = require("pkgZ/moduleB"); // dependency
/* rest of the code for this module */
});
javascript côté serveur devs peuvent trouver ce format attrayant. :)
Certains chargeurs AMD (tels que RequireJS, version 0.2, 1.7+ dojo bdLoad et curl.js 0.6+) détectera cet hybride AMD / format CJSM1.1 et trouver des dépendances en balayant le module pour les appels require
.