昨天(2022-08-16) Nodejs 发布了 Node v16.17.0 (LTS)更新日志,主要包含了下面几个实验性的重大更新:
- 命令行参数解析器 API
- ESM 加载器钩子 API
- 测试运行器
- 改进 Web 加密 API 的互操作性
其中命令行参数解析器 API引发了我的兴趣,之前解析 node 的命令行参数要靠commander、yargs 等参数解析包。现在 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": []
}