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

Rob*_*rst 59 javascript node.js

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

小智 60

Nodules是Node的模块加载器,可以在重新启动服务器的情况下处理模块的自动重载(因为这就是您所要求的):

http://github.com/kriszyp/nodules

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


isa*_*acs 50

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

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

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

  • 在开发中热插拔应该没问题,在服务器重启之后就可以了,这并不是说它很容易实现 (2认同)

Loo*_*oii 9

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

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

  • Nodemon每次都重新启动服务器,仅用于开发.与罗伯特的要求完全相反!:) (12认同)
  • 是的,接受的答案是对 OP 的错误答案:) (2认同)

Tah*_*koz 9

如果你想在不重启节点进程的情况下重新加载模块,你可以通过fs模块中的watchFile函数和require 的缓存清除功能来完成:

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

var my_module = require('./my_module');
Run Code Online (Sandbox Code Playgroud)

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

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

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

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');
});
Run Code Online (Sandbox Code Playgroud)


小智 5

应该重点关注正在发生的事情,而不仅仅是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...
          });
      });
      
      Run Code Online (Sandbox Code Playgroud)
  2. 您的代码中可能包含“需要”调用,该调用可以加载和缓存模块

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

      var moduleName = req.params.file;
      delete require.cache[moduleName];
      require('./' + moduleName);
      
      Run Code Online (Sandbox Code Playgroud)

所有这些背后都有很多警告,但希望您对正在发生的事情和原因有一个更好的了解。