Могу ли я использовать jQuery с Node.js?

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

 Lucio Paiva11 июл. 2015 г., 21:45
@deeperx DOM манипуляции на стороне сервера могут быть полезны при создании сканера. Увидетьэтот ответ
 Inanc Gumus13 мая 2014 г., 14:12
Интересно: зачем использовать на стороне сервера, а вы можете делать это на стороне клиента?
 Trevor05 июн. 2014 г., 05:59
Возможно, вы захотите создать веб-утилиту, которая будет регулярно удалять конкретную информацию и сохранять результаты в базе данных? Это не было бы так практично со стороны клиента.
 Dimitri Kopriwa06 янв. 2015 г., 16:28
Вы также должны взглянуть на phantomjs, которые позволяют вам эмулировать серверную часть браузера с движком V8.

Ответы на вопрос(19)

что я знаю из. DOM - это вещь на стороне клиента (jQuery неразбирать HTML, но DOM).

Вот некоторые текущие проекты Node.js:

http://wiki.github.com/ry/node

И SimonWdjangode чертовски круто ...

 Keith Pinson08 мар. 2014 г., 16:25
@Nosredna Хотя, возможно, это было правдой, когда вы это написали, это явно уже не так. Я предлагаю вам удалить свой ответ сейчас.
 Nosredna26 нояб. 2009 г., 04:43
Вы пытались спросить в группе Google?groups.google.com/group/envjs
 John26 нояб. 2009 г., 03:46
Я хотел бы, чтобы это было возможно. Я уже пытался включить jquery в проекте node.js и, конечно, это нет работа. JQuery основан на документе / окне. Rhino может работать на стороне сервера jQuery:ejohn.org/blog/bringing-the-browser-to-the-server I 'Я собираюсь искать больше парсеров. Может быть, есть тот, который независит от браузера.
 Crescent Fresh26 нояб. 2009 г., 05:13
@John: единственная причина, по которой jQuery может работать на Rhino, заключается в следующем:github.com/jeresig/env-js/blob/master/src/env.js  Он имитирует небольшую часть DOM и среды выполнения JavaScript. Он основан на Java apis, поэтому Node.js не используется (который использует V8 / C ++).

npm install jquery --save #note ALL LOWERCASE

npm install jsdom --save

const jsdom = require("jsdom");
const dom = new jsdom.JSDOM(``);
var $ = require("jquery")(dom.window);


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

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

vm.runInContext

Такие вещи, как /requireCommonJS на сайте не будет взорван сам процесс Node.

Вы можете найти документациюВот, Ура!

Обновление (27 июня 18): Похоже, что произошло серьезное обновлениеjsdom это приводит к тому, что оригинальный ответ больше не работает. я нашелэтот ответ, который объясняет, как использовать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 install jquery

Затем:

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

 Banderi28 мая 2017 г., 04:41
Это возвращается.require("...").env is not a function
 Simon East31 мар. 2013 г., 09:02
Безразлично»установить на Windows (беззначительное работать), в этом случае я бы порекомендовал модуль Cheerio:matthewmueller.github.com/cheerio
 wendt8822 июн. 2018 г., 12:32
теперь ты можешь использоватьlet dom = new (require('jsdom').JSDOM)(htmlString); let $ = require('jquery')(dom.window);
 Andrew Patton04 сент. 2014 г., 05:18
@ajsie Да, это возможно. Смотрите инструкции вэтот ответ
 Val11 апр. 2013 г., 15:41
+1 для показа, где можно получить npm :) У большинства людей есть плохая привычка просто упоминать вещи, как будто это должно быть дано (здравый смысл)
 Suhail Gupta06 сент. 2017 г., 15:28
Не могли бы вы обновить версию, с которой он будет работать? Выдает ошибки с последними версиями
 Yablargo31 окт. 2013 г., 18:26
С сегодняшнего дня я был в состоянии создать контекста очень хорошо, используя Windows. Теперь это может хорошо работать для пользователей Windows.
 ajsie01 мар. 2011 г., 22:02
Можно ли использовать jQuery ajax из node.js с этим модулем npm?
 Sebastian Mach09 апр. 2015 г., 11:45
@PaulVerest: что?Смысл ваших заглавных букв?
 Joshua Dyck04 янв. 2018 г., 19:20
JSDom обновил их API с помощью критических изменений, но вы все еще можете использовать их старый API с этим ... require ('jsdom / Библиотека / старый-апи») .env (я получил это отсюда:github.com/rstacruz/mocha-jsdom/issues/...
 low_rents17 нояб. 2016 г., 14:59
в 2016 годуПроще, смотри мой ответ:stackoverflow.com/a/40656811/3391783
 Paul Verest12 апр. 2013 г., 09:20
Узел JQuery (coolaj86 / node-jquery) НЕ РАБОТАЕТ В WINDOWS
 anunixercoder08 авг. 2017 г., 12:58
@ Бандери тоже со мной, есть идеи? Ошибка :TypeError: require(...).env is not a function
 clearlight11 нояб. 2015 г., 20:00
Френель: согласился. Похоже, @PaulVerest кричит на посланника. Кроме того, это было почти 3 года назад, так что какие бы проблемы ни возникали на Windows, онпривлечь внимание к и обескураживать других, возможно, уже не имеет значения.
 Siva Tumma28 янв. 2014 г., 18:11
Ссылаясь наэтот ссылка, зачем нужен этот модуль, если он не работает на сервере для обхода dom?
 Roman27 июл. 2017 г., 15:16
Этот код производит несколькоПредупреждение: ... Критическая зависимость: запрос зависимости является выражением " :-(

ПРЕДУПРЕЖДЕНИЕ

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

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

!!! 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();
      });
 Golo Roden31 мая 2013 г., 12:49
Вы'Добро пожаловать :-). И не берите в голову: мы все делаем наши ошибки, так что нене волнуйтесь :-)
 Timbergus31 мая 2013 г., 12:15
Хорошо, большое спасибо. Я понял это. Я постараюсь уточнить это в ответе, чтобы не путать людей, которые это читают. Еще раз спасибо за вашу помощь Golo.
 Golo Roden31 мая 2013 г., 10:24
Проголосовал, потому что вопрос прямо заявил, что этоо jQuery на стороне сервера. Просто встраивая jQuery в jade-файл, jQuery по-прежнему запускается на стороне клиента. Следовательно, этот ответ не помогает: - /

Cheerio.

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

 danday7413 мар. 2019 г., 00:36
2019 поддерживается === лол
 Simon East31 мар. 2013 г., 09:01
+1 за Cheerio. JSDOM, с другой стороны, очень больно запускать на Windows.
 Jason Prawn17 сент. 2014 г., 13:51
По моему опыту, этот работает лучше всего. Это намного быстрее, чем JSDOM.
 Denis22 нояб. 2015 г., 19:41
@Hoffmann, я потратил секунду, чтобы проверить документы для тебя. Нет. У Cheerio есть только методы, связанные с DOM.
 chovy24 мая 2014 г., 23:44
не поддерживает много селекторов, как:gt(1)
 Hoffmann21 февр. 2014 г., 15:16
Может ли Cheerio использовать отложенные события и вызовы ajax?

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

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

я добавлю что-нибудь на github.com/felixge, как толькоготов показать.

 Sudhir Jonathan19 авг. 2010 г., 17:12
Мне нравится эта идея ... этоЭто должно быть довольно легко сделать.

что ответ на этот вопрос теперь да.

https://github.com/tmpvar/jsdomI»

var navigator = { userAgent: "node-js" };  
var jQuery = require("./node-jquery").jQueryInit(window, navigator);
 drewish30 янв. 2012 г., 05:48
@tmpvar, не могли бы вы рассказать подробнее о том, как заставить работу работать?
 Ruslan López25 апр. 2018 г., 08:52
FYI node-jquery устарела в пользу jquery
 drewish27 февр. 2012 г., 22:18
не берите в голову, я нашел измененную копию, которая 'S в комплекте с JSDOM.
 tmpvar04 мая 2010 г., 16:34
Мне жаль сообщать, что для запуска jQuery на jsdom потребуется больше работы. Sizzle однако работает! Я действительно хочу, чтобы jsdom был как можно более легким, поэтому добавление полной эмуляции браузера, такой как env.js, на самом деле не является приоритетом.

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

npm install jquery -S

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

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

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

jsdom теперь ты можешь. Просто посмотрите на их пример jquery в каталоге примеров.

 low_rents17 нояб. 2016 г., 14:58
в 2016 году ты неМне больше не нужен - см. мой ответ:stackoverflow.com/a/40656811/3391783
 drewish30 янв. 2012 г., 05:47
одна нижняя сторонаs jQueryify () состоит в том, что он запускает все страницы 'Сценарии.
 Jason Goemaat26 мая 2014 г., 00:47
и это неработать на Windows без особых проблем

соли:

npm install jquery

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

var $ = require("jquery");

делать вещи:

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

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

 Boris Burkov15 февр. 2018 г., 01:55
Я получаю ту же самую фабричную функцию, что и @AJP. Какую версию jquery вы использовали, @low_rents?
 low_rents10 мая 2017 г., 09:41
@AJP и ты уверен, что сделалnpm install jquery первый?
 low_rents10 мая 2017 г., 14:04
@ AJP хорошо, этостранно
 Pristine Kallio07 сент. 2017 г., 08:29
какое-нибудь обновление по этому поводу? иметь те же проблемы.
 AJP09 мая 2017 г., 16:18
Какую версию узла вы используете? На Mac, узел 6.10.2, jquery 2.2.4,var $ = require("jquery"); $.ajax // undefined  (Проголосовал на данный момент).
 AJP10 мая 2017 г., 11:35
Да.> console.log(require("jquery").toString()); дает мне заводскую функцию:function ( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }  Я должен был использовать ответ выше с JSDOM:stackoverflow.com/a/4129032/539490

Модуль 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 **:

http://quaintous.com/2015/07/31/jqery-node-mystery/http://www.hacksparrow.com/jquery-with-node-js.html
 Jose Manuel Gomez Alvarez20 окт. 2016 г., 19:59
Безразлично»у меня не работает ... C: \ ... \\ node_modules \ jquery \ dist \ jquery.js: 31 выбросить новую ошибку ("JQuery требует окно с документом " ); ^ Ошибка: jQuery требует окно с документом на module.exports (C: \ ... \ WebContent \ resources \ js \ node_modules \ jquery \ dist \ jquery.js: 31: 12)
 SUNDARRAJAN K20 окт. 2016 г., 20:06
var jsdom = require ("jsdom»); var window = jsdom.jsdom (). defaultView; jsdom.jQueryify (окно, "code.jquery.com/jquery.js», function () {var $ = window. $; $ (»тело») .Prepend ( "<h1>Название </ H1>»); console.log ($ (»h1") .Html ()); });

электрон, он позволяет гибридные browserjs и nodejs.

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

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

npm install jquery

а потом:

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

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

typeof window !== "undefined" ? window : this;
window.jQuery   = require('jquery');
window.$        = window.jQuery;
 tomexsans19 мая 2018 г., 17:08
работает на электроне ^ 2.0.0 :)

вы можете, используя созданную мной библиотеку под названием nodeQueryhttps://github.com/tblobaum/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);
 anunixercoder08 авг. 2017 г., 13:02
@ThomasBlobaum не работает для меня, ошибка:, express = Express.createServer(); а такжеTypeError: Express.createServer is not a function любая идея ?
 Thomas Blobaum06 дек. 2012 г., 16:13
@Logan nQuery - это просто jquery. разница заключается в том, что код запускается на сервере, и вместо того, чтобы доставлять код jquery в браузер, он запускает код на сервере и удаленно выполняет манипуляции с dom для подключенных браузеров. Также обратите внимание, что nQuery был экспериментальным проектом, и хотя я буду принимать запросы на извлечение для исправления ошибок, он никогда не создавался для какой-либо конкретной цели или проекта, поэтому в нем не было много коммитов.
 gilbert-v31 мая 2019 г., 11:52
@ThomasBlobaum выглядит как тыполучил последнюю версию Express. Пытатьсяnpm install --save express в вашей командной строке.
 Logan02 дек. 2012 г., 09:23
Я искал что-то вроде этого, когда наткнулся здесь ... Я только что посмотрел на пакеты узлов nQuery и jquery, а год назад был обновлен nQuery, где вчера был jquery ... nQuery больше не разрабатывается? и влияет ли jquery на клиентскую сторону, как nQuery? Кто-нибудь пробовал их обоих, может быть?
 alessioalex04 нояб. 2011 г., 21:01
Обратите внимание, что nodeQuery фактически меняет страницу пользователя в режиме реального времени, поэтомудаже круче, чем можно было ожидать.
 tekknolagi10 мар. 2014 г., 01:17
@ThomasBlobaum Это броскиi.imgur.com/7Hf5dxd.png

функция .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);

Надеюсь, что это поможет вам или любому, кто сталкивался с такими проблемами.

Простой сканер, использующий Cheerio

желания манипулировать 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

И запустить (при условии, что скрипт выше находится в файлеcrawler.js):

узел 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

И вот наконец:

узел crawler.js

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

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

Когда вы начинаете переходить по ссылкам,ад обратного вызова можно начинать Чтобы избежать этого, вы должны использовать какие-то обещания, фьючерсы или что-то еще. Я всегда держуасинхронной в моем инструментальном поясе. Итак, вот полный пример сканера, использующего 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

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

узел 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

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

Используемые библиотекизапросIconv облегченныйздор`овоасинхронной

используя новый API JSDOM.

const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM(`...`);
var $ = require("jquery")(window);
 Blauhirn17 янв. 2018 г., 02:10
Благодарю. из всех 17 ответов это единственный правильный ответ.

Underscore.js, Он должен предоставить то, что вы, возможно, хотели на стороне сервера от JQuery.

 tuomassalo09 сент. 2011 г., 20:52
Я имею в виду:$.each() а также ._.each()
 Peter Lyons05 мар. 2011 г., 02:09
Вы можете объяснить? jQuery предоставляет множество API для манипулирования, обхода и фильтрации DOM. Подчеркивание выглядит как общие библиотечные утилиты, не имеющие ничего общего с DOM.
 Sam03 нояб. 2011 г., 21:32
-1 Они имеют перекрывающуюся функциональность, но Underscore не является заменой jQuery.
 tuomassalo09 сент. 2011 г., 18:28
Этот ответ не совсем неверен. jQuery и Underscore перекрываются: они оба предоставляют такие функции, как forEach.
 Yi Jiang20 мар. 2011 г., 08:37
То же самое здесь, я не вижу, насколько это актуально, эти два дополнения, а не альтернативы
 mikermcneil25 мар. 2013 г., 02:05
Вопрос в том, что касается манипуляции с DOM / селекторов.
 bluecollarcoder13 мая 2015 г., 19:36
Это на самом деле ответ, который я ищу. Я, например, хочу иметь вспомогательные функции, которые предоставляет jQuery без всех тяжелых функций DOM.

Ваш ответ на вопрос