<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • nodejs高級編程使用(nodejs開源項目)


    需求來源于生活。

    在日常開發中,經常會頻繁地做一些重復性的操作,作為一名程序員,解放雙手的時刻到了。

    比如說:批量修改某些文件的后綴,我對于一些shell或者win下的命令不是很熟悉,稍微了解的就是自己的開發語言,所以用熟悉的工具做事還是可以帶來一些成就感的。

    下面我準備針對這個小小的需求開發一個自己的命令行,當然如果能幫助到其他人,那就更加地滿足了。閑話不多說,下面直接開始。

    需求整理

    1. 可以對某個文件夾下的所有文件進行后綴的修改
    2. 可以限定某類后綴修改為指定的后綴
    3. 可以指定目標文件夾
    4. 同時可以隨機重命名

    準備

    環境 : nodejs
    編輯工具 : sublime

    大體流程

    1. 在github上創建自己想要的倉庫changeext(命名)
    2. 將倉庫clone到本地進行開發、測試
    3. 發布到github
    4. 發布到npm
    5. 安裝到本地進行使用大功告成

    步驟分解

    一些帳號注冊、倉庫創建就不再說了,主要說下開發的具體流程 先來一段偽代碼:

    1.確定目標文件夾、一些相關的參數(是否重命名、源后綴、目標后綴)
    2.獲得目標文件夾下的所有文件(符合源后綴)
    3.對符合條件的文件進行重命名(修改后綴)
    4.結束,對,流程很簡單,實現起來也不麻煩,但是起碼這是自己的小工具啊,哪怕網上再多也是別人的

    開發中使用的module:

    minimist(命令行參數處理) 
    fs(操作文件) 
    path(處理文件路徑) 
    colors(讓打印信息更加好看)

    核心代碼如下:

    #!/usr/bin/env node
    //作為命令行工具,第一行就是上面的這貨,千萬別少了
    var fs = require('fs');
    var path = require('path');
    var colors = require('colors');
    //指定一些顏色信息
    colors.setTheme({
      error : 'red',
      success : 'green',
      info : 'yellow'
    });
    //獲得命令行的參數
    var argv = require("minimist")(process.argv.slice(2), {
      alias: {
        'input': 'i',
        'target': 't',
        'directory': 'd',
        'loop' : 'l',
        'random' : 'r'
      },
      string: ['input', 'target','directory'],
      boolean : ['loop','random'],
      'default': {
        'directory': process.cwd()
      }
    });
    //打印幫助信息
    if (argv.help) {
      console.log("Usage:".info);
      console.log("  changeext --help     // print help information".success);
      console.log("  changeext txt js     // change 'txt' to 'js' ".success);
      console.log("  changeext -i txt     // input file extensions".success);
      console.log("  changeext -t js      // target file extensions".success);
      console.log("  changeext -d /home/  // target directory for change".success);
      console.log("  changeext -l         // loop file directory for change file extensions".success);
      console.log("  changeext txt js -r  // get some random name");
      process.exit(0);
    }
    //隨機獲得一個隨機字符串
    function getRandom(){
      var counter = 0;
      return (function() {
          var guid = (+new Date()).toString( 32 ),i = 0;
          for ( ; i < 5; i++ ) {
              guid += Math.floor( Math.random() * 65535 ).toString( 32 );
          }
          return  guid + (counter++).toString( 32 );
      })();
    }
    //重命名
    function rename (folderPath,input,target,loop){
      fs.stat(folderPath,function(err,stats){
        if(err){
          console.log(err);
        }else{
          if(stats.isDirectory()){
            if(loop === true && argv.loop === false){
              return false;
            }
            if(loop === false && argv.loop === false){//不需要循環,但是目標路徑為文件夾
              loop = true;
            }
            fs.readdir(folderPath,function(err2,files){
              if(err2){
                console.log(err2);
              }else{
                if(files && files.length > 0){
                  files.forEach(function(filename,index){
                    rename(path.join(folderPath,filename),input,target,loop);
                  });
                }
              }
            });
          }else{
            var extname = path.extname(folderPath);
            input = input.startsWith('.') || input == '' ? input : '.'+input;
            target = target.startsWith('.') || target == '' ? target : '.'+target;
            extname = extname.toLowerCase();
            input = input.toLowerCase();
            target = target.toLowerCase();
            if(extname === input){
              var newPath = "";
              if(argv.random){
                var randomName = getRandom() + target;
                newPath = path.join(path.dirname(folderPath),randomName);
              }else{
                newPath = folderPath.substring(0,folderPath.length - extname.length) + target;  
              }
              fs.rename(folderPath,newPath,function(err){
                if(err){
                  console.log(err);
                }else{
                  console.log('Rename file : '+folderPath.info +' => '+newPath.info+' success.'.success);  
                }
              });
            }
          }
        }
    
      });
    }
    //校驗
    if(argv.directory && fs.existsSync(argv.directory)){
      if( (argv.input && argv.target) || (argv.input === '' && argv.target) || (argv.input && argv.target === '') ){
        rename(argv.directory,argv.input,argv.target,argv.loop);
      }else{
        if(argv._[0] && argv._[1]){
          rename(argv.directory,argv._[0],argv._[1]);
        }else{
          console.log('input file extensions and target file extensions must be not empty.'.error);  
          process.exit(0);
        }
      }
    }else{
      console.log('directory is not exists.'.error);
      process.exit(0);
    
    }
    

    然后我們就針對代碼進行本地測試開發自己的nodejs命令行工具并使用工具

    image.png

    OK,測試成功,然后把代碼發布到github(此處流程可以google),然后將自己的代碼發布到npm官網。

    npm publish 
    //這里經常出問題 
    //1.首先,要注冊一個npm官網的帳號。 
    //2.然后登錄 
    npm login 
    //3.確認帳號 
    npm whoami 
    //4.發布即可。 有時候會發布報錯,可能的原因是 registry 改過了,只需要再改回來即可。 
    //npm config set registry http://registry.npmjs.org
    npm publish 
    

    然后,我們就可以開心地下載自己的工具來666了。

    命令行工具:changeext

    本文中的命令行工具為 changeext

    可以很方便地變更指定后綴到目標后綴或重命名,同時附帶了一個簡單的加密,可以悄悄地隱藏文件咯,比如:

    //全局安裝
    npm i changeext -g 
    //將mp4 修改為 bin文件,并做簡單加密。默認是在當前執行命令的目錄下查找并執行
    changeext mp4 bin -e
    //如果要修改回來則是
    changeext bin mp4 -e

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费