如何利用Node.js构建本地
沉沙 2018-05-15 来源 : 阅读 643 评论 0

摘要:构建本地Build,我们已经有很多选择,如Ant,Maven,Gradle等。为什么我们还需要Node.js?Node.js提供了内置的web服务器,简单的文件监听,事件机制等也为做本地Build提供了很好的条件。

Node.js是一个基于Google Chrome浏览器v8 javascript执行引擎的异步I/O事件驱动的运行平台。自从2009年诞生开始,已经在业界得到了很多的关注,在这里也必要多说,如果你还不清楚的,请移步到Node官网。

在这里我们要讲的是用Node.js来构建本地Build。构建本地Build,我们已经有很多选择,如Ant,Maven,Gradle等。为什么我们还需要Node.js?对于我们的开发中会有一些小的基本自动化构建,如文件的监控(Less编译),javascript的压缩,不稳定集成服务代理,快速的集成反馈,文件的迁移…而对于项目来说我并不像引入太多的技术战, Node.js所使用的javascript是做web项目开发的一门必备技能,javascript作为一门比较容易入门语言。而且Node.js提供了内置的web服务器,简单的文件监听,事件机制等也为做本地Build提供了很好的条件。

1:文件监听

var fs = require("fs"); 

var exec = require('child_process').exec 
 
var underscore = require("underscore"); 
 
var configs = [ 
 
    {file:/.*\.less/g, command:" dotless.Compiler.exe style.less style.css"} 
 
]; 
 
var source = "E:\\Project\\xxx\\style"; 
 
  
 
String.format = function () { 
 
    var s = arguments[0]; 
 
    for (var i = 0; i < arguments.length - 1; i++) { 
 
        var reg = new RegExp("\\{" + i + "\\}", "gm"); 
 
        s = s.replace(reg, arguments[i + 1]); 
 
    } 
 
  
 
    return s; 
 
}; 
 
  
 
(function (fs, exec, underscore) { 
 
    var readFiles = function (dir, done) { 
 
        var results = []; 
 
        fs.readdir(dir, function (err, list) { 
 
            if (err) return done(err); 
 
            var pending = list.length; 
 
            if (!pending) return done(null, results); 
 
            list.forEach(function (file) { 
 
                file = dir + '/' + file; 
 
                fs.stat(file, function (err, stat) { 
 
                    if (stat && stat.isDirectory()) { 
 
                        readFiles(file, function (err, res) { 
 
                            results = results.concat(res); 
 
                            if (!--pending) done(null, results); 
 
                        }); 
 
                    } else { 
 
                        results.push(file); 
 
                        if (!--pending) done(null, results); 
 
                    } 
 
                }); 
 
            }); 
 
        }); 
 
    }; 
 
    var start = function (source, configs) { 
 
        var watch = function (error, list) { 
 
            configs.forEach(function (cmd) { 
 
                var files = underscore.filter(list, function (n) { 
 
                    return n.match(cmd.file); 
 
                }); 
 
                files.forEach(function (file) { 

                    fs.watch(file, function (oper, f) { 
 
                        var changeCommand = String.format(cmd.command, f); 
 
                        console.log(String.format("{0} changed,command '{1}' execute...", f, changeCommand)); 
 
                        exec(changeCommand, function (err, stdout, stderr) { 
 
                            console.log(err ? stderr : stdout); 
 
                        }); 
 
                    }); 
 
                }); 
 
  
 
            }); 
 
        }; 
 
        readFiles(source, watch); 
 
    }; 
 
    return {start:start}; 
 
})(fs, exec, underscore).start(source, configs);

在这里提供的示例是Less的编译,虽然Less本也提供了Node的编译工具和watchr监听工具,但是在项目中我会监听Less文件,却只有编译几个固定的Less引导文件。同样我们可以根据不同的文件执行不同的命令实现一些自动化。如:.js文件的同步到测试目录。

2:文件的合并

如果你用jasmine运行你的Javascript测试,你需要吧js文件的测试文件引入到runner head中,我一直很懒,喜欢一键搞定的感觉。利用node.js的模板引擎。 

3:javascript 产品包压缩


var FILE_ENCODING = 'utf-8'; 
 
function uglify(srcPath, jsMinPath) { 
 
    var uglyfyJS = require('uglify-js'), 
 
       jsp = uglyfyJS.parser, 
 
       pro = uglyfyJS.uglify, 
 
       ast = jsp.parse( _fs.readFileSync(srcPath, FILE_ENCODING) ); 
 
  
 
      ast = pro.ast_mangle(ast); 
 
      ast = pro.ast_a squeeze(ast); 
 
      _fs.writeFileSync(jsMinPath, pro.gen_code(ast), FILE_ENCODING); 
 
    console.log(' '+ jsMinPath +'完成.'); 
 
} 
 
uglify(js/test.js', js/test.min.js');

我们可以尽力发挥自己的想象,如本地Build自动运行,快速集成快速反馈;代理服务器,处理不稳定服务的集成,带来稳定的开发。



本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注WEB前端Node.js频道!


本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程