欢迎访问 licqi IT技术
我们一直在努力

利用Node.js进行构建本地

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

在这里我们要讲的是用Node.js来构建本地Build。构建本地Build,我们已经有很多选择,如AntMavenGradle等。为什么我们还需要Node.js?对于我们的开发中会有一些小的基本自动化构建,如文件的监控(Less编译)javascript的压缩,不稳定集成服务代理,快速的集成反馈,文件的迁移而对于项目来说我并不像引入太多的技术战, Node.js所使用的javascript是做web项目开发的一门必备技能,javascript作为一门比较容易入门语言,直从第一次接触Node.js,我爱不释手,由于我对Javascript基础,能够快速使用它,并不需要付出更多的学习成本,而且我感觉在服务端和客户端用同一种语言,在能一定代码重用妙不可言。而且Node.js提供了内置的web服务器,简单的文件监听,事件机制等也为做本地Build提供了很好的条件。

1:文件监听

  1. var fs = require("fs");
  2. var exec = require('child_process').exec
  3. var underscore = require("underscore");
  4. var configs = [
  5. {file:/.*.less/g, command:" dotless.Compiler.exe style.less style.css"}
  6. ];
  7. var source = "E:\Project\xxx\style";
  8. String.format = function () {
  9. var s = arguments[0];
  10. for (var i = 0; i < arguments.length - 1; i++) {
  11. var reg = new RegExp("\{" + i + "\}", "gm");
  12. s = s.replace(reg, arguments[i + 1]);
  13. }
  14. return s;
  15. };
  16. (function (fs, exec, underscore) {
  17. var readFiles = function (dir, done) {
  18. var results = [];
  19. fs.readdir(dir, function (err, list) {
  20. if (err) return done(err);
  21. var pending = list.length;
  22. if (!pending) return done(null, results);
  23. list.forEach(function (file) {
  24. file = dir + '/' + file;
  25. fs.stat(file, function (err, stat) {
  26. if (stat && stat.isDirectory()) {
  27. readFiles(file, function (err, res) {
  28. results = results.concat(res);
  29. if (!--pending) done(null, results);
  30. });
  31. } else {
  32. results.push(file);
  33. if (!--pending) done(null, results);
  34. }
  35. });
  36. });
  37. });
  38. };
  39. var start = function (source, configs) {
  40. var watch = function (error, list) {
  41. configs.forEach(function (cmd) {
  42. var files = underscore.filter(list, function (n) {
  43. return n.match(cmd.file);
  44. });
  45. files.forEach(function (file) {
  46. fs.watch(file, function (oper, f) {
  47. var changeCommand = String.format(cmd.command, f);
  48. console.log(String.format("{0} changed,command '{1}' execute...", f, changeCommand));
  49. exec(changeCommand, function (err, stdout, stderr) {
  50. console.log(err ? stderr : stdout);
  51. });
  52. });
  53. });
  54. });
  55. };
  56. readFiles(source, watch);
  57. };
  58. return {start:start};
  59. })(fs, exec, underscore).start(source, configs);

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

2:文件的合并

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

3javascript 产品包压缩

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

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

赞(0) 打赏
未经允许不得转载:licqi IT技术 » 利用Node.js进行构建本地
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏