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

时间:2010-05-28 00:25:15

标签: javascript node.js

我正在尝试设置自己的nodejs服务器,但我遇到了问题。我无法弄清楚如何在不重新启动的情况下查看应用程序的更改。有没有办法编辑应用程序并查看与node.js一起的更改?

9 个答案:

答案 0 :(得分:59)

Nodules是Node的模块加载器,用于处理模块的自动重新加载,而无需重新启动服务器(因为这就是您所询问的):

http://github.com/kriszyp/nodules

Nodules执行智能依赖关系跟踪,因此重新执行适当的模块工厂,以便在重新加载模块时保留正确的引用,而无需完全重启。

答案 1 :(得分:49)

结帐Node-Supervisor。您可以为其提供一组文件以监视更改,如果其中任何一个更改,它将重新启动您的服务器。如果由于其他原因崩溃,它也会重新启动它。

NodeJS中未启用“热交换”代码,因为它很容易意外地导致内存泄漏或未被垃圾回收的多个对象副本。节点是关于让您的程序意外快速,而不是意外泄漏。

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

答案 2 :(得分:9)

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

只需运行您的应用:nodemon yourApp.js

答案 3 :(得分:4)

应该强调正在发生的事情,而不仅仅是在OP上射击模块。另外,我们不知道他正在编辑的文件都是JS模块,或者他们都在使用“require”调用。采取以下几种方案,它们只是为了描述正在发生的事情,因此您知道如何使用它。

  1. 您的代码已加载且服务器正在运行

    • 解决方案您需要有办法告诉服务器哪些代码已更改,以便重新加载。您可以设置端点以接收信号,命令行上的命令或通过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...
          });
      });
      
  2. 您的代码中可能有“require”调用,用于加载和缓存模块

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

      var moduleName = req.params.file;
      delete require.cache[moduleName];
      require('./' + moduleName);
      
  3. 所有这些都需要注意很多,但希望你能更好地了解发生的事情和原因。

答案 4 :(得分:3)

  

什么是“实时编码”?

     

从本质上讲,它是一种在程序运行时改变程序的方法,没有   重新启动它。然而,目标是最终得到一个程序   当我们(重新)启动它时,它可以正常工作。为了有用,它有一个帮助   可以自定义的编辑器,用于将代码发送到服务器。

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

答案 5 :(得分:3)

如果您想在不重新启动节点过程的情况下重新加载模块,可以在 fs 模块和缓存中的 watchFile 功能的帮助下完成此操作清除需要的功能

假设你加载了一个带有简单要求的模块:

If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes _
Then

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

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');
});

答案 6 :(得分:2)

您也可以使用工具PM2。这是节点js的高级生产过程工具。  http://pm2.keymetrics.io/

答案 7 :(得分:1)

我认为node-inspector是你最好的选择。

与Chrome开发工具中的Live Edit Client side JS code类似,它利用Chrome(Blink)开发工具界面提供实时代码编辑。

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

答案 8 :(得分:0)

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

节点文档说fs.watchfs.watchFile&更高效。它可以观看整个文件夹。

(我刚开始使用它,所以不确定是否有任何缺点)

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