Можно ли использовать jQuery с Node.js?

Можно ли использовать селектор jQuery/DOM на стороне сервера с помощью Node.js?

Ответ 1

Обновление (27 июня 18). Похоже, что в jsdom произошло серьезное обновление, из-за которого оригинальный ответ больше не работает. Я нашел этот ответ, который объясняет, как использовать jsdom сейчас. Я скопировал соответствующий код ниже.

var jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.document = document;

var $ = jQuery = require('jquery')(window);

Примечание. В первоначальном ответе не упоминается, что вам также потребуется установить jsdom с помощью npm install jsdom

Обновление (конец 2013 года): Официальная команда jQuery наконец-то взяла на себя управление пакетом jquery на npm:

npm install jquery

Затем:

require("jsdom").env("", function (err, window) {
    if (err) {
        console.error(err);
        return;
    }
    var $ = require("jquery")(window);
});

Ответ 2

Да, вы можете, используя созданную мной библиотеку под названием nodeQuery

var Express = require('express')
    , dnode = require('dnode')
    , nQuery = require('nodeQuery')
    , express = Express.createServer();

var app = function ($) {
    $.on('ready', function () {
        // do some stuff to the dom in real-time
        $('body').append('Hello World');
        $('body').append('<input type="text" />');
        $('input').live('click', function () {
            console.log('input clicked');
            // ...
        });
    });
};

nQuery
    .use(app);

express
    .use(nQuery.middleware)
    .use(Express.static(__dirname + '/public'))
    .listen(3000);

dnode(nQuery.middleware).listen(express);

Ответ 3

На момент написания также есть поддерживаемый Cheerio.

Быстрая, гибкая и бережливая реализация ядра jQuery специально для сервера.

Ответ 4

Используя jsdom, вы теперь можете. Посмотрите их пример jquery в каталоге примеров.

Ответ 5

Простой сканер с использованием Cheerio

Это моя формула, чтобы сделать простой искатель в Node.js. Это основная причина желания манипулировать DOM на стороне сервера и, вероятно, это причина, по которой вы здесь.

Сначала используйте request, чтобы загрузить страницу, подлежащую анализу. Когда загрузка будет завершена, обработайте ее cheerio и начните манипуляции с DOM так же, как с помощью jQuery.

Рабочий пример:

var
    request = require('request'),
    cheerio = require('cheerio');

function parse(url) {
    request(url, function (error, response, body) {
        var
            $ = cheerio.load(body);

        $('.question-summary .question-hyperlink').each(function () {
            console.info($(this).text());
        });
    })
}

parse('http://stackoverflow.com/');

В этом примере будет отображаться на консоли все главные вопросы, отображаемые на домашней странице SO. Вот почему я люблю Node.js и его сообщество. Это не могло быть проще: -)

Установить зависимости:

npm запрос на установку cheerio

И запустите (если script выше в файле crawler.js):

node crawler.js


Кодировка

Некоторые страницы будут иметь не-английский контент в определенной кодировке, и вам нужно будет декодировать его до UTF-8. Например, страница на бразильском португальском языке (или любой другой язык латинского происхождения), скорее всего, будет закодирована в ISO-8859-1 (a.k.a. "latin1" ). Когда требуется декодирование, я предлагаю request не интерпретировать контент каким-либо образом и вместо этого использовать iconv-lite для выполнения задания.

Рабочий пример:

var
    request = require('request'),
    iconv = require('iconv-lite'),
    cheerio = require('cheerio');

var
    PAGE_ENCODING = 'utf-8'; // change to match page encoding

function parse(url) {
    request({
        url: url,
        encoding: null  // do not interpret content yet
    }, function (error, response, body) {
        var
            $ = cheerio.load(iconv.decode(body, PAGE_ENCODING));

        $('.question-summary .question-hyperlink').each(function () {
            console.info($(this).text());
        });
    })
}

parse('http://stackoverflow.com/');

Перед запуском установите зависимости:

npm запрос на установку iconv-lite cheerio

И наконец:

node crawler.js


Следующие ссылки

Следующим шагом будет следовать ссылкам. Скажем, вы хотите перечислить все плакаты с каждого верхнего вопроса на SO. Вы должны сначала перечислить все главные вопросы (пример выше), а затем ввести каждую ссылку, разобрав каждую страницу вопросов, чтобы получить список вовлеченных пользователей.

Когда вы начнете следовать ссылкам, начнется callback hell. Чтобы этого избежать, вы должны использовать какой-то promises, фьючерс или что-то еще. Я всегда держу async в своем наборе инструментов. Итак, вот полный пример искателя с использованием async:

var
    url = require('url'),
    request = require('request'),
    async = require('async'),
    cheerio = require('cheerio');

var
    baseUrl = 'http://stackoverflow.com/';

// Gets a page and returns a callback with a $ object
function getPage(url, parseFn) {
    request({
        url: url
    }, function (error, response, body) {
        parseFn(cheerio.load(body))
    });
}

getPage(baseUrl, function ($) {
    var
        questions;

    // Get list of questions
    questions = $('.question-summary .question-hyperlink').map(function () {
        return {
            title: $(this).text(),
            url: url.resolve(baseUrl, $(this).attr('href'))
        };
    }).get().slice(0, 5); // limit to the top 5 questions

    // For each question
    async.map(questions, function (question, questionDone) {

        getPage(question.url, function ($$) {

            // Get list of users
            question.users = $$('.post-signature .user-details a').map(function () {
                return $$(this).text();
            }).get();

            questionDone(null, question);
        });

    }, function (err, questionsWithPosters) {

        // This function is called by async when all questions have been parsed

        questionsWithPosters.forEach(function (question) {

            // Prints each question along with its user list
            console.info(question.title);
            question.users.forEach(function (user) {
                console.info('\t%s', user);
            });
        });
    });
});

Перед запуском:

npm запрос на установку async cheerio

Запустите тест:

node crawler.js

Пример вывода:

Is it possible to pause a Docker image build?
    conradk
    Thomasleveil
PHP Image Crop Issue
    Elyor
    Houston Molinar
Add two object in rails
    user1670773
    Makoto
    max
Asymmetric encryption discrepancy - Android vs Java
    Cookie Monster
    Wand Maker
Objective-C: Adding 10 seconds to timer in SpriteKit
    Christian K Rider

И что основное, что вы должны знать, чтобы начать создавать собственные сканеры: -)


Используемые библиотеки

Ответ 6

в 2016 году все проще. установите jquery на node.js с помощью консоли:

npm install jquery

привяжите его к переменной $ (например, я привык к ней) в вашем node.js-коде:

var $ = require("jquery");

сделай материал:

$.ajax({
    url: 'gimme_json.php',
    dataType: 'json',
    method: 'GET',
    data: { "now" : true }
});

также работает для gulp, поскольку он основан на node.js.

Ответ 7

Я считаю, что ответ на этот вопрос теперь да.
https://github.com/tmpvar/jsdom

var navigator = { userAgent: "node-js" };  
var jQuery = require("./node-jquery").jQueryInit(window, navigator);

Ответ 8

npm install jquery --save #note ВСЕ LOWERCASE

npm install jsdom --save

const jsdom = require("jsdom");
const dom = new jsdom.JSDOM(`<!DOCTYPE html>`);
var $ = require("jquery")(dom.window);


$.getJSON('https://api.github.com/users/nhambayi',function(data) {
  console.log(data);
});

Ответ 9

Модуль jQuery можно установить с помощью:

npm install jquery

Пример:

var $ = require('jquery');
var http = require('http');

var options = {
    host: 'jquery.com',
    port: 80,
    path: '/'
};

var html = '';
http.get(options, function(res) {
res.on('data', function(data) {
    // collect the data chunks to the variable named "html"
    html += data;
}).on('end', function() {
    // the whole of webpage data has been collected. parsing time!
    var title = $(html).find('title').text();
    console.log(title);
 });
});

Ссылки jQuery в Node.js **:

Ответ 10

Вы должны получить окно, используя новый API JSDOM.

const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM('...');
var $ = require("jquery")(window);

Ответ 11

Внимание

Это решение, упомянутое Голо Роденом, неверно. Это просто быстрое решение, чтобы помочь людям иметь свой фактический код jQuery, работающий с использованием структуры приложения Node, но это не философия Node, потому что jQuery все еще работает на стороне клиента, а не на стороне сервера. Прошу прощения за неправильный ответ.


Вы также можете отобразить Jade с помощью Node и поместить код jQuery внутри. Вот код нефритового файла:

!!! 5
html(lang="en")
  head
    title Holamundo!
    script(type='text/javascript', src='http://code.jquery.com/jquery-1.9.1.js')
  body
    h1#headTitle Hello, World
    p#content This is an example of Jade.
    script
      $('#headTitle').click(function() {
        $(this).hide();
      });
      $('#content').click(function() {
        $(this).hide();
      });

Ответ 12

Мой рабочий код:

npm install jquery

а затем:

global.jQuery   = require('jquery');
global.$        = global.jQuery;

или если окно присутствует, то:

typeof window !== "undefined" ? window : this;
window.jQuery   = require('jquery');
window.$        = window.jQuery;

Ответ 13

Прежде всего установите его

npm install jquery -S

После установки вы можете использовать его, как показано ниже

import $ from 'jquery';
window.jQuery = window.$ = $;
$(selector).hide();

Вы можете проверить полный учебник здесь: https://medium.com/fbdevclagos/how-to-use-jquery-on-node-df731bd6abc7

Ответ 14

Модуль jsdom - отличный инструмент. Но если вы хотите оценить целые страницы и сделать некоторые напуганные вещи на стороне сервера, я предлагаю запустить их в своем собственном контексте:

vm.runInContext

Таким образом, такие вещи, как require/CommonJS на сайте, не будут удалять ваш процесс Node.

Здесь вы можете найти документацию здесь. Ура!

Ответ 15

Начиная с jsdom v10, функция .env() устарела. Я сделал это, как показано ниже, после того, как многие вещи требовали jquery:

var jsdom = require('jsdom');
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.document = document;

var $ = jQuery = require('jquery')(window);

Ответ 16

Нет. Для переноса среды браузера на node потребуется большое усилие.

Другим подходом, который я сейчас изучаю для модульного тестирования, является создание "Mock" версии jQuery, которая обеспечивает обратные вызовы всякий раз, когда вызывается селектор.

Таким образом вы могли бы unit test ваши плагины jQuery, не имея фактически DOM. Вам все равно придется протестировать в реальных браузерах, чтобы увидеть, работает ли ваш код в дикой природе, но если вы обнаружите специфические проблемы браузера, вы можете легко "высмеять" те, что и в ваших модульных тестах.

Я вытащу что-то в github.com/felixge, когда он будет готов показать.

Ответ 17

Вы можете использовать Electron, он позволяет использовать гибридные браузеры и узлы.

Раньше я пытался использовать canvas2d в nodejs, но, в конце концов, я сдался. Он не поддерживается nodejs по умолчанию, и слишком сложно его установить (многие многие... dependeces). Пока я не пользуюсь Electron, я могу легко использовать весь мой предыдущий код browserjs, даже WebGL, и передать значение результата (например, данные результата base64) в код nodejs.

Ответ 18

Ни одно из этих решений не помогло мне в моем приложении "Электрон".

Мое решение (обходной путь):

npm install jquery

В вашем файле index.js:

var jQuery = $ = require('jquery');

В своих файлах .js напишите свои функции jQuery следующим образом:

jQuery(document).ready(function() {

Ответ 19

Да, jQuery можно использовать с Node.js.

Шаги по включению jQuery в проект узла: -

npm i jquery --save Включить jquery в коды

import jQuery from 'jquery';

const $ = jQuery;

Я все время использую jquery в проектах node.js, особенно в проекте расширения chrome.

например https://github.com/fxnoob/gesture-control-chrome-extension/blob/master/src/default_plugins/tab.js

Ответ 21

Альтернативой является использование Underscore.js. Он должен предоставить то, что вам может потребоваться на стороне сервера из JQuery.