如何在Node.js中自动重新加载文件?
231571 观看
25回复
关于如何在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全局变量没有任何线索。
回应 (25)
435像
一个好的,最新的替代品supervisor
是nodemon
:
监视node.js应用程序中的任何更改并自动重新启动服务器 - 非常适合开发
使用nodemon
:
$ npm install nodemon -g
$ nodemon app.js
作者: Marius Butuc
发布者: 18.01.2013 07:17
304像
node-supervisor太棒了
用于在保存时重启:
npm安装主管-g 主管app.js
by isaacs - http://github.com/isaacs/node-supervisor
作者: Anup Bishnoi 发布者: 05.02.2011 02:0281像
18像
nodemon在google搜索中首先出现,似乎可以解决这个问题:
npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js
作者: JnBrymn
发布者: 04.12.2011 03:03
16像
如果有人仍然只是使用标准模块来解决这个问题我做了一个简单的例子:
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中实现
作者: micnic 发布者: 13.09.2012 05:308像
您可以安装Node-Supervisor
npm install supervisor
请参阅http://github.com/isaacs/node-supervisor
作者: Richard Metzler 发布者: 28.09.2010 05:017像
编辑:我的答案已经过时了。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
,但我现在正在努力。
5像
5像
这个问题的另一个解决方案是永远使用
Forever的另一个有用功能是,当任何源文件发生变化时,它可以选择性地重启您的应用程序。这使您无需在每次添加功能或修复错误时手动重新启动。要在此模式下启动Forever,请使用-w标志:
forever -w start server.js
作者: Teoman shipahi
发布者: 16.03.2015 04:43
3像
这是一篇关于Hot Reloading for Node的博客文章。它提供了一个github Node分支,您可以使用它来替换Node的安装以启用Hot Reloading。
来自博客:
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);
作者: Chetan 发布者: 03.10.2010 09:32现在,只要修改myRequestHandler.js,上面的代码就会注意到并用新代码替换本地requestHandler。任何现有请求将继续使用旧代码,而任何新传入请求将使用新代码。所有这些都没有关闭服务器,弹出任何请求,过早地杀死任何请求,甚至依赖智能负载均衡器。
3像
我正在努力创建一个相当小的节点“东西”,它能够随意加载/卸载模块(因此,你可以重新启动部分应用程序,而不会将整个应用程序关闭)。我正在合并一个(非常愚蠢的)依赖管理,所以如果你想停止一个模块,所有依赖于它的模块也会被停止。
到目前为止一切顺利,但后来我偶然发现了如何重新加载模块的问题。显然,可以从“require”缓存中删除模块并完成工作。由于我不想直接更改节点源代码,我想出了一个非常 hacky-hack,即:在堆栈中搜索最后一次调用“require”函数,获取对它的“cache”字段的引用and..well,删除对节点的引用:
var args = arguments
while(!args['1'] || !args['1'].cache) {
args = args.callee.caller.arguments
}
var cache = args['1'].cache
util.log('remove cache ' + moduleFullpathAndExt)
delete( cache[ moduleFullpathAndExt ] )
实际上更容易:
var deleteCache = function(moduleFullpathAndExt) {
delete( require.cache[ moduleFullpathAndExt ] )
}
显然,这很好用。我完全不知道那些论点[“1”]意味着什么,但它正在做它的工作。我相信节点人员有一天会实现重装设备,所以我想现在这个解决方案也是可以接受的。(顺便说一句。我的“事情”将在这里:https://github.com/cheng81/wirez,几周后去那里,你应该看看我在说什么)
作者: cheng81 发布者: 22.02.2011 03:063像
node-dev工作得很好。NPMinstall node-dev
它甚至会在重新加载服务器时发出桌面通知,并会在消息上显示成功或错误。
在命令行上启动您的应用程序:
node-dev app.js
2像
nodemon
是一个伟大的。我只是为调试和观看选项添加了更多参数。
的package.json
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon --watch server/**/*.js --inspect ./server/server.js"
}
nodemon --watch server/**/*.js --inspect ./server/server.js
鉴于:
--watch server/**/*.js
只更改文件server
夹中的.js文件时重新启动服务器。
--inspect
启用远程调试。
./server/server.js
切入点。
然后将以下配置添加到launch.json
(VS代码)并随时开始调试。
{
"type": "node",
"request": "attach",
"name": "Attach",
"protocol": "inspector",
"port": 9229
}
请注意,最好安装nodemon
为项目的dev依赖项。所以你的团队成员不需要安装它或记住命令参数,他们只是npm run dev
开始黑客攻击。
1像
解决方案:http: //github.com/shimondoodkin/node-hot-reload
请注意,您必须自己照顾所使用的参考文献。
这意味着如果你这样做:var x = require('foo'); Y = X; Z = x.bar; 并热重新加载它。
这意味着你必须替换存储在x,y和z中的引用。在热的reaload回调函数中。
有些人混淆热重载与自动重启我的nodejs-autorestart模块也有upstart集成以启用启动时自动启动。如果你有一个小应用程序自动重启是好的,但是当你有一个大的应用程序热重新加载更合适。仅仅因为热重载更快。
我也喜欢我的节点流入模块。
作者: Shimon Doodkin 发布者: 05.10.2010 01:511像
没必要使用nodemon或其他类似的工具。只需使用IDE的功能。
可能最好的一个是IntelliJ WebStorm,它具有node.js的热重载功能(自动服务器和浏览器重新加载)。
作者: lukyer 发布者: 08.06.2016 08:431像
您可以使用nodemon从NPM。如果您使用Express生成器,那么您可以在项目文件夹中使用此命令:
nodemon npm start
或使用调试模式
DEBUG=yourapp:* nodemon npm start
你也可以直接跑
nodemon your-app-file.js
希望这有帮助。
作者: azwar_akbar 发布者: 08.09.2018 03:310像
用这个:
function reload_config(file) {
if (!(this instanceof reload_config))
return new reload_config(file);
var self = this;
self.path = path.resolve(file);
fs.watchFile(file, function(curr, prev) {
delete require.cache[self.path];
_.extend(self, require(file));
});
_.extend(self, require(file));
}
你现在要做的就是:
var config = reload_config("./config");
并且config会自动重新加载:)
作者: offlinehacker 发布者: 26.12.2013 07:350像
loaddir是我以递归方式快速加载目录的解决方案。
可以回来
{ 'path/to/file': 'fileContents...' }
要么
{ path: { to: { file: 'fileContents'} } }
它callback
在文件被更改时将被调用。
它处理文件足够大的情况,watch
在写入之前调用它们。
我在项目中使用它已经有一年左右的时间了,最近又添加了许可证。
帮我战斗吧!
https://github.com/danschumann/loaddir
作者: Funkodebat 发布者: 25.03.2014 08:520像
您可以使用自动重新加载来重新加载模块而无需关闭服务器。
安装
npm install auto-reload
例
data.json
{ "name" : "Alan" }
test.js
var fs = require('fs');
var reload = require('auto-reload');
var data = reload('./data', 3000); // reload every 3 secs
// print data every sec
setInterval(function() {
console.log(data);
}, 1000);
// update data.json every 3 secs
setInterval(function() {
var data = '{ "name":"' + Math.random() + '" }';
fs.writeFile('./data.json', data);
}, 3000);
结果:
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
作者: Lellansin
发布者: 19.09.2014 03:24
0像
另一个简单的解决方案是使用fs.readFile而不是使用require 可以保存包含json对象的文本文件,并在服务器上创建一个间隔来重新加载此对象。
优点:
- 无需使用外部库
- 与生产相关(在更改时重新加载配置文件)
- 易于实施
缺点:
- 你不能重新加载一个模块 - 只是一个包含键值数据的json
0像
对于使用Vagrant和PHPStorm的人来说,文件观察器是一种更快的方法
禁用文件的立即同步,以便仅在保存时运行命令,然后为* .js文件和工作目录创建范围并添加此命令
vagrant 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
作者: gadelkareem
发布者: 29.11.2014 02:12
0像
我最近提出这个问题,因为通常的嫌疑人没有使用链接包。如果您像我一样并且npm link
在开发期间利用它来有效地处理由许多软件包组成的项目,那么依赖项中发生的更改也会引发重新加载。
在尝试了node-mon和pm2之后,即使按照他们的指示进行额外观察node_modules文件夹,他们仍然没有接收到更改。虽然这里的答案中有一些自定义解决方案,但对于类似的东西,单独的包更清洁。我今天遇到了node-dev,它完美无缺,没有任何选项或配置。
从自述文件:
作者: Aaron Storck 发布者: 12.12.2014 05:45与supervisor或nodemon等工具相比,它不会扫描文件系统以查看要监视的文件。相反,它挂钩到Node的require()函数,只监视实际需要的文件。
0像
这是一种在Windows中使用的低技术方法。把它放在一个名为的批处理文件中serve.bat
:
@echo off
:serve
start /wait node.exe %*
goto :serve
现在,不要node app.js
从cmd shell 运行,而是运行serve app.js
。
这将打开一个运行服务器的新shell窗口。批处理文件将阻塞(因为/wait
),直到您关闭shell窗口,此时原始cmd shell将询问“终止批处理作业(是/否)?” 如果您回答“N”,则服务器将重新启动。
每次要重新启动服务器时,请关闭服务器窗口并在cmd shell中回答“N”。
作者: yoyo 发布者: 24.11.2018 12:26-1像
现在使用带有热选项的WebPack开发服务器。你可以在package.json中添加这样的脚本:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
并且文件中的每个更改都将自动触发重新编译
作者: eKelvin 发布者: 27.03.2018 12:44-1像
我的app结构:
NodeAPP (folder)
|-- app (folder)
|-- all other file is here
|-- node_modules (folder)
|-- package.json
|-- server.js (my server file)
首先使用此命令重新加载:
npm install [-g] [--save-dev] reload
然后改变package.json:
"scripts": {
"start": "nodemon -e css,ejs,js,json --watch app"
}
现在你必须在服务器文件中使用reload :
var express = require('express');
var reload = require('reload');
var app = express();
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
console.log( 'server is running on port ' + app.get('port'));
});
reload(server, app);
对于最后一次更改,您的响应结束发送此脚本:
<script src="/reload/reload.js"></script>
现在使用以下代码启动您的应用:
npm start
作者: کسری کرمی
发布者: 08.03.2019 12:00
来自类别的问题 :
- javascript 如何检测网页中使用了哪一个定义的字体?
- javascript JavaScript对象的长度
- javascript 从下拉框中获取文本
- javascript 带隐藏按钮的登录脚本
- javascript 如何使用Prototype自动调整textarea?
- javascript 使用JavaScript滚动溢出的DIV
- javascript Google Maps API - 类GLatLngBounds的问题
- javascript 在JavaScript中验证十进制数 - IsNumeric()
- javascript 如何使用命令行美化JavaScript代码?
- javascript 动态加载JavaScript文件
- node.js 在Javascript中从数组中删除空元素
- node.js 如何在节点中为shell命令转义字符串?
- node.js 我可以在Node.js中使用jQuery吗?
- node.js 如何调试Node.js应用程序?
- node.js 如何在Node.js中自动重新加载文件?
- node.js 是否有node.js的sprintf等价物
- node.js 如何获取Node.js目录中存在的所有文件的名称列表?
- node.js 如何在Node.js中打印堆栈跟踪?
- node.js 您在node.js中看到过哪些类型的应用程序?
- node.js 如何在Node.js和浏览器之间共享代码?