在CommonJS模块中需要jQuery的更好方法是什么?

时间:2014-04-11 11:44:20

标签: javascript jquery node.js mocha browserify

我刚刚开始使用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模块的常见做法是什么?

2 个答案:

答案 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')

一旦我意识到这一点似乎是不言而喻的,这可能就是我在网上找到任何相关文档的原因。