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

我试图设置我自己的nodejs服务器,但我有一个问题。 我不知道如何看到我的应用程序的变化,而不用重新启动它。 有没有一种方法来编辑应用程序,并看到与node.js生活的变化?

检查Node-Supervisor 。 你可以给它一个文件的集合来监视更改,如果它们中的任何一个改变,它将重新启动你的服务器。 如果由于某种其他原因而崩溃,它也会重新启动。

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

编辑,7年后的事实:免责声明,我写了node-supervisor,但是在写这个答案之前把项目交给了另一个维护者。

Nodules是Node的一个模块加载器,可以在重启服务器的情况下处理模块的自动重装(因为这是你所问的):

http://github.com/kriszyp/nodules

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

使用这个: https : //github.com/remy/nodemon

只需像这样运行你的应用程序: nodemon yourApp.js

什么是“实时编码”?

从本质上讲,这是在程序运行时更改程序的一种方式,无需重新启动。 但是,我们的目标是在我们(重新)启动它的时候能够正常运行的程序。 为了有用,有一个编辑器可以被定制来发送代码到服务器。

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

应该强调一下发生了什么,而不是OP上的shotgunning模块。 此外,我们不知道他正在编辑的文件都是JS模块,或者他们都使用“require”调用。 采取以下一些盐的情况下,他们只是为了描述发生了什么,所以你知道如何使用它。

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

    • 解决scheme您需要有办法告诉服务器哪些代码已经更改,以便可以重新加载它。 您可以将端点设置为接收信号,命令行上的命令或通过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. 你的代码可能有“需要”的调用,它加载和caching模块

    • 解决scheme,因为这些模块caching的要求,按照以前的解决scheme,您将需要在您的端点行删除该引用

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

有很多警告要深入了解所有这些,但是希望您能更好地了解正在发生的事情和原因。

如果您想在不重新启动节点进程的情况下重新加载模块,则可以通过fs模块中的watchFile函数和require的 高速caching清除function来实现:

比方说,你加载了一个简单的需求模块:

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

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

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

我认为节点督察是你最好的select。

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

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

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

一个简单的直接解决scheme,参考所有可用的答案:

节点文档说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)]; });