Comment peut-on exiger que les fonctions JS soient conservées hors de l'espace de noms global?

J'écris une application JS tierce utilisant requireJS et je veux garder l'espace de noms global propre de tout sauf l'objet d'interface global unique qui sera créé par mon application. Je n'ai eu aucun problème à ce sujet, sauf pour les besoins.

En option pour l'optimiseur, require.js peut être déployé dans la construction et l' espace de noms peut être défini, permet à l'optimiseur d'accéder à toutes les références requérant des fonctions dans cet espace de noms.

par exemple. Require (…) devient my_scope.require (…)

Le problème est que cet objet d'espace de noms global n'existera pas jusqu'à ce qu'il soit créé dans l'application. L'optimiseur assure que requireJS charge et exécute avant l'un des codes qu'il charge, alors quand vient le temps d'exécuter une fonction requise (comme exiger ou définir), une exception est lancée (l'objet espace de noms est indéfini).

Est-ce que quelqu'un a réussi à réussir cela sans modifier manuellement le script construit ou exécuter un autre script séparé et avant le script construit? En d'autres termes, existe-t-il un moyen approprié d'y parvenir?

Pour quelqu'un d'autre qui a cherché la réponse à cette question, voilà, trouvé dans une pile de graisse de coude utilisée.

Dans les options de configuration de construction, oubliez d'utiliser l' namespace . Il existe une "enveloppe" de propriété qui vous permet d'envelopper tout le script de construction dans le code de votre choix.

Il suffit de le définir comme suit pour créer une portée locale autour de tout (y compris les fonctions requireJS):

 require.config({ wrap: { start: "(function() {", end: "}());" } }) 

Ma prise est que les requérants, et les chargeurs de modules en général, ont une approche différente pour réduire l'encombrement mondial que l'espace de noms. Avec l'exigence, vous n'avez pas besoin de joindre les éléments à l'espace de noms global, utilisez simplement un appel de méthode requis dans une fermeture pour obtenir des références locales.

Donc, vous échangez un seul bit d'encombrement global (c.-à-d. Window.require) pour toutes les autres choses que vous devriez attacher.

Dans une implémentation de type nommé, vous utiliserez quelque chose comme

 var foo = window.my_scope.foo.bar 

Avec les chargeurs de modules, vous devez appeler. Dans le cas d'un chargeur de module CommonJS, vous feriez quelque chose comme ça

 var foo = require("my_scope/foo/bar") 

RequireJs ajoute un peu plus de complexité à cela car il s'agit d'un chargeur de module AMD, mais c'est une autre conversation entière!