关于我如何在Node.js中实现文件的自动重载有什么想法吗?我厌倦了每次更改文件时重新启动服务器。 显然,Node.js的require()函数不会重新加载文件,如果他们已经被要求,所以我需要做这样的事情:

var sys     = require('sys'), 
    http    = require('http'),
    posix   = require('posix'),
    json    = require('./json');

var script_name = '/some/path/to/app.js';
this.app = require('./app').app;

process.watchFile(script_name, function(curr, prev){
    posix.cat(script_name).addCallback(function(content){
        process.compile( content, script_name );
    });
});

http.createServer(this.app).listen( 8080 );

在app.js文件中,我有:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

但这也不能工作-我在process.compile()语句中得到一个错误,说'require'没有定义。Process.compile正在计算app.js,但没有关于node.js全局变量的线索。


当前回答

最近(2009年)在node.js邮件列表中有一个关于这个主题的帖子。简短的回答是否定的,目前还不可能自动重载所需的文件,但一些人已经开发了添加此功能的补丁。

其他回答

这是一篇关于Node热重载的博文。它提供了一个github节点分支,您可以使用它来替换节点的安装,以启用热重新加载。

来自博客:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

现在,每当你修改myRequestHandler.js时,上面的代码将不再生效,并用新代码重新放置本地的re-questHandler。任何已存在的请求将继续使用旧代码,而任何新的请求将使用新代码。所有这些都不需要关闭服务器,不需要反弹任何请求,不需要提前终止任何请求,甚至不需要依赖内置的负载均衡器。

在Node.js 19中,你可以使用——watch选项监视文件更改。文件更改后,进程将自动重新启动,反映新的更改。

node --watch server.js

这是相当简单的,只是做这个自己没有任何依赖…内置的文件监视器已经足够成熟,它不像以前那么糟糕

你不需要任何复杂的子进程产卵/杀死和管道性病进出…你只需要一个简单的网络工作者,这就是全部!web Worker也是我在浏览器中使用的工具…所以坚持使用网络技术吧!Worker也将登录到控制台

import { watch } from 'node:fs/promises'
import { Worker } from 'node:worker_threads'

let worker = new Worker('./app.js')

async function reloadOnChange (dir) {
  const watcher = watch(dir, { recursive: true })
  for await (const change of watcher) {
    if (change.filename.endsWith('.js')) {
      worker.terminate()
      worker = new Worker('./app.js')
    }
  }
}

// All the folder to watch for
['./src', './lib', './test'].map(reloadOnChange)

这可能不是最好的解决方案,如果你使用javascript以外的任何东西,不依赖于一些构建过程。

长期以来,Nodemon一直是重新启动服务器进行文件更改的首选。现在在Node.js 19中,他们引入了一个——watch标志,它做同样的[实验]。文档

node --watch index.js

我最近提出了这个问题,因为通常的怀疑对象没有使用链接包。如果你像我一样,在开发过程中利用npm link来有效地处理一个由许多包组成的项目,那么在依赖关系中发生的更改也会触发重载,这一点很重要。

在尝试node-mon和pm2之后,即使按照指示额外监视node_modules文件夹,他们仍然没有发现变化。虽然这里的答案中有一些自定义解决方案,但对于这样的问题,单独的包更干净。我今天遇到了node-dev,它工作得很完美,没有任何选项或配置。

自述:

与supervisor或nodemon等工具相反,它不扫描文件系统以查找要监视的文件。相反,它与Node的require()函数挂钩,只监视实际需要的文件。