【问题标题】:Better way to require jQuery in CommonJS modules?在 CommonJS 模块中要求 jQuery 的更好方法?
【发布时间】:2014-04-11 11:44:20
【问题描述】:

我刚刚开始使用 Node.js、Mocha 和 Browserify。

我有一个依赖于 jQuery 的模块,而我的规范也依赖于 jQuery。为了在模块中简单地做require('jquery'),而不是require('jquery')(window),我在我的规范文件中创建了一个jsdomwindow并将它分配给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 模块的常见做法是什么?

【问题讨论】:

    标签: javascript jquery node.js mocha.js browserify


    【解决方案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"));
    });
    

    【讨论】:

    • 是的,我意识到我可以在 beforeEach() 中执行此操作,但我不想在我的模块中执行此操作,因为。
    • 你没有在那儿完成你的句子。因为什么?
    • 对不起,我被打扰了,然后没有回来。我不想将窗口作为依赖项显式传递给我的模块。虽然现在想了想,但或许我应该这样做……
    【解决方案2】:

    在针对不同示例的多个 DOM(使用 jsdom 创建)遇到更多问题后,我意识到了我的错误。而不是在我的规范和模块中需要 jQuery,我应该在我的规范中 only 需要它,并将它作为依赖项传递到我的模块中;即模块根本不应该require('jquery')

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

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2011-11-26
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2019-07-26
      • 2012-08-17
      • 2018-09-25
      • 1970-01-01
      相关资源
      最近更新 更多