关于我如何在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全局变量的线索。


当前回答

这个问题的另一个解决方案是永远使用

Forever的另一个有用功能是它可以选择重新启动 当任何源文件发生更改时,您的应用程序。这让你自由 从每次添加功能或修复错误时都必须手动重新启动 bug。要在此模式下启动Forever,使用-w标志:

forever -w start server.js

其他回答

对于使用Vagrant和PHPStorm的人来说,文件监视器是一种更快的方法

禁用文件的即时同步,这样就可以只在保存时运行该命令,然后为*.js文件和工作目录创建一个作用域并添加此命令 SSH -c "/var/www/gadelkareem.com/forever.sh restart"

forever.sh在哪里

#!/bin/bash

cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js

加载器是我的解决方案快速加载一个目录,递归。

可以返回

{'path/to/file': 'fileContents…'} 或 {path: {to: {file: 'fileContents'}}}

它有回调函数,当文件被更改时将被调用。

它处理的情况是文件足够大,以至于watch在写入完成之前就被调用。

我已经在项目中使用它一年左右了,最近才添加了承诺。

帮我进行战斗测试!

https://github.com/danschumann/loaddir

如果你说的是服务器端的NodeJS热加载,假设你希望在服务器上有一个Javascript文件,它有一个描述的快速路由,你希望这个Javascript文件热加载,而不是在文件更改时服务器重新启动,那么razzle可以做到这一点。

basic-server就是一个例子

https://github.com/jaredpalmer/razzle/tree/master/examples/basic-server

如果更改并保存了https://github.com/jaredpalmer/razzle/blob/master/examples/basic-server/src/server.js文件,则该文件将热重新加载,服务器不会重新启动。

这意味着您可以编写一个REST服务器,它可以使用这个razzle进行热重载。

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

node --watch index.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以外的任何东西,不依赖于一些构建过程。