我想知道如何在运行时重新加载Node.js模块。
假设我有以下代码:
index.js
var myModule = require("./app.js");app.js
var express = require("express");
express.listen(3000, function() {
console.log("app listening on port 3000");
});我尝试了多种方法来重新加载index.js模块中所需的模块。但Express应用程序不会重新启动。
我想让index.js继续运行,因为它动态地处理重新编译Babel模块。而带有快递服务器的app.js模块需要完全重新启动。
在不启动app.js的第二个进程的情况下,有什么方法可以做到这一点?
发布于 2016-12-05 17:04:54
require-uncached是一个npm模块,它将清除缓存并每次从源加载一个模块,根据标题,这正是您感兴趣的地方。要使用此代码,只需使用以下代码:
const requireUncached = require('require-uncached');
requireUncached('./app.js');在这样做之前,可能需要确保停止所有以前的app.js代码(包括快速服务器),这样它们就不会在同一个端口上发生冲突。
此外,我建议考虑这种方法是否真的是最好的解决方案--我确信像pm2这样的库可以处理停止和重新启动节点实例,而不会出现不必要的数据,这可能会导致内存泄漏。
发布于 2019-10-31 14:10:48
现在很简单,我更喜欢自己编写它,以减少依赖。
function clearModule(moduleName) {
let mp = require.resolve(moduleName)
if (require.cache[mp]) {
delete require.cache[mp]
console.log(`[clear] module: ${mp}`)
}
}
function requireReload(moduleName) {
clearModule(moduleName);
return require(moduleName);
}发布于 2016-12-05 17:50:10
如果您所要做的只是重新启动服务器而不重新启动进程,那么我建议您使用http.Server.close方法。根据express 文档,app.listen方法返回一个http.Server对象,因此重新加载如下所示:
app.js
const express = require("express");
app = express();
// Define the listener function separately so it can be used on restart
function listener() {
console.log("app listening on port 3000");
}
// start the server and save a reference to it for our restart function
const server = app.listen(3000, listener);
// Export a restart function to be used by index.js
exports.restart = function() {
server.close(function() {
// Server is closed, start listening again
server.listen(3000, listener) // Use the same listener function as app.listen
});
};index.js
const myModule = require("./app.js"); // Output: "app listening on port 3000"
// Restart the server, keep the process
myModule.restart(); // Output: "app listening on port 3000"https://stackoverflow.com/questions/40946522
复制相似问题