Comment puis-je exporter une variable globale à partir de Require.js?
Je suis en train de faire une bibliothèque externe à l'aide de Require.js. Grâce à Require.js pas de compiler seul fichier js correctement et Require.js (almond.js) le Calendrier Off j'ai compris comment faire pour obtenir tout ce à "compiler" dans une seule optimisé/construit fichier, et que seul fichier fonctionne. Il y a juste un problème: je ne peux pas comprendre comment définir une variable pour ma bibliothèque.
Disons que je veux de ma bibliothèque pour créer window.Foo
. J'ai essayé d'utiliser un main.js
fichier avec:
window.Foo = require([], function() {
window.Foo = {someValue: 1};
return {someValue: 2};
});
et un wrapper fin fragment de:
return require('main');
}));
Comme vous pouvez le voir, j'ai tenté d'exposer Foo dans l'espace mondial à la fois par la définition explicite de window.Foo
de l'intérieur de l'exiger d'appel, et en définissant explicitement de l'extérieur via la valeur de retour de la fin du fragment. Mais ni l'un fonctionne; si j'ajoute un console.log(window.foo)
juste après que j'ai charger le construit fichier, il me dit que window.Foo
est pas défini.
Si je fais une fenêtre.setTimeout window.Foo
finalement ne get set (à {someValue: 1}
), mais je ne peux pas très bien s'attendre à ce que mes utilisateurs d'avoir à envelopper l'ensemble de leur code avec un délai d'attente. Quelqu'un peut-il expliquer comment je peux obtenir window.Foo
être défini dès que mon optimisé/construit fichier est chargé?
Notre principale base de code utilise l'Exigent, et cette bibliothèque externe utilise plusieurs morceaux de code. Pour que la bibliothèque externe à l'effet de levier le code existant partir de notre base de code, il doit être capable de "parler" ... bien qu'une fois qu'il obtient ce code il n'a pas besoin d'Exiger que ce soit, c'est pourquoi je suis en train de le faire apparaître à l'utilisateur comme un tout autonome de la bibliothèque.
OriginalL'auteur machineghost | 2014-03-05
Vous devez vous connecter pour publier un commentaire.
Si vous suivez James instructions ici, vous pouvez facilement produire une bibliothèque conçue comme un faisceau de RequireJS modules que quelqu'un peut se charger de manière synchrone.
J'ai un github référentiel illustrant l'ensemble de la chose. Les points saillants:
La
main
module exportationsFoo
de l'espace mondial:Il renvoie également à une valeur qui est exporté par le début fragment que
Bar
(c'est la ligne qui ditroot.Bar = factory();
). De sorte qu'il illustre de deux manières à l'exportation de l'espace mondial.L'emballage code utilisé par
r.js
commence principal avec le synchrone forme derequire
:Si vous chargez, vous verrez le résultat suivant:
require
où j'aurais eu undefine
. Je vais essayer la mise en œuvre de votre démarche dès que j'ai le temps ce matin.En plus de cette réponse (qui a très bien fonctionné pour moi, merci Louis), quelqu'un dans le Besoin que les questions de fil a également souligné cette bibliothèque (je suis en mentionnant qu'il est complet): github.com/gfranko/amdclean
"fenêtre" ne fonctionne pas (phonegap) "document" a fait un travail
OriginalL'auteur Louis
Appels à
require()
sont async, sens de la valeur de retour de la fonction que l'on passe en argument est pas retourné parrequire()
lui-même. Votre problème pourrait être résolu de différentes manières, le RequireJS façon est la définition de votre code dans un module et exigeant en tant que dépendance:Foo.bar()
contre les rendant charge, alors nerequire(['fooLibrary'], (Foo) { Foo.bar(); });
. La plupart des gens sont habitués à l'ancienne: à télécharger jQuery, puis utilisez$
... ils n'ont pas àrequire(['jQuery'], function($) { $.doSomething()});
. Idéalement, j'aimerais que notre bibliothèque pour travailler de la même façon, et parce que j'ai pré-compilé le tout dans un seul fichier à l'avance, il doit être théoriquement pas besoin de l'asynchronicité.jQuery est en train de faire exactement ce que vous voulez dans leur processus de construction, mais il n'a rien pris en charge par RequireJS lui-même: github.com/jquery/jquery/blob/master/build/tasks/build.js
Hein, c'est intéressant. Pourtant, je suis un peu choqué qu'il est impossible de convertir certains Require.js code synchrone; le Besoin de l'Optimiseur obtient le code de 95% du chemin ...
il sera synchrone, vous pouvez exiger des choses de façon synchrone, si vous savez qu'ils sont déjà chargés. Le global ou local module exigent fonction de RequireJS va le chercher dans le cache d'abord, si le fichier est là, il va la retourner de façon synchrone, et si il y a un rappel, il va passer le fichier en tant que bien, et c'est tout de synchronisation. Si le fichier n'est pas dans le cache, et si il y a un rappel à condition alors de récupérer le fichier en mode asynchrone, et de les fournir dans le rappel de require().
OriginalL'auteur jgillich