1. ホーム
  2. javascript

[解決済み] ReferenceError : window is not defined at object. <匿名希望> Node.js

2022-03-04 17:16:59

質問

ここで似たような質問を見かけましたが、私の状況と一致するものはありません。私のウェブでは、3つの JavaScript ファイルです。 client.js , server.js , myModule.js . で client.js というウィンドウ変数を作成します。 windowVar そして、それにいくつかの属性を追加しています。で myModule.js 他の属性を追加してそれを使用し、そのファイルをエクスポートして server.js .

client.js :

window.windowVar= {
    func1: function(args) {    
       //some sode here
    },
    counter:0
};

myModule.js :

module.exports={wVar:windowVar, addMessage ,getMessages, deleteMessage};

windowVar.serverCounter = 0;
windowVar.arr1=[];

server.js :

var m= require('./myModule');

をnode.jsで実行すると、以下のエラーが発生します。

ReferenceError : window is not defined at object. <anonymous>

windowはブラウザのプロパティだと理解していますが、この場合、どのようにエラーを解決すればいいのでしょうか?何かご助言がありましたら、お願いします。

解決方法は?

window はブラウザのもので、Node.jsには存在しないが、ES2020で導入された globalThis これは(JavaScriptの仕様の一部である)準拠したブラウザエンジンとNode.jsの両方で利用可能です。

もし、本当に グローバル を使用することで、Node.jsの globalThis または (古いバージョンの場合) global :

// BUT PLEASE DON'T DO THIS, keep reading
globalThis.windowVar = /*...*/:
// or
global.windowVar = /*...*/; 

global はNodeのグローバルオブジェクトの識別子です(NodeのAPIで先に定義されています)。 globalThis が存在する場合)、例えば window はブラウザ上で使用されます。古い環境も含め、幅広い環境で実行される可能性のあるコードに。

const g = typeof globalThis === "object"
    ? globalThis
    : typeof window === "object"
        ? window
        : typeof global === "object"
            ? global
            : null; // Causes an error on the next line
g.windowVar = /*...*/;

しかし Nodeのプログラムでは本当にグローバルな変数を作成する必要はありません。代わりに、モジュールのグローバル変数を作成するだけです。

let /*or `const`*/ windowVar = /*...*/;

...そして、あなたはそれをあなたの exports 他のモジュールは必要に応じて参照するオブジェクトにアクセスできます。