如何在运行时重新加载所需的模块?
我想知道如何在运行时重新加载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"