zoukankan      html  css  js  c++  java
  • 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目录下的文件修改也同理。有了热部署,开发就便利多了。

  • 相关阅读:
    select入门学习
    tomcat入门及相关学习
    Tomcat&Servlet
    CPU排行榜
    CPU后字母代表的含义
    刷 BIOS
    Java的三个体系
    XML入门及案例
    BootStrap笔记
    第三节 DOM及案例 表格全选、表单验证
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2265037.html
Copyright © 2011-2022 走看看