是否可以根据时间戳热重新加载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,并且不想重新启动服务器来重新加载某些特定的模块。
答案 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
}
});