知向前端
我对 nodejs 的"鸡肋"情节
2015-6-25 Jon
        对于nodeJS,与我很长一段时间而言,就和gitHub一样,都有一种鸡肋的情节,'食之无肉,弃之可惜'。


        早就听说了nodejs,说是很了不起,大家都说好,可以做的事情实在太多,而且语言是 js ,当时莫名的兴奋,好像自己很容易就能学会似的。于是尝试着写各种node,hello world就首当其冲的成为了我的node生涯的第一个程序。成功运行后,有点小小的得意,觉得也不过如此吧。



        接下来的学习让我很快否定了'不过如此'的观点。也曾多次游走在百度搜狗、出没于各个论坛博客。几多尝试着用node做些事情的时候还是摸不到头脑,应该是自己没有沉下心来,就开始怀疑自己适不适合写 node ,几次放弃又拾起,只是因为不甘。


        对于前端来说,会存在这很多重复的工作,而这些也是前端所不能容忍的,毕竟我们是脑力劳动者,是很成功人士的,哈哈,即使是大量的ctrl+c和ctrl+v也无异于是在干体力活。


        为了学习node和减少体力劳动,我自己开始想着使用node写个批处理文件的操作,历时近两天后终于完成,总的代码并不多,因为是新手,大量时间用来调试和修改代码,代码质量写的不高,和大神比起来也只能望其项背。但基本功能全部实现,用起来还是很方便,在感受node强大的同时,也让我对node重拾了信心,下面附上源码,欢迎指正。



需求说明:将动态改变 title 的内容,并且会在底部加上移动客服代码







/*

    实现效果:

    改变前

      <!DOCTYPE html>

      <html lang="en">

      <head>

        <meta charset="UTF-8">

        <title>Document</title>

      </head>

      <body>

        <a href="#">这个标题会到 title 中</a>

        <div>将动态改变 title 的内容,并且会在底部加上移动客服代码</div>

        <!-- 代码 -->

      </body>

      </html>

    改变后

      <!DOCTYPE html>

      <html lang="en">

      <head>

        <meta charset="UTF-8">

        <title>这个标题会到 title 中</title>

      </head>

      <body>

        <a href="#">这个标题会到 title 中</a>

        <div>将动态改变 title 的内容,并且会在底部加上移动客服代码</div>

        <!-- 代码 -->

        这里是移动客服代码

      </body>

      </html>

*/









run.js:







/*

  操作文件模块

*/

var fs = require('fs');



/*

  解压文件模块

*/

// npm install unzip

var unzip = require('unzip');



// 定义个需要执行命令的 html 文件

var folder=[];



// 定义个盛放文件的数组

var fileList=[];



// 遍历指定文件夹中所有文件的方法

function walks(path){

  var dirList = fs.readdirSync(path);

  dirList.forEach(function(item){

    if(fs.statSync(path + '/' + item).isFile()){

      fileList.push(path + '/' + item);

    }

  });

  dirList.forEach(function(item){

    if(fs.statSync(path + '/' + item).isDirectory()){

      walks(path + '/' + item);

    }

  });

}



// 初始状态

console.log('正在处理,请稍后...');

walks('.');

function ergodic1(){

  fileList.forEach(function (filename) {

    var t1=filename.lastIndexOf('/');

    var catalog=filename.substring(0,t1+1);

    if(filename.indexOf('.zip')!=-1&&filename.indexOf('wap/')==-1){

      fs.createReadStream(filename).pipe(unzip.Extract({ path: catalog}));

      fs.unlinkSync(filename);

    }

  })

}

function ergodic2(){

  fileList=[];

  walks('.');

  fileList.forEach(function (filename) {

    var t1=filename.lastIndexOf('/');

    var catalog=filename.substring(0,t1+1);

    if(filename.indexOf('.zip')!=-1&&filename.indexOf('wap/')!=-1){

      fs.unlinkSync(filename);

    }

    // 获得需要操作的 html 文件

    if(filename.indexOf('wap/')!=-1&&filename.indexOf('.html')!=-1){

      folder.push(filename);

    }

  })

}

function ergodic3(){

  if(!folder.length){

    console.log('没有需要操作的文件...');

    return;

  }

  var j=0;

  while (j<folder.length) {

    var opath=folder[j];

    console.log(opath);

    // 读取文件  路径/编码 注:这里读写文件使用同步

    var data =fs.readFileSync(opath,'utf-8');

    // 获得 title 中应该写入的文本

    var result=data.substring(data.indexOf('<a href="#">')+12,data.indexOf('</a>'));

    // 执行改变 title 文本

    var dataText=data.replace('Document',result);

    // 判断客服是否存在

    if(dataText.indexOf('script></body>')==-1){

      // 执行添加 移动客服代码

      var dataText=dataText.replace('</body>','<script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src=\'" + _bdhmProtocol + "hm.baidu.com/h.js%3Fa360d495157e0b98392c67f8a0629e0a\' type=\'text/javascript\'%3E%3C/script%3E")) </script></body>')

    }

    // 将修改后的文件写入源文件

    fs.writeFileSync(opath,dataText,'utf-8');

    j++;

  }

  console.log('恭喜,操作完成!!!');

}

ergodic1();

setTimeout(ergodic2, 2000);

setTimeout(ergodic3, 3000);





/*

  优点:

    一次运行,全部搞定。



  使用文档:

    0,放的文件名需要是 wap 或者解压后是 wap 。

    1,放的文件可以和 run.js 同级,也可以在 run.js 的同级文件夹下面。

    2,每个同级目录下只能放一个要处理的 wap 压缩包文件或者 wap 包文件。

    3,wap 包中若存在压缩文件将自动删除。

    4,放好需要做的文件后,将可以用三种方式运行 run.js

      (0),.bat操作:双击 run.bat 即可。

      (1),命令行:在该目录下,shift+右键->在此处打开命令窗口->输入 'node run.js',即可。

      (2),sublime: 使用 sublime 打开 run.js  ctrl+b 即可运行。

    5,若出错误,请仔细参考前 3 条。



  编辑于15/6/25

  首发博客:http://www.yuanqiao.comxa.com/post-60.html



*/





/*



    实现效果:将动态改变 title 的内容,并且会在底部加上移动客服代码



    改变前

      <!DOCTYPE html>

      <html lang="en">

      <head>

        <meta charset="UTF-8">

        <title>Document</title>

      </head>

      <body>

        <a href="#">这个标题会到 title 中</a>

        <div>将动态改变 title 的内容,并且会在底部加上移动客服代码</div>

        <!-- 代码 -->

      </body>

      </html>



    改变后

      <!DOCTYPE html>

      <html lang="en">

      <head>

        <meta charset="UTF-8">

        <title>这个标题会到 title 中</title>

      </head>

      <body>

        <a href="#">这个标题会到 title 中</a>

        <div>将动态改变 title 的内容,并且会在底部加上移动客服代码</div>

        <!-- 代码 -->

        这里是移动客服代码

      </body>

      </html>

*/









补充:



run.bat 文件(方便操作,也可不使用)



    1,定义个.txt并写入 node run.js 保存在 run.js 同级目录下。



    2,将后缀 .txt 改为 .bat。



    3,双击 run.bat 文件即可运行 run.js








使用说明:




  优点:

    一次运行,全部搞定。

  使用文档:

    0,放的文件名需要是 wap 或者解压后是 wap 。

    1,放的文件可以和 run.js 同级,也可以在 run.js 的同级文件夹下面。

    2,每个同级目录下只能放一个要处理的 wap 压缩包文件或者 wap 包文件。

    3,wap 包中若存在压缩文件将自动删除。

    4,放好需要做的文件后,将可以用三种方式运行 run.js

      (0),.bat操作:双击 run.bat 即可。

      (1),命令行:在该目录下,shift+右键->在此处打开命令窗口->输入 'node run.js',即可。

      (2),sublime: 使用 sublime 打开 run.js  ctrl+b 即可运行。

    5,若出错误,请仔细参考前 3 条。









作者疑惑:nodejs异步编程怎么才能避免使用setTimeout,即:发现不适用setTimeout会报错,node想要函数同步执行怎么做?

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容