Вопрос:

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

javascript jquery node.js

331531 просмотра

19 ответа

2727 Репутация автора

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

Автор: John Источник Размещён: 26.11.2009 01:54

Ответы (19)


-10 плюса

60842 Репутация автора

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

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

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

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

Автор: Nosredna Размещён: 26.11.2009 02:02

-18 плюса

1392 Репутация автора

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

Автор: John Wright Размещён: 08.02.2010 06:46

0 плюса

1301 Репутация автора

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

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

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

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

Автор: Felix Geisendörfer Размещён: 14.03.2010 10:29

18 плюса

205 Репутация автора

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

var navigator = { userAgent: "node-js" };  
var jQuery = require("./node-jquery").jQueryInit(window, navigator);
Автор: rdzah Размещён: 27.04.2010 09:15

38 плюса

519 Репутация автора

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

Автор: Benjamin Coe Размещён: 23.08.2010 03:23

544 плюса

6630 Репутация автора

Обновление (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);
});

Автор: Philippe Rathé Размещён: 08.11.2010 11:11

55 плюса

2781 Репутация автора

Да, вы можете, используя созданную мной библиотеку под названием nodeQuery https://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);
Автор: Thomas Blobaum Размещён: 04.11.2011 07:12

1 плюс

4029 Репутация автора

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

vm.runInContext

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

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

Автор: Jakub Oboza Размещён: 29.04.2012 01:07

52 плюса

46327 Репутация автора

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

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

Автор: Alfred Размещён: 29.11.2012 08:54

3 плюса

2598 Репутация автора

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

Это решение, как упомянул Голо Роден , не является правильным . Это просто быстрое решение, помогающее людям запускать свой настоящий код 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();
      });
Автор: Timbergus Размещён: 18.04.2013 10:56

33 плюса

7487 Репутация автора

Простой сканер, использующий 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

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

узел crawler.js


кодирование

Некоторые страницы будут иметь неанглийский контент в определенной кодировке, и вам нужно будет его декодировать UTF-8. Например, страница на бразильском португальском языке (или любом другом языке латинского происхождения), вероятно, будет закодирована в ISO-8859-1(иначе, как «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

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


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

Автор: Lucio Paiva Размещён: 11.07.2015 07:36

8 плюса

1632 Репутация автора

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

Автор: SUNDARRAJAN K Размещён: 21.06.2016 07:37

20 плюса

3593 Репутация автора

в 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.

Автор: low_rents Размещён: 17.11.2016 01:57

11 плюса

351 Репутация автора

npm install jquery --save #note ALL 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);
});
Автор: Noah Размещён: 13.06.2017 12:07

3 плюса

4085 Репутация автора

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

npm install jquery

а потом:

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

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

typeof window !== "undefined" ? window : this;
window.jQuery   = require('jquery');
window.$        = window.jQuery;
Автор: Roman Размещён: 27.07.2017 12:08

0 плюса

104 Репутация автора

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

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

Автор: gonnavis Размещён: 18.10.2017 09:53

5 плюса

1724 Репутация автора

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

const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM(`...`);
var $ = require("jquery")(window);
Автор: UnchartedWorks Размещён: 24.11.2017 04:54

1 плюс

780 Репутация автора

Начиная с 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);

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

Автор: Plabon Dutta Размещён: 01.02.2018 11:19

2 плюса

61 Репутация автора

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

npm install jquery -S

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

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

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

Автор: Oyetoke Tobi Размещён: 25.01.2019 09:11
Вопросы из категории :
32x32