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;
            }
        }
    };
})();
目录
相关文章
|
17天前
|
JavaScript 前端开发 Java
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
68 24
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
|
30天前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
2月前
|
JavaScript 前端开发 IDE
【编程向导】Js与Ts差异详解:选择与权衡
JavaScript 一直是 Web 开发的基石,以其灵活性和动态性著称,但其松散类型可能导致大型项目中出现难以调试的错误。TypeScript 作为 JavaScript 的超集,通过引入静态类型系统,提供了更高的类型安全性和更好的工具支持,尤其适合大型团队和复杂项目。本文详细对比了 JavaScript 和 TypeScript 的优缺点,并提供了实际代码示例,帮助开发者根据项目需求选择合适的工具。
140 2
|
7月前
|
前端开发
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
|
7月前
|
存储 JavaScript 前端开发
JavaScript编程实现tab选项卡切换的效果+1
JavaScript编程实现tab选项卡切换的效果+1
|
5月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
183 63
|
5月前
|
前端开发 JavaScript 持续交付
提高JavaScript编程效率
提高JavaScript编程效率
60 3
|
5月前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
47 2
|
7月前
|
JavaScript 前端开发
JavaScript基础知识-函数的参数
关于JavaScript函数参数基础知识的介绍。
67 4
JavaScript基础知识-函数的参数
|
7月前
|
JavaScript 前端开发
JavaScript 函数参数
JavaScript 函数参数
56 3