代码之家  ›  专栏  ›  技术社区  ›  Robert Hurst Patrick Ryan

当我想查看更改时,如何在不重新启动nodejs的情况下编辑服务器文件?

  •  58
  • Robert Hurst Patrick Ryan  · 技术社区  · 16 年前

    9 回复  |  直到 13 年前
        1
  •  54
  •   isaacs    9 年前

    退房 Node-Supervisor . 您可以为它提供一个文件集合来监视更改,如果其中任何文件发生更改,它将重新启动服务器。如果由于其他原因崩溃,它也会重新启动。

    NodeJS中没有启用“热交换”代码,因为它很容易意外地导致内存泄漏或对象的多个副本没有被垃圾收集。Node是让程序意外地快速运行,而不是意外地泄漏。

    编辑,7年后的事实:免责声明,我写了节点主管,但已经把项目交给另一个维护人员在写这个答案。

        2
  •  60
  •   Kris Zyp    16 年前

    结节是一个用于处理自动重新加载模块的节点的模块加载器 没有

    http://github.com/kriszyp/nodules

    结节执行智能依赖跟踪,因此在重新加载模块时重新执行适当的模块工厂,以保留正确的引用,而不需要完全重新启动。

        3
  •  10
  •   Loolooii    13 年前

    使用此选项: https://github.com/remy/nodemon

    nodemon yourApp.js

        4
  •  8
  •   Tahsin Turkoz    9 年前

    如果希望在不重新启动节点进程的情况下重新加载模块,可以通过 监视文件 中的函数 模块和 缓存清除 的特征 :

    假设您用一个简单的require加载了一个模块:

    var my_module = require('./my_module');
    

    为了监视该文件并在更新时重新加载,请在代码中的方便位置添加以下内容。

    fs.watchFile(require.resolve('./my_module'), function () {
        console.log("Module changed, reloading...");
        delete require.cache[require.resolve('./my_module')]
        my_module = require('./my_module');
    });
    

    如果您的模块在多个文件中是必需的,则此操作不会影响其他分配,因此可以将模块保留在全局变量中,并在需要时从全局变量使用它,而不需要多次。所以上面的代码是这样的:

    global.my_module = require ('./my_module');
    //..
    fs.watchFile(require.resolve('./my_module'), function () {
        console.log("Module changed, reloading...");
        delete require.cache[require.resolve('./my_module')]
        global.my_module = require('./my_module');
    });
    
        5
  •  5
  •   Sparkida    11 年前

      • 解决方案 您需要有一种方法来告诉服务器什么代码已经更改,以便它可以重新加载它。您可以设置一个端点来接收信号、命令行上的命令或通过tcp/http的请求,该请求将告诉它更改了什么文件,并且端点将重新加载该文件。

        //using Express
        var fs = require('fs');
        app.get('reload/:file', function (req, res) {
            fs.readfile(req.params.file, function (err, buffer) {
                //do stuff...
            });
        });
        
    1. 您的代码中可能有“require”调用 和储藏室

      • 解决方案 由于这些模块是由require缓存的,因此按照前面的解决方案,您需要在端点中添加一行来删除该引用

        var moduleName = req.params.file;
        delete require.cache[moduleName];
        require('./' + moduleName);
        

    在这一切的背后有很多需要注意的地方,但希望你对发生的事情和原因有一个更好的了解。

        6
  •  3
  •   John Smith Optional    13 年前

    什么是实时编码?

    重新启动。然而,我们的目标是最终得到一个 当我们重新启动它时,它工作正常。为了有用,有一个

    http://lisperator.net/blog/livenode-live-code-your-nodejs-application/

        7
  •  2
  •   nidhin    9 年前

    也可以使用PM2工具。这是一个先进的node js生产过程工具。 http://pm2.keymetrics.io/

        8
  •  1
  •   Gaurav Ramanan    11 年前

    node-inspector 是你最好的选择。

    Live Edit Client side JS code 在Chrome开发工具中,它利用Chrome(Blink)开发工具接口提供实时代码编辑。

    https://github.com/node-inspector/node-inspector/wiki/LiveEdit

        9
  •  0
  •   Dumi Jay    9 年前

    一个简单的直接解决方案,参考此处提供的所有答案:

    节点文档显示 fs.watch fs.watchFile &它可以监视整个文件夹。

    (我刚开始用这个,所以不确定是否有缺点)

    fs.watch("lib", (event_type, file_name) => {
        console.log("Deleting Require cache for " + file_name);
        delete require.cache[ require.resolve("./lib/" + file_name)];
    });
    
    推荐文章