如果对文件有任何更改,则在node.js中热重新加载外部js文件

时间:2013-09-18 03:19:54

标签: javascript node.js

是否可以根据时间戳热重新加载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

P.S。我知道supervisor和nodemon,并且不想重新启动服务器来重新加载某些特定的模块。

1 个答案:

答案 0 :(得分:2)

虽然在操作系统中不一致,但仍有本机支持。这可能是使用fs.watch()fs.watchFile()。第一个函数将使用文件更改事件,而第二个函数将使用stat轮询。

您可以观看文件,并在更改后检查修改时间。

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
  }
});