處理命令行參數
我們要用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;
}
}
};
})();