Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我想查看更改时,如何在不重新启动nodejs的情况下在服务器上编辑文件?_Javascript_Node.js - Fatal编程技术网

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

Javascript 当我想查看更改时,如何在不重新启动nodejs的情况下在服务器上编辑文件?,javascript,node.js,Javascript,Node.js,我正在尝试设置自己的nodejs服务器,但遇到了一个问题。我不知道如何在不重新启动应用程序的情况下查看应用程序的更改。是否有方法编辑应用程序并查看node.js的实时更改?签出。您可以为它提供一组文件以监视更改,如果其中任何文件发生更改,它将重新启动服务器。如果由于其他原因崩溃,它也会重新启动 NodeJS中未启用“热交换”代码,因为它很容易意外地导致内存泄漏或对象的多个副本未被垃圾收集。Node的作用是使程序意外地快速运行,而不是意外地泄漏 编辑,7年后的事实:免责声明,我写了node sup

我正在尝试设置自己的nodejs服务器,但遇到了一个问题。我不知道如何在不重新启动应用程序的情况下查看应用程序的更改。是否有方法编辑应用程序并查看node.js的实时更改?

签出。您可以为它提供一组文件以监视更改,如果其中任何文件发生更改,它将重新启动服务器。如果由于其他原因崩溃,它也会重新启动

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


编辑,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”调用,用于加载和缓存模块

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

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

    我认为这是你最好的选择

    与在Chrome开发工具中类似,它利用Chrome(Blink)开发工具界面提供实时代码编辑


    如果希望在不重新启动节点进程的情况下重新加载模块,可以借助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)];
    });