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

我想知道如何在运行时重新加载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模块。 和express服务器的app.js模块需要完全重启。

有没有办法做到这一点,而无需启动app.js的第二个进程?

       

网上收集的解决方案 "如何在运行时重新加载所需的模块?"

require-uncached是一个npm模块,它会清除caching并每次从源文件加载一个模块,这正是您根据您的标题感兴趣的内容。 要使用这个,你可以简单地使用下面的代码:

 const requireUncached = require('require-uncached'); requireUncached('./app.js'); 

在执行此操作之前,可能需要确保先前的所有app.js代码(包括Express服务器)已停止,以便它们不会在同一端口发生冲突。

此外,我会build议考虑这种方法是否真的是最好的答案 – 我确定像pm2这样的库可以处理停止和重新启动Node实例,而不会有不必要的数据挂起的风险,这可能会导致内存泄漏。

我build议你在这个链接中使用lazyload,在这里我有自己的post。

第一个应用

 angular.module('myApp', ['ui.router','oc.lazyLoad']) .config(function ($stateProvider, $locationProvider, $ocLazyLoadProvider) { $stateProvider .state("home", { url: "/home", templateUrl: "Home.html", controller: 'homeCtrl', resolve: { loadMyCtrl: ['$ocLazyLoad', function ($ocLazyLoad) { return $ocLazyLoad.load('homeCtrl.js'); }] } }) .state("profile", { url:"/profile", templateUrl: "profile.html", resolve: { loadMyCtrl: ['$ocLazyLoad', function ($ocLazyLoad) { return $ocLazyLoad.load('someModule.js'); }] } }) }); 

第二个应用

 (function () { var mynewapp=angular.module('someApp',['myApp']); mynewapp.config(function(){ //your code to route from here! }); mynewapp.controller("profileCtrl", function ($scope) { console.log("reached profile controller"); }); })(); 

也是一个活的布卢克

如果你所要做的就是重启服务器而不重启进程,我会build议使用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"