我刚刚开始使用Node.js,Mocha和Browserify。
我有一个依赖于jQuery的模块,我的规范也依赖于jQuery。为了简单地在模块中执行require('jquery')
而不是require('jquery')(window)
,我在我的spec文件中创建了一个jsdom window
并将其分配给global.window
:
var $;
beforeEach(function () {
var doc = jsdom.jsdom('<html><body></body></html>');
global.window = doc.createWindow();
$ = require('jquery');
...
});
通过这种方式,我的规范可以使用jQuery来查找DOM节点和测试期望,我的模块可以使用jQuery而无需显式传递window
。
这一切似乎都运转正常,但它是“正确”的事情吗?我搜索了很多,找不到任何其他提及使用global.window
这种方式传递给jQuery。从技术上讲,我认为window
是我的模块的依赖项,所以我应该明确地将它传递给我的模块并通过调用require('jquery')(window)
而不是require('jquery')
来生活吗?
创建需要jQuery的CommonJS模块的常见做法是什么?
答案 0 :(得分:1)
如果您希望避免使window
成为全局,则可以将window
对象传递给jquery
模块,如下所示:
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"));
});
答案 1 :(得分:-1)
针对不同的示例遇到了多个DOM(使用jsdom创建)的更多问题,我意识到了我的错误。我不应该在我的规范和模块中要求jQuery,而是仅在我的规范中要求它,并将其作为依赖项传递给我的模块;即模块根本不应该require('jquery')
。
一旦我意识到这一点似乎是不言而喻的,这可能就是我在网上找到任何相关文档的原因。