web-dev-qa-db-ja.com

NodeJSに必要なモジュールは他のモジュールでは使用できません

私はNodeJSに少し慣れています。たぶんそれはちょうどそれが動作する方法ですが、確かに:

私の「index.js」:

var fs = require('fs');
// do something with fs here
var app = require('./app.js');

「app.js」

fs.readFile('/somedir/somefile.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

その後、エラーが発生します:

ReferenceError: fs is not defined

私が読んだように、これに対する「解決策」は、app.jsのfs-moduleを「再要求」することです。今私が理解しているのは、fs-moduleがキャッシュされていることです(任意のモジュールですが、例を使用しています)ので、Nodeはまだ非常に迅速です。 fs-moduleはキャッシュされているので、実際にはそれはちょっと利用可能ですが、なぜモジュールを「再要求」する必要があるのですか?

私は正直になります。理由を理解するだけです。

20
Peter Versnee

各ファイルにはモジュールへの参照を含める必要があります

index.js

var fs    = require("fs"),
    other = require("./otherfile"); 

// you can now use `fs`

otherfile.js

var fs = require("fs");

// you can now use `fs` here

これに関する最良の部分の1つは、特定のファイルで特定の方法で変数に名前を付けることに縛られていないことです。すべてのファイルはlibの他のすべてのファイルからほとんど分離されており、それはvery良いことです。

また、必要に応じてモジュールの一部のみを含めることができることも知っておいてください

var read = require("fs").readFile;

read("myfile.txt", function(err, data) {
  if (error) {
    return throw error;
  }
  console.log(data);
};

説明:

Node.jsはグローバルの使用を推奨していません。そのため、グローバル変数に依存するものを実装しようとしないでください。

fsモジュールを再度呼び出すと、キャッシュされたモジュールを指す変数を宣言しているだけなので、実際には「再要求」することはありません。


追加例:

この回答 では、グローバルの使用を回避する単純なアプリを構築する方法について詳しく説明します。

35
user633183

時には忘れることもありますが、宣言することは基本です:

var fs = require('fs');
4
Felipe