设为首页 收藏本站
查看: 1189|回复: 0

[经验分享] node.js 热部署

[复制链接]

尚未签到

发表于 2017-2-28 11:34:12 | 显示全部楼层 |阅读模式
  在开发过程中,我们太需要Jetty那样的热部署机制,要不修改一点东西就要频频重启服务器,真是烦死人了。
  在node.js实现这种机制非常简单,首先我们有watchFile,通过它用来监听文件的内容是否被修改,如果修改就让子线程关闭当前线程,并让它重新启动新的线程来处理请求与发出响应。
  技术点:要监听文件的变动,那么是监听那些目录下的文件呢?何种后缀名的文件呢?子线程相应事件的绑定,线程的关闭,线程的新建。。。
  首先是监听问题,为了防止硬编程,我们用一个专门的文件来配置这些消息,在javascript,在适合做这种事的是JSON,在node.js有一种叫.json的文件类型。


// 位置  ./configs/hot_deployer.json
{"dirs":["styles","javascripts"]
,"exts":["js","css"]
}

  然后有一个文件专门读取这个配置文件,然后进行热部署。
  读取文件,我们可以readFileSync方法(我尽量使用同步方法,以免出现复杂的流程控制),这时读取的东西是字符串,我们再用JSON.parse转换一下。


var json = {},files = [];
try{
var str = fs.readFileSync("./configs/hot_deployer.json");
json = JSON.parse(str);
}catch(e){
util.debug("JSON parse configs/hot_deployer.json fails")
}

  然后取得JSON相关键值,根据它们取得想要监听的文件。


var dirs = json.dirs || [];
var exts = json.exts || [];
var rexts = new RegExp("^.*\.(" + exts.join("|") + ")$");
//收集符合给定后缀后的文件
dirs.forEach(function(dir){
files = files.concat( getAllFiles(dir))
});

  这里用到一个getAllFiles方法,可以详见我这篇博文,已给出。
  接下来是线程的处理部分:


// by 司徒正美
//重启线程
function rebootProcess(exec,args){
args = args || []
var child = exports.child = spawn(exec, args);//创建一个新线程来接力
child.stdout.addListener("data", function (chunk) {
chunk && util.debug(chunk);
});
child.stderr.addListener("data", function (chunk) {
chunk && util.debug(chunk);
});
child.addListener("exit", function () {
util.debug("reboot process...");
rebootProcess(exec, args);
});
}
//结束线程
function crashProcess (prev, cur) {
if ( cur && +cur.mtime !== +prev.mtime|| crashProcess.status ) return;
crashProcess.status = 1;//如果经过调整,则结束线程
var child = exports.child;
util.debug("crash process...");
setTimeout(function() {
process.kill(child.pid);
crashProcess.status = 0;
}, 50);
}
crashProcess.status = 0;

  最后是调用上述方法,监听文件的修改就成了。


//开始监听
rebootProcess("node",[]);
//监听给定的文件
function watchGivenFile (watch, time) {
fs.watchFile(watch, {
persistent: true,
interval: time
}, crashProcess);
}
files.forEach(function(file){
if(rexts.test(file)){
watchGivenFile(file,50)
}
});

  完整示例请到115下载。文件下回来解压,定位到hot目录,执行node index.js命令,打开浏览器,输入http://localhost:8888,就能看到网页,然后再修改一下styles目录下的CSS文件的样式规则吧,然后刷新页面,看是不是一用重启就能看到效果呢?!javascripts目录下的文件修改也同理。有了热部署,开发就便利多了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348398-1-1.html 上篇帖子: Maven2的配置文件settings.xml 下篇帖子: 配合m2eclipse创建一个标准的maven项目.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表