web-dev-qa-db-ja.com

jsdom.envがnode.jsC9で機能しない

だから私は最近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自体を更新しましたが、それでもこの問題が発生します。何が起こっているのか誰か知っていますか?

7
Michael Gee

私は同じ問題に直面していました。ウェブ全体で解決策を探していました。 jsdomはv10以降にいくつかの機能を更新していることが判明しました。そのため、ExpressアプリのNode.js側で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);

.env()はv10以降非推奨になりました。これがあなたやこれらのタイプの問題に直面している人に役立つことを願っています。

21
Plabon Dutta

上記のように、.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グローバルをNode globalに詰め込まないでください

人々がjsdomを使用するときに見られる一般的なアンチパターンは、グローバルをjsdomウィンドウからNode.jsグローバルにコピーしてから、Node.js内でコードを実行しようとすることです。これは非常に悪いので、やるべきではありません。それは、そこでは意味をなさない大量のグローバルで汚染されたある種のハイブリッドフランケン環境でWebブラウザー向けのコードを実行し、コードをjsdomウィンドウに分離することのすべての利点を失います。

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

1
Gal Margalit

ステップ1:npm install jquery

ステップ2:npm install 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!" );
1
johnson tong