当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Node.js中自动重新加载文件?》经验,为你挑选了11个好方法。

关于如何在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全局变量没有任何线索.



1> Marius Butuc..:

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

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

使用nodemon:

$ npm install nodemon -g
$ nodemon app.js


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

2> 小智..:

node-supervisor太棒了

用于在保存时重启:

npm install supervisor -g
supervisor app.js

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


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

3> 小智..:

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

delete require.cache['/home/shimin/test2.js']


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

4> JnBrymn..:

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

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js



5> micnic..:

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

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();
});

此示例仅适用于一个文件(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');    
})

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

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



6> Richard Metz..:

您可以安装Node-Supervisor

npm install supervisor

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



7> nalply..:

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

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

require(url, reload)

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

app = require("./app", true);

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

process.watchFile(script_name, function(curr, prev) {
    module = reload(script_name, true);
});

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



8> Ninh Pham..:

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

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

命令: 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
}

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

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



9> Xavi..:

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



10> Teoman shipa..:

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

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

forever -w start server.js



11> 小智..:

node-dev很棒。npminstall node-dev

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

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

node-dev app.js

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有