jsdom.env 不支持 node.js C9

jsdom.env not working on node.js C9

所以我最近一直在 C9 上使用 Node.js,运行 在 javascript 文件中解决这个问题:

jsdom.env("", function(err, window) {
TypeError: jsdom.env is not a function

这是我的代码:

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

$ = require("jquery")(window);

$.ajax(settings).done(function (response) {
     console.log(response);
  });
});

我更新了所有依赖项以及 Node 本身,但仍然遇到此问题。有谁知道怎么回事?

我遇到了同样的问题。一直在网上寻找解决方案。原来 jsdom 从 v10 开始更新了他们的一些特性。所以,我想在 express 应用程序的 Node.js 端使用 jQuery。 对于那些只是在寻找有关如何在 Node 中包含 jQuery 的答案的人,我想提一下,您需要使用 npm install jsdomjQuery 安装 jsdom npm install jquery。那么:

为了 jQueryNode 工作,需要 window 和文件。由于 Node 中本机不存在这样的 window,因此可以通过 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);

.env() 自 v10 起已弃用。希望这对您或遇到此类问题的任何人有所帮助。

第一步:npm 安装jquery

第 2 步:npm 安装 jsdom

<!-- language: lang-js -->
    //add dummy function to test jquery in Node
    function fn1( value ){ console.log( "fn1 says " + value );}  
function fn2( value ) {console.log( "fn2 says " + value ); return false;}
    var jsdom = require('jsdom');
    const { JSDOM } = jsdom;
    const { window } = new JSDOM();
    const { document } = (new JSDOM('')).window;
    //comment out the line below it create problem
    //global.document = document;
    var $ = jQuery = require('jquery')(window);
    var callbacks = $.Callbacks();
    callbacks.add(fn1);
    callbacks.fire("foo!");
    callbacks.add( fn2 ); 
    callbacks.fire( "fool!" );

如上所述,.env() 已弃用。
使用以下内容:

const { window } = new JSDOM(``, { runScripts: "dangerously" });
const myLibrary = fs.readFileSync("../../whatever.js", { encoding: "utf-8" });

const scriptEl = window.document.createElement("script");
scriptEl.textContent = myLibrary;
window.document.body.appendChild(scriptEl);


关于上面的答案,以及来自 jsdom 文档:
不要将 jsdom 全局变量塞入节点全局变量

A common antipattern we see when people use jsdom is copying globals from a jsdom window onto the Node.js global, and then trying to run the code---intended for a browser---inside Node.js. This is very bad and you should not do it. It runs code intended for the web browser in some kind of hybrid franken-environment polluted with a ton of globals that don't make sense there, and loses all benefits of isolating your code into a jsdom window.

https://github.com/jsdom/jsdom/wiki/Don%27t-stuff-jsdom-globals-onto-the-Node-global