利用Node.js本地构建

                  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,我爱不释手,由于我对Javascript基础,能够快速使用它,并不需要付出更多的学习成本,而且我感觉在服务端和客户端用同一种语言,在能一定代码重用妙不可言。而且Node.js提供了内置的web服务器,简单的文件监听,事件机制等也为做本地Build提供了很好的条件。

1:文件监听

  1 var fs = require("fs");
  2
  3 var exec = require('child_process').exec
  4
  5 var underscore = require("underscore");
  6
  7 var configs = [
  8
  9     {file:/.*\.less/g, command:" dotless.Compiler.exe style.less style.css"}
 10
 11 ];
 12
 13 var source = "E:\\Project\\xxx\\style";
 14
 15
 16
 17 String.format = function () {
 18
 19     var s = arguments[0];
 20
 21     for (var i = 0; i < arguments.length - 1; i++) {
 22
 23         var reg = new RegExp("\\{" + i + "\\}", "gm");
 24
 25         s = s.replace(reg, arguments[i + 1]);
 26
 27     }
 28
 29
 30
 31     return s;
 32
 33 };
 34
 35
 36
 37 (function (fs, exec, underscore) {
 38
 39     var readFiles = function (dir, done) {
 40
 41         var results = [];
 42
 43         fs.readdir(dir, function (err, list) {
 44
 45             if (err) return done(err);
 46
 47             var pending = list.length;
 48
 49             if (!pending) return done(null, results);
 50
 51             list.forEach(function (file) {
 52
 53                 file = dir + '/' + file;
 54
 55                 fs.stat(file, function (err, stat) {
 56
 57                     if (stat && stat.isDirectory()) {
 58
 59                         readFiles(file, function (err, res) {
 60
 61                             results = results.concat(res);
 62
 63                             if (!--pending) done(null, results);
 64
 65                         });
 66
 67                     } else {
 68
 69                         results.push(file);
 70
 71                         if (!--pending) done(null, results);
 72
 73                     }
 74
 75                 });
 76
 77             });
 78
 79         });
 80
 81     };
 82
 83     var start = function (source, configs) {
 84
 85         var watch = function (error, list) {
 86
 87             configs.forEach(function (cmd) {
 88
 89                 var files = underscore.filter(list, function (n) {
 90
 91                     return n.match(cmd.file);
 92
 93                 });
 94
 95                 files.forEach(function (file) {
 96
 97                     fs.watch(file, function (oper, f) {
 98
 99                         var changeCommand = String.format(cmd.command, f);
100
101                         console.log(String.format("{0} changed,command '{1}' execute...", f, changeCommand));
102
103                         exec(changeCommand, function (err, stdout, stderr) {
104
105                             console.log(err ? stderr : stdout);
106
107                         });
108
109                     });
110
111                 });
112
113
114
115             });
116
117         };
118
119         readFiles(source, watch);
120
121     };
122
123     return {start:start};
124
125 })(fs, exec, underscore).start(source, configs);

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

2:文件的合并

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

   3:javascript 产品包压缩

 1 var FILE_ENCODING = 'utf-8';
 2
 3 function uglify(srcPath, jsMinPath) {
 4
 5     var uglyfyJS = require('uglify-js'),
 6
 7        jsp = uglyfyJS.parser,
 8
 9        pro = uglyfyJS.uglify,
10
11        ast = jsp.parse( _fs.readFileSync(srcPath, FILE_ENCODING) );
12
13
14
15       ast = pro.ast_mangle(ast);
16
17       ast = pro.ast_a squeeze(ast);
18
19       _fs.writeFileSync(jsMinPath, pro.gen_code(ast), FILE_ENCODING);
20
21     console.log(' '+ jsMinPath +'完成.');
22
23 }
24
25 uglify(js/test.js', js/test.min.js');

我们可以尽力发挥自己的想象,如本地Build自动运行,快速集成快速反馈;代理服务器,处理不稳定服务的集成,带来稳定的开发,比如testacluar就是根据node.js能够很容易的构建web服务器,从jstd转过来的javascript test和coverage插件。。。

 

 

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2013/02/23/2923862.html

时间: 2025-01-30 10:44:11

利用Node.js本地构建的相关文章

使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目_node.js

Grunt 简介Grunt是一款基于js和node.js的构建工具,由于这段时间node.js越来越火爆,grunt拥有丰富的开源社区支持,产生了很多插件.还有一些插件散落在node社区.构建是一个和宽泛的表述,传统理解就是编译.打包.复制,而今,随着技术越来越丰富,构建还包括对前端组件的预处理,比如sass.less预处理成css,css和js的压缩和合并.grunt的插件可以很好的支持这些新的构建概念,而且更为适合用开源技术堆砌的项目. 虽然Grunt更多的用于程序构建,但是本质上Grunt

利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm

      作为一个好的Restfull Api不仅在于service url的语义,可读性,幂等,正交,作为http状态码也很重要,一个好的Http Status Code给使用者一个很好的响应,比如200表示正常成功,201表示创建成功,409冲突,404资源不存在等等.所以在做一个基于node.js+mongodb+angularjs的demo时发现node.js express没有提供相应的辅助类,但是本人不喜欢将201,404这类毫无语言层次语义的东西到处充斥着,所以最后决定自己写一个

我参加了Cloud Foundry博客征文大赛,我的参赛作品是:使用Node.js + Mongodb构建基于Cloud Foundry的项目

问题描述 我参加了CloudFoundry博客征文大赛,我的参赛作品是:使用Node.js+Mongodb构建基于CloudFoundry的项目www.wordmars.netwww.jzjyfc.comwww.fedtr.com 解决方案 解决方案二: 解决方案三: 解决方案四: 解决方案五: 好东西啊,,,,,解决方案六: 解决方案七: 不错,好东西

利用Node.JS实现邮件发送功能_node.js

第一步.配置篇 首先需要安装nodemailer库 npm install nodemailer//默认会安装最新的版本. 关于这个库的文档参见nodemailer 第二步.库的一些使用介绍 这个库使用方法很简单的.首先是要创建一个用于发送邮件的实例 var transporter = nodemailer.createTransport(transport[, defaults]) transport参数属性 属性太多了就只写一些关键的属性      port:连接的端口号,一般就是465  

Cloud Foundry参赛博文——使用Node.js + Mongodb构建基于Cloud Foundry的项目

问题描述 我参加了CloudFoundry博客征文大赛,我的参赛作品是:使用Node.js+Mongodb构建基于CloudFoundry的项目链接:

Node.js本地文件操作之文件拷贝与目录遍历的方法_node.js

文件拷贝NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件拷贝程序练手.与 copy 命令类似,我们的程序需要能接受源文件路径与目标文件路径两个参数. 小文件拷贝我们使用 NodeJS 内置的 fs 模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSync(dst, fs.readFileSync(src)); } function main(a

今天学习node.js 本地搭建

https://nodejs.org/en/download/官网下载地址 windows 安装 下一步下一步就OK了我们windows+r 进入cmd 命令 输入node -v 查看node.js 版本npm -v 查看是否安装npm ,npm的版本我们在D盘建立一个 js/test.js 文件test.js 内容 var http = require("http"); http.createServer(function(req, res) { res.writeHead( 200

利用Node.js制作爬取大众点评的爬虫_node.js

前言 Node.js天生支持并发,但是对于习惯了顺序编程的人,一开始会对Node.js不适应,比如,变量作用域是函数块式的(与C.Java不一样):for循环体({})内引用i的值实际上是循环结束之后的值,因而引起各种undefined的问题:嵌套函数时,内层函数的变量并不能及时传导到外层(因为是异步)等等. 一. API分析 大众点评开放了查询餐馆信息的API,这里给出了城市与cityid之间的对应关系, 链接:http://m.api.dianping.com/searchshop.json

利用Node.js获取项目根目录的小技巧_node.js

假设我们的js文件写在server目录中,但是我们的资源文件存储在app/img目录中. 实现功能 如下图,我们需要在server/index.js文件中使用fs读取app/img/favicon.ico文件. 实现方法 在node.js只提供了一个 dirname全局变量.通过 dirname可以获得"C:\wwwroot\yidata\server".这时需要用到path. 首先 import path from 'path'; (ES6)或var path = require (