Javascript 当我想查看更改时,如何在不重新启动nodejs的情况下在服务器上编辑文件?
我正在尝试设置自己的nodejs服务器,但遇到了一个问题。我不知道如何在不重新启动应用程序的情况下查看应用程序的更改。是否有方法编辑应用程序并查看node.js的实时更改?签出。您可以为它提供一组文件以监视更改,如果其中任何文件发生更改,它将重新启动服务器。如果由于其他原因崩溃,它也会重新启动 NodeJS中未启用“热交换”代码,因为它很容易意外地导致内存泄漏或对象的多个副本未被垃圾收集。Node的作用是使程序意外地快速运行,而不是意外地泄漏Javascript 当我想查看更改时,如何在不重新启动nodejs的情况下在服务器上编辑文件?,javascript,node.js,Javascript,Node.js,我正在尝试设置自己的nodejs服务器,但遇到了一个问题。我不知道如何在不重新启动应用程序的情况下查看应用程序的更改。是否有方法编辑应用程序并查看node.js的实时更改?签出。您可以为它提供一组文件以监视更改,如果其中任何文件发生更改,它将重新启动服务器。如果由于其他原因崩溃,它也会重新启动 NodeJS中未启用“热交换”代码,因为它很容易意外地导致内存泄漏或对象的多个副本未被垃圾收集。Node的作用是使程序意外地快速运行,而不是意外地泄漏 编辑,7年后的事实:免责声明,我写了node sup
编辑,7年后的事实:免责声明,我写了node supervisor,但在写这个答案之前,我已经将项目交给了另一个维护者。是node的模块加载器,它可以在不重新启动服务器的情况下处理模块的自动重新加载(因为这就是您要问的): 结节进行智能依赖项跟踪,以便在重新加载模块时重新执行适当的模块工厂,以保留正确的引用,而无需完全重新启动。使用以下方法: 只需像这样运行你的应用程序:
nodemonyourapp.js
什么是“实时编码”
本质上,它是一种在程序运行时修改程序的方法,而不需要任何修改
重新启动它。然而,目标是以一个
当我们(重新)启动它时,它工作正常。为了有用,有一个
可以自定义以向服务器发送代码的编辑器
看一看:应该强调正在发生的事情,而不是只在OP上使用射击模块。此外,我们不知道他正在编辑的文件都是JS模块,或者它们都在使用“require”调用。以下面的场景为例,它们只是用来描述正在发生的事情,以便您知道如何处理它
- 解决方案您需要有一种方法告诉服务器哪些代码已更改,以便服务器可以重新加载。您可以设置一个端点来接收信号、命令行上的命令或通过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... }); });
- 解决方案由于这些模块是由require缓存的,因此按照前面的解决方案,您需要在端点中添加一行来删除该引用
var moduleName = req.params.file; delete require.cache[moduleName]; require('./' + moduleName);
如果希望在不重新启动节点进程的情况下重新加载模块,可以借助fs模块中的监视文件功能和require的缓存清除功能来完成此操作: 假设您使用一个简单的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');
});
也可以使用PM2工具。这是node js的高级生产流程工具。
一个简单的直接解决方案,参考此处提供的所有答案: 节点文档表明,这比监视整个文件夹更有效 (我刚开始使用这个,所以不确定是否有任何缺点)
Nodemon每次都会重新启动服务器,并且只用于开发。与罗伯特的要求完全相反!:)@jasdeepkhalsa接受的答案也表明它会重新启动服务器。是的,接受的答案是OP的错误答案:)问题是要求解决方案,不要每次都重新启动服务器以实现相同的效果。在开发中进行热插拔应该可以,服务器重新启动后就可以了,这并不是说它很容易实现。您提供的链接似乎表明这是您的项目。您能否澄清您的参与情况并添加适当的免责声明(如适用)?最后一次提交日期为2017年12月。是否有其他选择,或者这仍然是一个好的解决方案?@user3290525是推荐的。@Kris Zyp这是一个很好的解决方案,但它仍在积极维护?更好的方案是使用两台服务器作为代理,当第一台服务器脱机时(504error)(使用nginx,您可以通过重新加载/不重新启动来编辑配置),nginx将处理辅助故障代理服务器,这样,在停止第一台服务器后,所有请求都会自动切换到辅助服务器,第二台服务器用作备份,以便更新第一台服务器上的文件。当first重新联机时,nginx将切换到first服务器。使用此解决方案,您不会丢失任何请求。
fs.watch("lib", (event_type, file_name) => {
console.log("Deleting Require cache for " + file_name);
delete require.cache[ require.resolve("./lib/" + file_name)];
});