与我联系

我对 nodejs 的"鸡肋"情节

2015-6-25 一诺 nodeJS

        对于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想要函数同步执行怎么做?

标签: nodejs bat

分享这篇文章
赞助鼓励:如果觉得内容对您有所帮助,您可以支付宝(左)或微信(右):

声明:如无特殊注明,所有博客文章版权皆属于作者,转载使用时请注明出处。谢谢!

发表评论:

皖ICP备15010162号-1 @2015 勿恨水长东
qq:1614245331 邮箱:13515678147@163.com Powered by
emlog