美文网首页
Node.js编程快餐(2) - 处理命令行参数

Node.js编程快餐(2) - 处理命令行参数

作者: Jtag特工 | 来源:发表于2017-02-14 17:07 被阅读38次

    处理命令行参数

    我们要用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编程快餐(2) - 处理命令行参数

          本文链接:https://www.haomeiwen.com/subject/rjamsttx.html