首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在运行时重新加载所需的模块?

如何在运行时重新加载所需的模块?
EN

Stack Overflow用户
提问于 2016-12-03 10:02:17
回答 4查看 3.3K关注 0票数 10

我想知道如何在运行时重新加载Node.js模块。

假设我有以下代码:

index.js

代码语言:javascript
运行
复制
var myModule = require("./app.js");

app.js

代码语言:javascript
运行
复制
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的第二个进程的情况下,有什么方法可以做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-05 17:04:54

require-uncached是一个npm模块,它将清除缓存并每次从源加载一个模块,根据标题,这正是您感兴趣的地方。要使用此代码,只需使用以下代码:

代码语言:javascript
运行
复制
const requireUncached = require('require-uncached');
requireUncached('./app.js');

在这样做之前,可能需要确保停止所有以前的app.js代码(包括快速服务器),这样它们就不会在同一个端口上发生冲突。

此外,我建议考虑这种方法是否真的是最好的解决方案--我确信像pm2这样的库可以处理停止和重新启动节点实例,而不会出现不必要的数据,这可能会导致内存泄漏。

票数 10
EN

Stack Overflow用户

发布于 2019-10-31 14:10:48

现在很简单,我更喜欢自己编写它,以减少依赖。

代码语言:javascript
运行
复制
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);
}
票数 4
EN

Stack Overflow用户

发布于 2016-12-05 17:50:10

如果您所要做的只是重新启动服务器而不重新启动进程,那么我建议您使用http.Server.close方法。根据express 文档,app.listen方法返回一个http.Server对象,因此重新加载如下所示:

app.js

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40946522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档