博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js 热部署
阅读量:7237 次
发布时间:2019-06-29

本文共 2206 字,大约阅读时间需要 7 分钟。

在开发过程中,我们太需要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)    }});

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

转载地址:http://pulfm.baihongyu.com/

你可能感兴趣的文章
它们的定义ListView,实现Item除去滑动和滑出菜单效果
查看>>
2015第我35周三
查看>>
Web前端研发工程师编程能力飞升之路
查看>>
C#编程总结(十)字符转码
查看>>
linux gcc头文件搜索路径
查看>>
对线程的理解
查看>>
更改linux swappiness 提高物理内存使用率
查看>>
J-Link GDB Server Command
查看>>
如何用.NET生成二维码?
查看>>
C++一个简单的手柄类模板
查看>>
The Water Problem(排序)
查看>>
atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接
查看>>
C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
查看>>
android 电容屏(三):驱动调试之驱动程序分析篇
查看>>
数字签名时间戳服务器的原理 !
查看>>
C++ Split string into vector<string> by space
查看>>
JavaScript学习——内置属性
查看>>
Oracle Profile 使用详解--zhuanzai
查看>>
Hadoop-1.1.2、HBase-0.94.7完全分布式集群结构
查看>>
TP-Link wr703N 使用华为HiLink系列上网卡的设置【转】
查看>>