web-dev-qa-db-ja.com

Node.js:モジュールをリロードする方法

私はNodeJSを初めて使用するので、おそらくいくつかの間違いをしています。

Myappという外部ファイルにたくさんのコードを書きました。 NodeJS for Windowsを起動し、インタープリターウィンドウから次のように入力します。

var myapp = require('d:/myapp.js');

次に、外部モジュールで関数と変数を使用できます。

問題は、myappのコードを更新すると、インタープリターがファイルを再読み取りせず、古いバージョンを使用することです。

さて、そもそもこれは正常ですか?この問題を回避する方法は?

追伸:私はインターネットで何時間も過ごし、これを含む多くのフォーラムで検索しました。それは他の何よりも混乱していました。

ありがとう。

14
az1mov

コメントで示唆されているように ここにいくつかの答え があります。

ただし、それらはREPLフレンドリーではなく、追加のモジュールを使用することさえあります。

これは、他の質問に関する議論に触発されて、REPLに貼り付けることができる1行のソリューションです。

_function nocache(module) {require("fs").watchFile(require("path").resolve(module), () => {delete require.cache[require.resolve(module)]})}
_

この関数は、ファイルが変更されるたびにモジュールをキャッシュから削除します。使用するには、REPLに貼り付け、uncache("d:/myapp.js")を呼び出してから、通常はrequireを使用します。

_> function nocache(module) {require("fs").watchFile(require("path").resolve(module), () => {delete require.cache[require.resolve(module)]})}
> nocache("d:/myapp.js");
> var myapp = require("d:/myapp.js");
......
> myapp = require("d:/myapp.js");
....
_
3
mihai

他の答え(重複して@mihaiによる)はすべて正しいですが、この特定の例に対する最も直接的な答えは次のとおりです。

_delete require.cache['d:/myapp.js'];
_

モジュールは、fullファイル名にキー設定された_require.cache_にキャッシュされます。この特定のケースでは、完全なファイル名(ie_d:/myapp.js_)がロードに使用されたため、問題の解決策は非常に簡単です。 。

ただし、ほとんどの場合、完全なファイル名は使用されておらず、不明ですらあります。たとえば、require('fs')はファイルシステムモジュールをロードするために使用されますが、開発者は完全で適切なファイル名を失うことになります。そのため、require.resolve('fs')は、モジュールをキャッシュするためのキーとして使用されるファイル名を返します。

1
codechimp