如何在Node.js中自动重新加载文件?

dis*_*cer 415 javascript node.js

关于如何在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 );
Run Code Online (Sandbox Code Playgroud)

app.js文件中我有:

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

但这也没有用 - 我在process.compile()声明中得到一个错误,说没有定义'require'.process.compile正在评估app.js,但对node.js全局变量没有任何线索.

Mar*_*tuc 500

一个好的,最新的替代品supervisornodemon:

监视node.js应用程序中的任何更改并自动重新启动服务器 - 非常适合开发

使用nodemon:

$ npm install nodemon -g
$ nodemon app.js
Run Code Online (Sandbox Code Playgroud)

  • “自动重启服务器-非常适合开发”实在是太夸张了。重新加载服务器可能意味着登录后端服务,这对我而言确实需要很长时间。“完美的开发”就像是在进程在内存中运行时热重载类,而不会丢失状态,就像在更改源代码时android studio所做的那样。 (5认同)
  • 使用`npm install [--save-dev | -D] nodemon` 将安装限制在项目范围内。 (5认同)
  • 但在这种情况下,它也会重新启动服务器进程. (3认同)
  • 这只会重新启动服务器,Web 客户端仍然需要手动重新加载。 (3认同)
  • 如果你想在[Nitrous.io](http://nitrous.io)中使用它 - `$ nodemon -L yourfile.js`(https://codewall.com/p/aqxl_q上的完整说明) (2认同)

小智 308

node-supervisor太棒了

用于在保存时重启:

npm install supervisor -g
supervisor app.js

by isaacs - http://github.com/isaacs/node-supervisor

  • npm install -g supervisor.它应该全局安装. (3认同)
  • 不得不在Windows下运行它:`"C:\ Program Files \nodejs \node.exe"C:\ Users\Mark\AppData\Roaming \npm \node_modules\supervisor\lib\cli-wrapper.js app.js ` (2认同)

小智 83

我找到了一个简单的方法:

delete require.cache['/home/shimin/test2.js']
Run Code Online (Sandbox Code Playgroud)

  • `delete require.cache [require.resolve('./ mymodule.js')];`解决实际路径的问题 (14认同)
  • 如果您想重新加载外部库而不重新启动应用程序(在我的情况下是一个IRC机器人),这非常棒. (7认同)
  • @jocull我认为它不安全,因为它可能会重新创建类和函数或进行任何导出,与`===`进行比较时会导致引用不同 (2认同)

小智 25

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

node --watch index.js
Run Code Online (Sandbox Code Playgroud)


JnB*_*ymn 18

nodemon在google搜索中首先出现,似乎可以解决这个问题:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js
Run Code Online (Sandbox Code Playgroud)


mic*_*nic 18

如果有人仍然只是使用标准模块来解决这个问题我做了一个简单的例子:

var process = require('process');
var cp = require('child_process');
var fs = require('fs');

var server = cp.fork('server.js');
console.log('Server started');

fs.watchFile('server.js', function (event, filename) {
    server.kill();
    console.log('Server stopped');
    server = cp.fork('server.js');
    console.log('Server started');
});

process.on('SIGINT', function () {
    server.kill();
    fs.unwatchFile('server.js');
    process.exit();
});
Run Code Online (Sandbox Code Playgroud)

此示例仅适用于一个文件(server.js),但可以使用文件数组调整为多个文件,使用for循环获取所有文件名,或者通过查看目录:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})
Run Code Online (Sandbox Code Playgroud)

此代码是针对Node.js 0.8 API编写的,它不适合某些特定需求,但可以在一些简单的应用程序中使用.

更新:此功能在我的模块simpleR,GitHub repo中实现


Ric*_*ler 8

您可以安装Node-Supervisor

npm install supervisor
Run Code Online (Sandbox Code Playgroud)

请参阅http://github.com/isaacs/node-supervisor

  • 更多的是在服务器崩溃时重新启动服务器。当监视的文件发生更改时,node-supervisor 也会重新启动整个过程。它不是严格意义上的热重载。 (2认同)

nal*_*ply 7

编辑:我的答案已经过时了.Node.js是一种快速变化的技术.

我也想知道重装模块.我修改了node.js,并在nalply/node的 Github上发布了源代码.唯一的区别是功能require.它有一个可选的第二个参数reload.

require(url, reload)
Run Code Online (Sandbox Code Playgroud)

app.js在当前目录中重新加载使用

app = require("./app", true);
Run Code Online (Sandbox Code Playgroud)

写这样的东西,你有自动重载:

process.watchFile(script_name, function(curr, prev) {
    module = reload(script_name, true);
});
Run Code Online (Sandbox Code Playgroud)

我看到的唯一问题是变量module,但我现在正在努力.


Nin*_*ham 6

nodemon是一个伟大的。我只是添加更多用于调试和监视选项的参数。

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }
Run Code Online (Sandbox Code Playgroud)

命令: nodemon --watch server --inspect ./server/server.js

鉴于:

--watch server重新启动应用程序时更改.js.mjs.coffee.litcoffee,并.json在文件中的server文件夹(包括子文件夹)。

--inspect 启用远程调试。

./server/server.js 入口点。

然后将以下配置添加到launch.json(VS Code),并随时开始调试。

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}
Run Code Online (Sandbox Code Playgroud)

请注意,最好将其安装nodemon为项目的dev依赖项。因此,您的团队成员无需安装它或记住命令参数,他们只需npm run dev开始进行黑客攻击。

nodemon文档上查看更多信息:https : //github.com/remy/nodemon#monitoring-multiple-directories


azw*_*bar 6

You can use nodemon from NPM. And if you are using Express generator then you can using this command inside your project folder:

nodemon npm start
Run Code Online (Sandbox Code Playgroud)

或使用调试模式

DEBUG=yourapp:* nodemon npm start
Run Code Online (Sandbox Code Playgroud)

也可以直接运行

nodemon your-app-file.js
Run Code Online (Sandbox Code Playgroud)

希望这有帮助。


Lui*_*omi 6

使用 Node.js 19,您可以使用该选项监视文件更改--watch。文件更改后,进程会自动重新启动,以反映新的更改。

node --watch server.js
Run Code Online (Sandbox Code Playgroud)


Xav*_*avi 5

在node.js邮件列表上有一个关于这个主题的最新帖子.简短的回答是否定的,目前不可能自动重新加载所需的文件,但有几个人开发了添加此功能的补丁.


Teo*_*ahi 5

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

Forever的另一个有用功能是,当任何源文件发生变化时,它可以选择性地重启您的应用程序.这使您无需在每次添加功能或修复错误时手动重新启动.要在此模式下启动Forever,请使用-w标志:

forever -w start server.js
Run Code Online (Sandbox Code Playgroud)


小智 5

node-dev很棒。npminstall node-dev

重新加载服务器时,它甚至会发出桌面通知,并会在消息中显示成功或错误。

使用以下命令在命令行中启动您的应用程序:

node-dev app.js