5

タイムスタンプに基づいて node.js の外部 js ファイルをホットリロードすることは可能ですか?

ここからの初回ロード後にnode.jsキャッシュモジュールを知っています:http://nodejs.org/docs/latest/api/modules.html#modules_caching

モジュールは、最初にロードされた後にキャッシュされます。これは、require('foo') を呼び出すたびに、同じファイルに解決される場合、まったく同じオブジェクトが返されることを (とりわけ) 意味します。

また、リロードする必要があるかどうかもわかっています。次のようにできます。

// first time load
var foo = require('./foo');
foo.bar()

...

// in case need to reload
delete require.cache[require;.resolve('./foo')]
foo = require('./foo')
foo.bar();

しかし、ファイルを監視し、変更があった場合に再ロードするという node.js のネイティブ サポートがあるかどうかは疑問です。それとも自分でやる必要がありますか?

擬似コードのような

// during reload
if (timestamp for last loaded < file modified time)
    reload the file as above and return
else
    return cached required file

PS私はスーパーバイザーとノードモンを認識しており、特定のモジュールをリロードするためにサーバーを再起動したくありません。

4

1 に答える 1

3

オペレーティング システム間で一貫性はありませんが、ネイティブ サポートがあります。それはfs.watch()、またはのいずれかを使用していfs.watchFile()ます。最初の関数はファイル変更イベントを使用し、2 番目の関数は統計ポーリングを使用します。

ファイルを監視し、変更されたときに変更時刻を確認できます。

var fs = require('fs');
var file = './module.js';

var loadTime = new Date().getTime();
var module = require(file);

fs.watch(file, function(event, filename) {
  fs.stat(file, function(err, stats) {
    if (stats.mtime.getTime() > loadTime) {
      // delete the cached file and reload
    } else {
      // return the cached file
    }
  });
});

では、関数が既に のインスタンスをコールバックしているため、fs.watchFile()使用する必要はありません。fs.stats()fs.Stat

fs.watchFile(file, function(curr, prev) {
  if (curr.mtime.getTime() > loadTime) {
    // delete the cached file and reload
  } else {
    // return the cached file
  }
});
于 2013-09-18T03:25:50.863 に答える