跳到主要内容

Nodejs使用内置函数解析参数

· 3 分钟阅读 · - · - ·

昨天(2022-08-16) Nodejs 发布了 Node v16.17.0 (LTS)更新日志,主要包含了下面几个实验性的重大更新:

  1. 命令行参数解析器 API
  2. ESM 加载器钩子 API
  3. 测试运行器
  4. 改进 Web 加密 API 的互操作性

其中命令行参数解析器 API引发了我的兴趣,之前解析 node 的命令行参数要靠commanderyargs 等参数解析包。现在 Nodejs 内置参数解析工具,我们又多了一个选择。

我们先来看一下官方给的例子:

import { parseArgs } from "node:util";
const args = ["-f", "--bar", "b"];
const options = {
foo: {
type: "boolean",
short: "f",
},
bar: {
type: "string",
},
};
const { values, positionals } = parseArgs({ args, options });
console.log(values, positionals);
// Prints: [Object: null prototype] { foo: true, bar: 'b' } []

解析参数使用的是 utils 模块下的 parseArgs 函数,该函数接收一个参数 config 用来传入参数内容和配置参数解析行为,定义如下:

function parseArgs<T extends ParseArgsConfig>(config: T): ParsedResults<T>;

interface ParseArgsOptionConfig {
type: "string" | "boolean";
short?: string;
multiple?: boolean;
}

interface ParseArgsOptionsConfig {
[longOption: string]: ParseArgsOptionConfig;
}

interface ParseArgsConfig {
strict?: boolean;
allowPositionals?: boolean;
tokens?: boolean;
options?: ParseArgsOptionsConfig;
args?: string[];
}

type PreciseParsedResults<T extends ParseArgsConfig> = IfDefaultsFalse<
T["tokens"],
{
values: ParsedValues<T>;
positionals: ParsedPositionals<T>;
tokens: ParsedTokens<T>;
},
{
values: ParsedValues<T>;
positionals: ParsedPositionals<T>;
}
>;

type ParsedResults<T extends ParseArgsConfig> = ParseArgsConfig extends T
? {
values: {
[longOption: string]:
| undefined
| string
| boolean
| Array<string | boolean>;
};
positionals: string[];
tokens?: Token[];
}
: PreciseParsedResults<T>;

我们写代码来实际看看效果如何:

parseArgsTest.js
const { parseArgs } = require("node:util");
const options = {
help: { type: "boolean", short: "h" },
path: { type: "string", short: "p" },
type: { type: "string", short: "t" },
};

const result = parseArgs({
// 第0个参数是node,第1个是脚本,第2个参数开始才是传给脚本的参数
args: process.argv.slice(2),
options,
});

console.log(result);

使用 node parseArgsTest.js --path path/to/file -t firmware 运行上面的文件以后会得到类似下面的结果。

输出结果
{
"values": {
"path": "path/to/file",
"type": "firmware"
},
"positionals": []
}

内置的参数解析从功能上虽然没有commanderyargs 等参数解析包丰富,但好处在于不用安装额外的包,使用方便。

该内容为何方原创,转载请注明本页地址
https://iamhefang.cn/code/Nodejs使用内置函数解析参数