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

简介: Node.js写独立运行程序快餐的第二节 - 如何处理环境信息,如命令行参数,环境变量等

处理命令行参数

我们要用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;
            }
        }
    };
})();
目录
相关文章
|
1月前
|
前端开发 JavaScript 开发者
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
|
1月前
egg.js 24.18参数验证
egg.js 24.18参数验证
28 0
egg.js 24.18参数验证
|
1月前
|
JavaScript 前端开发 API
js截取图片地址后面的参数和在路径中截取文件名或后缀名
在处理网页上的图片资源或者其他类型的文件资源时,你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景:
11 0
|
8天前
|
JavaScript
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集
|
13天前
|
JavaScript 前端开发
为 setTimeout 或 setInterval 提供一个字符串作为第一个参数(js的问题)
为 setTimeout 或 setInterval 提供一个字符串作为第一个参数(js的问题)
|
23天前
|
JavaScript
js开发:请解释什么是ES6的默认参数(default parameters),并给出一个示例。
ES6允许在函数参数中设置默认值,如`function greet(name = &#39;World&#39;) {...}`。当调用函数不传入`name`参数时,它将默认为&#39;World&#39;,提升代码简洁性和可读性。例如:`greet()`输出&quot;Hello, World!&quot;,`greet(&#39;Alice&#39;)`输出&quot;Hello, Alice!&quot;。
14 4
|
28天前
|
存储 JavaScript 编译器
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
|
29天前
|
前端开发 JavaScript
|
1月前
|
JavaScript
JS动态参数arguments与剩余参数
JS动态参数arguments与剩余参数
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句