我可以在Node.js中使用jQuery吗?

javascript jquery node.js

331531 观看

19回复

是否可以使用Node.js在服务器端使用jQuery选择器/ DOM操作?

作者: John 的来源 发布者: 2019 年 7 月 23 日

回应 (19)


544

更新(27-Jun-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

是的,您可以使用我创建的名为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

52

在撰写本文时,还有维持的Cheerio

专为服务器设计的核心jQuery的快速,灵活和精益实现。

作者: Alfred 发布者: 29.11.2012 08:54

38

使用jsdom你现在可以。只需在examples目录中查看它们的jquery示例即可。

作者: Benjamin Coe 发布者: 23.08.2010 03:23

33

一个使用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):

node 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

最后:

node 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

运行测试:

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

这是你应该知道开始制作自己的爬虫的基本知识:-)


使用的库

作者: Lucio Paiva 发布者: 11.07.2015 07:36

20

在2016年,事情变得更容易。使用您的控制台将jquery安装到node.js:

npm install jquery

bind it to the variable $ (for example - i am used to it) in your node.js code:

var $ = require("jquery");

do stuff:

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

also works for gulp as it is based on node.js.

作者: low_rents 发布者: 17.11.2016 01:57

18

I believe the answer to this is now yes.
https://github.com/tmpvar/jsdom

var navigator = { userAgent: "node-js" };  
var jQuery = require("./node-jquery").jQueryInit(window, navigator);
作者: rdzah 发布者: 27.04.2010 09:15

11

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

8

jQuery module can be installed using:

npm install jquery

Example:

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);
 });
});

References of jQuery in Node.js** :

作者: SUNDARRAJAN K 发布者: 21.06.2016 07:37

5

You have to get the window using the new JSDOM API.

const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM(`...`);
var $ = require("jquery")(window);
作者: UnchartedWorks 发布者: 24.11.2017 04:54

3

WARNING

Golo Roden所述,这种解决方案并不正确。它只是一个快速修复,帮助人们使用Node应用程序结构运行他们的实际jQuery代码,但它不是Node哲学,因为jQuery仍然在客户端而不是在服务器端运行。我很抱歉给出了错误的答案。


您还可以使用节点渲染Jade并将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();
      });
作者: Timbergus 发布者: 18.04.2013 10:56

3

我的工作代码是:

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

2

首先安装它

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

1

模块jsdom是一个很棒的工具。但是如果你想评估整个页面并在服务器端做一些时髦的东西我建议在他们自己的上下文中运行它们:

vm.runInContext

因此像require/ CommonJSon site 这样的东西不会破坏你的Node进程本身。

你可以在这里找到文档。干杯!

作者: Jakub Oboza 发布者: 29.04.2012 01:07

1

从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

0

不。将浏览器环境移植到节点需要付出相当大的努力。

我正在研究单元测试的另一种方法是创建jQuery的“Mock”版本,它在调用选择器时提供回调。

通过这种方式,您可以在不实际拥有DOM的情况下对jQuery插件进行单元测试。您仍然需要在真实的浏览器中测试以查看您的代码是否在野外工作,但如果您发现浏览器特定的问题,您也可以轻松地“模拟”单元测试中的代码。

一旦它准备好显示,我会把东西推到github.com/felixge。

作者: Felix Geisendörfer 发布者: 14.03.2010 10:29

0

你可以使用Electron,它允许混合browserjs和nodejs。

以前,我尝试在nodejs中使用canvas2d,但最后我放弃了。nodejs默认不支持它,并且很难安装它(许多...依赖)。在我使用Electron之前,我可以轻松使用我以前的所有browserjs代码,甚至是WebGL,并将结果值(例如结果base64图像数据)传递给nodejs代码。

作者: gonnavis 发布者: 18.10.2017 09:53

-10

从来没听说过。DOM是客户端的东西(jQuery不解析HTML,但是DOM)。

以下是一些当前的Node.js项目:

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

SimonW的djangode非常酷......

作者: Nosredna 发布者: 26.11.2009 02:02

-18

另一种方法是使用Underscore.js。它应该从JQuery提供你可能想要的服务器端。

作者: John Wright 发布者: 08.02.2010 06:46
32x32