Почему JQuery требует глобального "оконного" объекта? - PullRequest
0 голосов
/ 30 сентября 2018

Я использую jsdom вместе с jquery для очистки статического веб-содержимого в приложении Node.js.

jsdom преобразует строку HTML в дерево DOM, включая windowимущество.Я обнаружил, что мне пришлось присвоить свойству window DOM global.window, в противном случае JQuery выдает ошибку (говоря, что требуется глобальный объект окна).Почему это требуется?

// Create DOM from HTML
const JSDOM = require('jsdom').JSDOM;
const jsDom = new JSDOM('<html>...</html>')

// Set up JQuery
const { window } = jsDom;
const { document } = window;
global.window = window;
const $ = global.jQuery = require('jquery');

// Scrape content
const tbl = $(document)
  .find('#table-id')
  .find('tr').each(function() {
    // Do something with $(this).html()
  })

Кроме того, я часто видел это: const $ = global.jQuery = require('jquery'); Почему global.jQuery требуется?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы можете просто сделать это:

const jsDom = new JSDOM('<html>...</html>');
const $ = global.jQuery = (require('jquery'))(jsDom.window);
0 голосов
/ 01 октября 2018

jQuery ожидает запуска в браузере.В браузере window присутствует в глобальном пространстве, и jQuery использует его для некоторых своих функций.В Node.js ваш код выполняется в области, созданной для файла, который его содержит.Даже если вы не думаете о нем как о модуле , Node.js не делает различий во всех ваших constlet) объявлениях на верхнем уровне вашего файла, объявляющих переменные, которыеотносятся к вашему файлу.Поэтому const { window } = jsDom; не помещает window в глобальное пространство и не доступно для jQuery.

При запуске jQuery в узле у вас есть два варианта:

  1. Делайте то, что вы делаете: сначала выставьте window в глобальное пространство, затем загрузите jQuery.Это прекрасно работает.

  2. Вместо этого вы можете сделать это:

    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 в глобальном пространстве поддерживало библиотеки, которые зависят от него.

...