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


当前回答

更新(6月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);

注意:原来的答案没有提到你也需要使用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);
});

其他回答

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

之前,我尝试在nodejs中使用canvas2d,但最后我放弃了。它不被nodejs默认支持,并且很难安装它(很多很多…dependeces)。 直到我使用电子,我可以很容易地使用所有我以前的browserjs代码,甚至WebGL,并传递结果值(例如。结果base64图像数据)到nodejs代码。

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。

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

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

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

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

警告

这个解决方案,正如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();
      });

我相信这个问题的答案是肯定的。 https://github.com/tmpvar/jsdom

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