首页 文章

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

提问于
浏览
6

我想知道如何在运行时重新加载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启动第二个进程,有没有办法做到这一点?

3 回答

  • 1

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

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

    在执行此操作之前,可能需要确保所有先前的 app.js 's code (including the Express server) is stopped so that they don' t冲突为同一端口 .

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

  • 2

    如果您要做的只是重新启动服务器而不重新启动该过程,我建议使用http.Server.close方法 . 根据express docs,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"
    
  • 6

    我建议你在网页包中使用 lazyload ,我在这个link有自己的帖子 .

    第一个应用

    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");
            });
    
    })();
    

    还活着Plunker

相关问题