by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。

本文地址:http://www.iamaddy.net/2014/07/firstnode/

自node横空出世来,业界充满了各种流言,众说纷纭。在性能、高并发方面如数家珍的对node称赞不已。但公司的业务在node上的尝试却很少,一来是新的东西,需要探索,稳定性有待考验;二来,既然已经有成熟的框架,而且能够轻车路熟的用起来,为何就要选择node。而node对大多数后台的开发来说语法上就是一道屏障,虽然屏障浅显,但习惯C++不愿去尝试新的东西,况且node没让他们觉得多牛逼。

但对前端的开发就不一样了,整天就在javascript中捣腾,能换个环境来捣腾就更有用武之地了,像是从此翻身了,不被后台同学开不起,也能够搞多线程,也能够做高并发等等。语言上的统一更容易诞生全栈工程师,从前走到后一竿子捅到底,这也算是一点好处吧。分工所带来的坏处与好处在《国富论》中讲的很明白。但从个人发展上来讲,我觉得既要有深度又要有广度。深度让老板觉得你专业,广度让老板觉得你靠谱。话又扯远了,回到node吧。

在日常工作中,作为前端,每天都有跟各种页面打交道。为了SEO,有些页面必须做成静态的,不能用javascript来渲染,数据由后台来输出,这就是传统的生成静态页的方式。有时候模板经常变化,而前端需要敲命令去生成新的页面,很麻烦。遇到不会linux的前端更是头疼了,有不有办法可以省去生成页面这步了?办法当然是有的,让程序自己去跑。

C++应该也能够做到,但作为前端,C++用的很蹩脚。所以就那node来写一个自动的生成页面的脚本。原理是这样的:

  • node启动一个server,监听模块文件
  • 一旦模板发送变化,调用命令生成页面

node提供的一个接口:

fs.watchFile(filename, [options], listener)

同时改变的文件可能有多个,需要一个队列,依次处理。
通过启用一个子进程来生成页面:

  var cp = require('child_process');
  //exec
  cp.exec('xxxx make template',{}/*options, [optiona]l*/, function(err, stdout, stderr){
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
  })

执行上面的程序遇到一个错误,报了个异常maxBuffer exceeded,后来发现是options的问题,exec的默认options是:

{ 
    encoding: 'utf8',
    timeout: 0, /*子进程最长执行时间 */
    maxBuffer: 200*1024,  /*stdout和stderr的最大长度*/
    killSignal: 'SIGTERM',
    cwd: null,
    env: null
  }

将maxBuffer的值改大一些即可。在执行程序的过程中需要写一些日志,以方便定位问题,写文件的接口如下:

// 追加文件的方式写文件,可参考node的api
var fs = require('fs');
fs.open("a.txt", "a+", function(err, fd){
    var writeBuffer = new Buffer('make xxx file success')
    fs.write(fd, writeBuffer, 0, writeBuffer.length, null, function(){
        console.log('success');
        fs.close(fd);
    });
});

在linux客户端执行node make.js就能监听文件,开始生成页面了,当客户端关闭时,该进程就关闭了。引起需要让起作为一个后台进程运行,也可作为守护进程运行。可以有已下两种方式

nohup node make.js &
sudo npm install forever -g
//使用forever启动守护进程:
forever start server.js
// 关闭守护进程:
forever stop server.js
// 如果需要记录输出日志和错误:
forever start -l forever.log -o out.log -e err.log server.js

这样一来,一旦模板文件变化就能生成页面了,虽说不能大大的提高效率,但也能节省一些时间。一旦一件事需要重复的做三次以上,我们就要考虑是不是应该让程序来做,这样工作的心情也会更愉悦些。

参考:
http://yangchunhe.iteye.com/blog/1568073
http://nodeapi.ucdok.com/#/api/
http://deadhorse.me/nodejs/2011/12/18/nodejs%E4%B8%ADchild_process%E6%A8%A1%E5%9D%97%E7%9A%84exec%E6%96%B9%E6%B3%95%E5%92%8Cspawn%E6%96%B9%E6%B3%95.html

本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作

本文地址:http://www.iamaddy.net/2014/07/firstnode/

想要打赏?你的鼓励是我前进的动力! addy打赏二维码

关注个人公众号web_lab,不定期更新一些干货~ web_lab公众号