Avec des modules AMD, quand (ou pourquoi) est-il correct d'utiliser require () dans define ()?

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

  •  27-10-2019
  •  | 
  •  

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?

Était-ce utile?

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:

  1. 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
  2. vous voulez explicitement le chargement de certains defer modules jusqu'à ce qu'ils soient nécessaires
  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top