Une meilleure façon d'exiger jQuery dans les modules CommonJS ?
-
21-12-2019 - |
Question
Je débute tout juste avec Node.js, Mocha et Browserify.
J'ai un module qui dépend de jQuery, et mes spécifications dépendent également de jQuery.Afin de faire simplement require('jquery')
dans le module, par opposition à require('jquery')(window)
, j'ai créé un jsdom window
dans mon fichier de spécifications et je l'ai attribué à global.window
:
var $;
beforeEach(function () {
var doc = jsdom.jsdom('<html><body></body></html>');
global.window = doc.createWindow();
$ = require('jquery');
...
});
De cette façon, mes spécifications peuvent utiliser jQuery pour trouver des nœuds DOM et tester les attentes, et mon module peut utiliser jQuery sans avoir à recevoir explicitement un window
.
Tout cela semble fonctionner correctement, mais est-ce la « bonne » chose à faire ?J'ai beaucoup cherché et je n'ai trouvé aucune autre mention de l'utilisation global.window
de cette façon pour passer à jQuery.Techniquement, je suppose window
est une dépendance pour mon module, dois-je donc la transmettre explicitement à mon module et vivre avec l'appel require('jquery')(window)
au lieu de require('jquery')
?
Quelle est la pratique courante pour créer des modules CommonJS nécessitant jQuery ?
La solution 2
Après avoir rencontré plus de problèmes avec plusieurs DOM (créés à l'aide de jsdom) pour différents exemples, j'ai réalisé mon erreur.Au lieu d'exiger jQuery dans mes spécifications et dans mes modules, je devrais seulement l'exiger dans mes spécifications et le transmettre dans mes modules en tant que dépendance ;c'est à dire.les modules ne devraient pas require('jquery')
du tout.
Une fois que j'ai réalisé cela, cela m'a semblé évident, c'est probablement la raison pour laquelle j'ai eu du mal à trouver de la documentation pertinente en ligne.
Autres conseils
Si ce que tu veux c'est éviter c'est faire window
un global, vous pouvez passer votre window
s'opposer à la jquery
module, comme ceci :
var jsdom = require("jsdom");
var $;
beforeEach(function () {
var doc = jsdom.jsdom('<html><body></body></html>');
var window = doc.createWindow();
$ = require('jquery')(window);
});
it("foo", function() {
console.log($("body"));
});