Node.js編程快餐(2) - 處理命令行參數

處理命令行參數

我們要用Node.js寫腳本的話,第一件事要處理的就是命令行參數。

就像下面的C++代碼一樣,命令行參數通過argc和argv傳進來。

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    cout <<"argc="<<argc<<endl;
    cout << "Hello world!" << endl;
    return 0;
}

我們翻譯成Node語句,差不多是下面這樣:

(function main() {
    var argc = process.argv.length;
    console.log(argc);
    console.log(process.argv);
    console.log('Hello,World');

    process.exit(0);
})();

process模塊

我們開始看看幕后英雄process模塊,這其中包含了寫普通代碼中最重要的一些信息。這個模塊是個全局的模塊,可以在任意處訪問。

平臺環境相關

通過下面的屬性,可以獲取架構、平臺、命令行參數、環境變量等運行信息

  • process.arch:硬件架構,如arm, ia32, x64
  • process.platform:軟件平臺
  • process.argv: 命令行參數,至少有兩個:第一個是Node,第二個是當前的js文件
  • process.env: 環境變量,寫了不影響別的進程

工作目錄

  • process.chdir(): 改變工作目錄
  • process.cwd(): 獲到當前工作目錄名

如何計時

先用process.hrtime()函數打個樁,存起來。運行完要計時的代碼之后,將保存的值做為參數再調用process.hrtime()函數,請參照下面的示例:

var timeStart = process.hrtime();

//要計時的代碼

var spendTime = process.hrtime(timeStart);
console.log(spendTime);
console.log("Cost time:" + (spendTime[0] * 1000 + spendTime[1] / 1000 / 1000) + "ms");

hrtime()返回值是一個列表,第1個元素是秒,第2個元素是納秒。

查看內存使用情況

通過process.memoryUsage()來查看
例:

console.log(process.memoryUsage());

輸出的結果類似于這樣:

{ rss: 19107840, heapTotal: 9587968, heapUsed: 4867064 }

例程

我們學習了頭兩講之后,下面用一個小例子來練習一下吧。需求是這樣的,我用MarkDown格式寫的文章,想轉換成Confluence的格式。
我們只是說明一下Node.js寫命令行應用的寫法,將業務模型簡化一下,只管這樣的格式符的替換:

{
            "^```java": "{code:java}",
            "^```js": "{code:js}",
            "^#### ": "h6. ",
            "^### ": "h5. ",
            "^## ": "h3. ",
            "^# ": "h1. ",
            "^```cpp": "{code:cpp}",
            "^```python": "{code:python}",
            "^```r": "{code:r}",
            "^```ruby": "{code:ruby}",
            "^```": "{code}",
}

綜合前面所講的按行讀文件和處理命令行參數的功能,通過字符串替換實現這個需求。

(function md2docs() {
    "use strict"
    const readline = require('readline')
    const fs = require("fs");

    const file_out = "./out-" + (new Date()).getTime() + ".confluence"
    var file_input;

    if (process.argv.length <= 2) {
        console.log("Usage:" + process.argv[0] + " " + process.argv[1] + " filename.md");
        process.exit(1);
    } else {
        file_input = process.argv[2];
    }

    var timeStart = process.hrtime();

    const r1 = readline.createInterface({
        input: fs.createReadStream(file_input)
    });

    r1.on('line', (line) => {
        if (!markdown2docs(line)) {
            fs.appendFileSync(file_out, line + "\n");
        }
    });

    var spendTime = process.hrtime(timeStart);
    console.log(spendTime);
    console.log("Cost time:" + (spendTime[0] * 1000 + spendTime[1] / 1000 / 1000) + "ms");

    function markdown2docs(line) {
        const md2docMap = {
            "^```java": "{code:java}",
            "^```js": "{code:js}",
            "^#### ": "h6. ",
            "^### ": "h5. ",
            "^## ": "h3. ",
            "^# ": "h1. ",
            "^```cpp": "{code:cpp}",
            "^```python": "{code:python}",
            "^```r": "{code:r}",
            "^```ruby": "{code:ruby}",
            "^```": "{code}",
        }

        var mdkeys = Object.keys(md2docMap);

        for (let i = 0; i < mdkeys.length; i++) {
            let key = mdkeys[i];
            let re = new RegExp(key);
            re.compile(re);
            if (re.test(line)) {
                let docLine = line.replace(re, md2docMap[key]);
                fs.appendFileSync(file_out, docLine + "\n");
                console.log(docLine);
                return true;
            }
        }
    };
})();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一種編程語言是否易用,很大程度上,取決于開發命令行程序的能力。 Node.js 作為目前最熱門的開發工具之一,怎樣...
    豬豬9527閱讀 755評論 0 1
  • Node.js是目前非常火熱的技術,但是它的誕生經歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,642評論 2 41
  • Node.js是目前非常火熱的技術,但是它的誕生經歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    Myselfyan閱讀 4,103評論 2 58
  • 本文由我首發于 GitChat 中。 前言 在 Node.js 開發領域中,原生 C++ 模塊的開發一直是一個被人...
    機巧死月不會碼代碼閱讀 5,275評論 6 24
  • 本以為這是一部討論宗教的電影,看罷才發現,電影說的是人性。 電影《暗色天堂》改編自莊梅巖的舞臺劇《法吻》,講述了本...
    老湯老濕閱讀 926評論 0 0