
Библиотека jQuery — это общепризнанное средство манипуляции сразу несколькими форматами данных (XML, HTML, объекты DOM, обыкновенные объекты), да притом работающее посредством удобного (цепного) вызова методов с удобными (краткими) названиями. Поэтому ничуть не удивляют попытки приспособить jQuery не только к одному клиентскому, но также ещё и к серверному джаваскрипту — в частности, к Node.js.
Признаюсь честно, что когда разработчики jQuery превозмогли
проблему №7102, то её название («Register jQuery as a CommonJS async module»)
на какое-то время даже заставило меня обмануться: я сперва подумал было, что и в Node.js (так как модули Node.js и СommonJS имеют немало общего) отныне jQuery станет работать невозбранно. Ан нет,
не тут-то было. Пристальное вглядывание
в коммит и в запрос на слияние позволяет осознать, что jQuery, в сущности, обрёл возможность регистрироваться только
как AMD-модуль и даже проверяет свойства
define.amd и define.amd.jQuery перед саморегистрацией.

Собственно говоря, архитектура jQuery «затóчена» под употребление в условиях браузерной DOM: код jQuery полагается на существование объекта
window, который служит аргументом главного замыкания, окаймляющего весь код jQuery. Прежде же таких неявных предположений было ещё больше, и только с устранением
проблемы №6690 библиотека jQuery перестала полагаться на существование глобальных объектов
navigator и location, начав вместо того получать их как свойства объекта
window. (Понятно, что такое предположение никак не подходило для Node.js, где глобальные объекты служат свойствами объекта
global, а вовсе не
window; а равно не подходило и ко многим прочим реализациям CommonJS.)
Потому для запуска jQuery
в Node.js применяются готовые реализации
браузерной DOM — такие, как пакет
jsdom, на основе которого невозбранно работает, например, вот какой код, предлагаемый в качестве примера:
// Print all of the news items on hackernews
var jsdom = require('jsdom');
var fs = require('fs');
var jquery = fs.readFileSync("./jquery-1.6.2.min.js").toString();
jsdom.env({
html: 'http://news.ycombinator.com/',
src: [
jquery
],
done: function(errors, window) {
var $ = window.$;
console.log('HN Links');
$('td.title:not(:last) a').each(function() {
console.log(' -', $(this).text());
});
}
});
А на jsdom, в свою очередь, основан пакет
node-jQuery, отличающийся дополнительными обёртками из синтаксического сахара.
Другого метода, другого подхода к этой задаче нет, да пока что и быть не может.