jQuery ожидает запуска в браузере.В браузере window
присутствует в глобальном пространстве, и jQuery использует его для некоторых своих функций.В Node.js ваш код выполняется в области, созданной для файла, который его содержит.Даже если вы не думаете о нем как о модуле , Node.js не делает различий во всех ваших const
(и let
) объявлениях на верхнем уровне вашего файла, объявляющих переменные, которыеотносятся к вашему файлу.Поэтому const { window } = jsDom;
не помещает window
в глобальное пространство и не доступно для jQuery.
При запуске jQuery в узле у вас есть два варианта:
Делайте то, что вы делаете: сначала выставьте window
в глобальное пространство, затем загрузите jQuery.Это прекрасно работает.
Вместо этого вы можете сделать это:
const JSDOM = require('jsdom').JSDOM;
const jsDom = new JSDOM('<html>...</html>');
const { window } = jsDom;
const { document } = window;
const $ = global.jQuery = require("jquery")(window);
Вы также спрашиваете о const $ = global.jQuery = require('jquery');
.По моему опыту, большинство библиотек, которые зависят от jQuery (например, плагины jQuery), называют его jQuery
.Они работают в IIFE следующим образом:
(function ($) { // Inside the IIFE, jQuery is bound to $.
}(jQuery)); // jQuery is grabbed from the global space as jQuery.
Таким образом, вы хотите, чтобы jQuery
в глобальном пространстве поддерживало библиотеки, которые зависят от него.