ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我想知道:为什么在服务器端使用,而您可以在客户端使用?
也许您可能想创建一个网络抓取工具,定期抓取特定信息并将结果存储在数据库中?从客户端来看,这并不实用。
您还应该看看 phantomjs,它允许您使用 V8 引擎模拟浏览器服务器端。
在制作爬虫时,服务器端的@deeperx DOM 操作可能很有用。请参阅this answer
是的——看看this answer——我更喜欢这个而不是使用cheerio,因为你可以获得jQuery选择器的全部功能。

H
Hill

更新(2018 年 6 月 27 日):似乎对 jsdom 进行了重大更新,导致原始答案不再有效。我找到了解释如何使用 jsdom 现在的 this 答案。我已经复制了下面的相关代码。

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

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

注意: 原始答案没有提到您还需要使用 npm install jsdom 安装 jsdom

更新(2013 年末):官方 jQuery 团队终于接管了 npm 上 jquery 包的管理:

npm install jquery

然后:

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


是否可以将 node.js 中的 jQuery ajax 与该 npm 模块一起使用?
不能在 Windows 上安装(没有 重要 工作),在这种情况下我会推荐 Cheerio 模块:matthewmueller.github.com/cheerio
截至今天,我能够使用 Windows 很好地构建 contextify。这对于现在的 Windows 用户来说可能工作得很好。
这将返回 require("...").env is not a function
我们应该在哪里添加代码 index.js ?
T
Tien Duong

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

请注意,nodeQuery 实际上是在实时更改用户的页面,因此它比人们想象的还要酷。
当我偶然发现这里时,我正在搜索类似的东西......我刚刚查看了 nQuery 和 jquery 节点包,并且 nQuery 在一年前更新了 jquery 昨天...... nQuery 不再开发了吗? jquery 会像 nQuery 那样影响客户端吗?有没有人尝试过它们?
@Logan nQuery 基本上只是 jquery。不同之处在于代码在服务器上运行,而不是将 jquery 代码传递给浏览器,它在服务器上运行代码并对连接的浏览器远程执行 dom 操作。另请注意,nQuery 是一个实验性项目,虽然我会接受拉取请求以修复错误,但它从未为任何特定目的或项目创建,因此它没有很多提交
@ThomasBlobaum 不适合我,错误:, express = Express.createServer();TypeError: Express.createServer is not a function 知道吗?
@ThomasBlobaum 看起来您还没有获得最新版本的 Express。在命令提示符中尝试 npm install --save express
A
Alfred

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

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


Cheerio 可以使用延迟事件和 ajax 调用吗?
不支持很多选择器,例如 :gt(1)
根据我的经验,这个效果最好。它比 JSDOM 快很多。
@Hoffmann,我花了一秒钟为您检查文档。不,不是的。 Cheerio 只有 DOM 相关的方法。
L
Lucio Paiva

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

节点爬虫.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

最后:

节点爬虫.js

以下链接

下一步将是关注链接。假设您想列出 SO 上每个热门问题的所有海报。您必须首先列出所有热门问题(上面的示例),然后输入每个链接,解析每个问题的页面以获取相关用户的列表。

当您开始关注链接时,可以开始 callback hell。为避免这种情况,您应该使用某种承诺、期货或其他方式。我总是把 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 安装请求异步 Cheerio

运行测试:

节点爬虫.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-lite

切里奥

异步


l
low_rents

在 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。


您使用的是什么版本的节点?在 Mac 上,Node 6.10.2、jquery 2.2.4、var $ = require("jquery"); $.ajax // undefined(暂时被否决)。
@AJP,你确定你先做了 npm install jquery 吗?
是的。 > 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
@AJP 好的,这很奇怪。
我得到与@AJP 完全相同的工厂函数。 @low_rents,您使用的是什么版本的 jquery?
M
Matt

我相信现在的答案是肯定的。
https://github.com/tmpvar/jsdom

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

我很遗憾地报告说,要让 jQuery 在 jsdom 上运行需要做更多的工作。然而,嘶嘶声确实有效!我真的想让 jsdom 尽可能地轻量级,因此添加像 env.js 这样的完整浏览器仿真目前并不是真正的优先事项。
没关系,我找到了与 jsdom 捆绑在一起的修改后的副本。
仅供参考 node-jquery 现在已弃用,取而代之的是 jquery
ReferenceError:未定义窗口
E
Edgard Leal

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

m
marc_s

可以使用以下方式安装 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);
 });
});

Node.js** 中 jQuery 的引用:

http://quaintous.com/2015/07/31/jqery-node-mystery/

http://www.hacksparrow.com/jquery-with-node-js.html


对我不起作用... C:\...\\node_modules\jquery\dist\jquery.js:31 throw new Error("jQuery requires a window with a document" ); ^ 错误:jQuery 需要一个带有 module.exports 文档的窗口 (C:\...\WebContent\resources\js\node_modules\jquery\dist\jquery.js:31:12)
var jsdom = 要求(“jsdom”); var window = jsdom.jsdom().defaultView; jsdom.jQueryify(window, "code.jquery.com/jquery.js", function () { var $ = window.$; $("body").prepend("<h1>标题</h1>"); console.log( $("h1").html()); });
a
asp

您必须使用新的 JSDOM API 来获取窗口。

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

.JSDOM(...) 应该是 .JSDOM("<!DOCTYPE html>") 以支持 HTML5?
d
dbc

首先安装它

npm install jquery -S

安装好之后就可以使用了

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

您可以查看我在此处编写的完整教程:https://medium.com/fbdevclagos/how-to-use-jquery-on-node-df731bd6abc7


C
Community

警告

Golo Roden 所述,该解决方案不正确。这只是帮助人们使用 Node 应用程序结构运行他们的实际 jQuery 代码的快速解决方案,但这不是 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();
      });

R
Roman

我的工作代码是:

npm install jquery

接着:

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

或者如果窗口存在,则:

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

E
Elio Osés

这些解决方案都没有帮助我的 Electron App。

我的解决方案(解决方法):

npm install jquery

在您的 index.js 文件中:

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

在您的 .js 文件中以这种方式编写您的 jQuery 函数:

jQuery(document).ready(function() {

h
hexacyanide

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

vm.runInContext

因此,站点上的 require / CommonJS 之类的内容不会破坏您的 Node 进程本身。

您可以找到文档 here。干杯!


P
Plabon Dutta

从 jsdom v10 开始,不推荐使用 .env() 函数。在尝试了很多需要 jquery 的事情之后,我做了如下所示:

var jsdom = 需要('jsdom');常量 { JSDOM } = jsdom;常量 { 窗口 } = 新的 JSDOM(); const { 文档 } = (new JSDOM('')).window; global.document = 文档; var $ = jQuery = require('jquery')(window);

希望这对您或遇到此类问题的任何人有所帮助。


TypeError: JSDOM is not a constructor
如果你在 Node 端运行 jQuery,首先,使用 npm install 安装 jquery 和 jsdom。然后,在您尝试使用 jquery 选择器的文件中添加以上行。例如,我使用了 $.each。我只是包括了这些行,然后像下面这样:$.each(errors, function (ind,error) { res.send(error.msg);console.log(error.msg); });希望这会有所帮助!
不知何故,jsdom 决定根本不安装。我想我还在弄清楚 npm 。谢谢@
f
fxnoob

是的,jQuery 可以与 Node.js 一起使用。

在节点项目中包含 jQuery 的步骤:-

npm i jquery --save 在代码中包含 jquery

import jQuery from 'jquery';

const $ = jQuery;

我确实在 node.js 项目中一直使用 jquery,特别是在 chrome 扩展的项目中。

例如https://github.com/fxnoob/gesture-control-chrome-extension/blob/master/src/default_plugins/tab.js


m
mercury

我手动简单地完成了它,没有任何额外的包或代码。

npm i jquery

然后我将 jquery.min.js 文件从 node_modules/jquery/dist 目录复制到 public/js

<script type='text/javascript' src='/js/jquery.min.js'></script>
<script>
  $(document).ready(function() { console.log( "ready!" ); });
</script>

它会起作用。测试它

注意复制/粘贴文件不是理想的事情,您可以通过将文件启用为静态文件来将文件启用为静态文件,以便 expressJS 可以读取它。但我更容易将其复制到静态公共目录。


F
Felix Geisendörfer

不。将浏览器环境移植到节点将是一项相当大的工作。

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

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

一旦准备好展示,我会将一些内容推送到 github.com/felixge。


我喜欢这个主意……这应该很容易做到。
g
gonnavis

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

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


R
RamC

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

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

https://github.com/ry/node/wiki (https://github.com/nodejs/node)

SimonW 的 djangode 非常酷……


我希望这是可能的。我已经尝试在 node.js 项目中包含 jquery,当然它没有工作。 jQuery 基于文档/窗口。 Rhino 能够运行 jQuery 服务器端:ejohn.org/blog/bringing-the-browser-to-the-server 我将寻找更多的解析器。也许有一个不依赖于浏览器。
@John:jQuery 可以在 Rhino 上运行的唯一原因是因为这个项目:github.com/jeresig/env-js/blob/master/src/env.js 它模拟了一小部分 DOM 和 JavaScript 运行时。它依赖于 Java api,因此不适用于 Node.js(使用 V8/C++)。
@Nosredna 虽然在您编写它时这可能是正确的,但显然不再正确了。我建议你现在删除你的答案。
M
Matt

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


你可以解释吗? jQuery 提供了大量的 DOM 操作/遍历/过滤 API。下划线看起来像是与 DOM 无关的通用库实用程序。
同样在这里,我看不出这有什么关系,这两者是互补的,而不是替代品
这个答案并不完全错误。 jQuery 和 Underscore 确实有重叠:它们都提供了诸如 forEach 之类的特性。
-1 它们具有重叠的功能,但下划线不是 jQuery 替代品。
问题是询问 DOM 操作/选择器。