node.js 热部署
在开发过程中,我们太需要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目录下的文件修改也同理。有了热部署,开发就便利多了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2009-11-29 模拟jQuery实现类数组对象