Лучший способ потребовать jQuery в модулях CommonJS?

Я только начинаю работать с Node.js, Mocha и Browserify.

У меня есть модуль, который зависит от jQuery, и моя спецификация для него также зависит от jQuery. Чтобы просто сделать require('jquery') в модуле, а не require('jquery')(window), я создал 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')?

Какова обычная практика создания модулей CommonJS, для которых требуется jQuery?


person Richard Turner    schedule 11.04.2014    source источник


Ответы (2)


Если вы хотите избежать превращения 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"));
});
person Louis    schedule 11.04.2014
comment
Да, я понимаю, что могу сделать это внутри beforeEach(), но я не хочу делать это внутри своего модуля, потому что. - person Richard Turner; 11.04.2014
comment
Вы не закончили фразу там. Потому что что? - person Louis; 11.04.2014
comment
Извините, меня прервали, а потом я не вернулся. Я не хочу явно передавать окно в свой модуль в качестве зависимости. Хотя теперь я думаю об этом, возможно, я должен сделать это... - person Richard Turner; 13.04.2014

Столкнувшись с большим количеством проблем с несколькими DOM (созданными с использованием jsdom) для разных примеров, я понял свою ошибку. Вместо того, чтобы требовать jQuery в своих спецификациях и модулях, я должен только требовать его в своих спецификациях и передавать его в свои модули в качестве зависимости; то есть модули вообще не должны require('jquery').

Как только я понял это, это показалось само собой разумеющимся, и, вероятно, поэтому я изо всех сил пытался найти любую соответствующую документацию в Интернете.

person Richard Turner    schedule 14.04.2014