Bessere Möglichkeit, jQuery in CommonJS-Modulen zu erfordern?
-
21-12-2019 - |
Frage
Ich fange gerade erst mit Node.js, Mocha und Browserify an.
Ich habe ein Modul, das von jQuery abhängt, und meine Spezifikation dafür hängt auch von jQuery ab.Um es einfach zu tun require('jquery')
im Modul, im Gegensatz zu require('jquery')(window)
, ich habe ein jsdom erstellt window
in meiner Spezifikationsdatei gespeichert und zugewiesen global.window
:
var $;
beforeEach(function () {
var doc = jsdom.jsdom('<html><body></body></html>');
global.window = doc.createWindow();
$ = require('jquery');
...
});
Auf diese Weise können meine Spezifikationen jQuery verwenden, um DOM-Knoten zu finden und Erwartungen zu testen, und mein Modul kann jQuery verwenden, ohne dass a explizit übergeben werden muss window
.
Das scheint alles gut zu funktionieren, aber ist es das „Richtige“?Ich habe viel gesucht und kann keinen anderen Hinweis auf die Verwendung finden global.window
auf diese Weise an jQuery übergeben.Technisch gesehen, nehme ich an window
ist eine Abhängigkeit für mein Modul, daher sollte ich sie explizit an mein Modul übergeben und mit dem Aufruf leben require('jquery')(window)
anstatt require('jquery')
?
Was ist die gängige Praxis zum Erstellen von CommonJS-Modulen, die jQuery erfordern?
Lösung 2
Nachdem ich bei verschiedenen Beispielen auf weitere Probleme mit mehreren DOMs (erstellt mit jsdom) gestoßen war, wurde mir mein Fehler klar.Anstatt jQuery in meinen Spezifikationen und Modulen zu fordern, sollte ich es tun nur Ich benötige es in meinen Spezifikationen und übergebe es als Abhängigkeit an meine Module.d.h.Die Module sollten nicht require('jquery')
überhaupt.
Als mir das klar wurde, schien es mir selbstverständlich, weshalb ich wahrscheinlich Schwierigkeiten hatte, relevante Dokumentation online zu finden.
Andere Tipps
Wenn Sie vermeiden möchten, ist das Machen window
eine globale, Sie können Ihre übergeben window
Einspruch gegen die jquery
Modul, etwa so:
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"));
});