题
任何想法如何能实现一个自动加载的文件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()
表声明说,'需要'是没有定义。 process.compile
是evaling的 app.js, 但是没有线索node.js globals.
解决方案
一个良好的,最新的替换supervisor
是的 nodemon
强>:
监视器在您的Node.js应用程式,并自动重新启动服务器的任何变化 - 完美的发展
要使用nodemon
:
$ npm install nodemon -g
$ nodemon app.js
其他提示
节点主管是真棒
使用,以重新启动保存:
npm install supervisor -g supervisor app.js
我发现了一个简单的方法:
delete require.cache['/home/shimin/test2.js']
nodemon 的在谷歌搜索第一次来到了,似乎这样的伎俩:
npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js
如果有人仍然来到这个问题,要解决,它仅使用标准模块我做了一个简单的例子:
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),但可以适应多个文件使用一系列文件,用于循环,获得所有文件的名称,或通过观看目录:
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.8API,它不适用于某些具体需求,但将努力在一些简单的应用程序。
修改我的答案是过时的。 Node.js的是一个非常快的改变的技术。
我也想知道的重新加载强>模块。我修改的node.js和已发布 nalply /节点在Github上的源极。唯一的区别是函数require
。它有一个可选的第二个参数reload
。
require(url, reload)
在当前目录,使用重新加载app.js
app = require("./app", true);
写这样的事情,你有自动 -reload:
process.watchFile(script_name, function(curr, prev) {
module = reload(script_name, true);
});
我看到的唯一问题是变量module
,但我现在在它的工作。
有大约节点关于这一问题近期螺纹。 JS邮件列表。简短的回答是否定的,它目前还无法自动重装所需的文件,但有几个人已经开发了添加此功能的补丁。
但此问题的另一个解决方案是使用永远
的永远的另一个有用功能是,它可任选地重新启动 当所有的源文件已经改变了您的应用程序。这将释放你 从每次都要手动重新启动你添加新功能或修复 错误。在这个模式下启动永远,使用-w标志:
forever -w start server.js
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码)并开始调试任何时候。
{
"type": "node",
"request": "attach",
"name": "Attach",
"protocol": "inspector",
"port": 9229
}
请注意,这是更好地安装nodemon
作为项目的开发依赖。所以,你的团队成员并不需要安装或记住命令行参数,他们只是npm run dev
并开始入侵。
请参阅更多nodemon
文档: https://github.com/remy/nodemon #监视多目录
节点-dev的巨大的。 NPM install node-dev
它甚至给出了当服务器被重新装载并给该消息的成功或错误桌面通知。
开始您的应用上的命令行与:
node-dev app.js
这里是关于博客帖子热重新加载的节点。它提供了一个 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任何时候,上面的代码会发现,用新的代码替换本地requestHandler。现有的任何请求都将继续使用旧代码,而任何新的传入请求将使用新代码。所有而不关闭服务器,弹跳的任何请求,过早杀死任何请求,或甚至依靠一个智能负载平衡器。
我正在制作一个相当微小节点的“东西”,它能够装载/卸载模块随意(因此,即你可以能够重新启动您的应用程序的一部分,而不使整个程序下来)。 我结合了(非常愚蠢的)依赖管理,所以,如果你想停止一个模块,所有依赖于该模块也将被停止。
到目前为止好,但后来我偶然到如何重新加载模块的问题。显然,一个可能只是从“规定”缓存中删除模块,并具有完成工作。由于我并不热衷于直接改变节点的源代码,我想出了一个的非常的哈克,黑客是:在堆栈跟踪的最后一次调用搜索到“规定”功能,抢提到它的“缓存”字段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 ,去那里的几个星期,你应该看看我说的)
可以使用 nodemon 强>从的 NPM 即可。 如果您使用的是快速生成,那么你可以使用你的项目文件夹下面的命令:
nodemon npm start
或使用调试模式
DEBUG=yourapp:* nodemon npm start
也可以直接运行
nodemon your-app-file.js
希望这帮助。
溶液在: http://github.com/shimondoodkin/node-hot-reload
请注意,您必须自己使用的参考资料的照顾。
这意味着如果你确实的:var X =需要( '富'); Y = X; Z = x.bar;和重新加载热 它
这意味着必须更换存储在x,y和z中的引用。在热reaload回调函数。
有些人混淆了自动重启重装热 我的NodeJS,自动重启模块还具有新贵集成启用开机自动启动。 如果你有一个小的应用程序自动重启是好的,但是当你有一个大应用热点重装更适合。仅仅是因为热重载更快。
此外,我喜欢我的节点流入模块。
不需要使用 nodemon 或其他工具那样。只需使用你的IDE的功能。
可能是最好的一个是的IntelliJ WebStorm 有用于热重新载入功能(自动服务器和浏览器重装)的node.js
下面是在Windows中使用的低技术方法。将这个在名为serve.bat
批处理文件:
@echo off
:serve
start /wait node.exe %*
goto :serve
现在,而不是从你的CMD shell中运行node app.js
,运行serve app.js
。
这将打开运行的服务器新的外壳窗口。直到关闭shell窗口,在这一点,原来的CMD外壳会问该批处理文件将阻止(因为/wait
)的“终止批处理作业(Y / N)?”如果你回答“否”,则服务器将重新启动。
要重新启动服务器,关闭在CMD壳服务器窗口,并回答“N”每一次。
我的应用程序结构:
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"
}
现在,您必须在您的服务器文件中使用重载
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
使用这样的:
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");
和配置将自动得到重新加载:)
loaddir是我的目录的快速加载,递归溶液。
可以返回
{ 'path/to/file': 'fileContents...' }
要么
{ path: { to: { file: 'fileContents'} } }
它具有callback
当文件被改变其将被称为
据处理这样的文件是足够大,使得watch
被他们称为前就完成了写作的情况。
我一直在使用它的项目一年左右的时间,而刚刚加入承诺吧。
帮我战斗测试!
可以使用自动重载重新加载模块,而不关闭服务器。
安装
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' }
另一个简单的解决方法是 使用fs。readFile而不是使用需要 你可以保存一个文本文件contaning json对象,并创建一个时间间隔在服务器重新装载,这对象。
赞成:
- 没有必要使用外部库
- 关于生产(装配置文件上的变化)
- 容易实现的
缺点:
- 你不能再装模块-只是一个json含有关键价值的数据
人使用流浪汉和PHPStorm, 文件中观察程序 是一个速度更快的方法
禁止立即同步的文件,以便运行命令只在拯救后创建一个范围*.js文件和工作目录和增加这个命令
流浪ssh-c"/var/www/gadelkareem.com/forever.sh 重新启动"
哪里forever.sh 就像是
#!/bin/bash
cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js
最近,我来到了这个问题,因为通常的嫌疑人并没有使用链接包工作。如果你和我一样,在开发过程中正在利用npm link
的有效工作,对由许多软件包的一个项目,这一点很重要的是在发生变化的依赖触发重载为好。
具有试图节点纹和PM2,即使下面的用于附加地观看node_modules夹他们的指示后,它们仍没有拿起变化。虽然有在回答一些定制的解决方案在这里,这样的事情,一个单独的包是清洁的。我今天整个节点-dev的来了,它完全不带任何选项或配置。
从自述:
在对比工具,如主管或nodemon它不会扫描文件系统为被监视的文件。相反,它挂接到节点的require()函数仅观看已实际需要的文件。
const cleanCache = (moduleId) => {
const module = require.cache[moduleId];
if (!module) {
return;
}
// 1. clean parent
if (module.parent) {
module.parent.children.splice(module.parent.children.indexOf(module), 1);
}
// 2. clean self
require.cache[moduleId] = null;
};
使用具有热选项如今的WebPack dev的服务器。
你可以在你的package.json添加脚本是这样的:"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
和您的文件中的每一个变化都会自动触发重新编译