相关内容
  1. Linux如何使用系统自带包管理命令安装官方Nodejs
  2. 解决Electron通知栏图标会自动消失问题
  3. Ubuntu 安装软件的几种方法
  4. Ubuntu 18.04 如何使用命令安装官方nodejs
  5. Webpack 如何使用Typescript做为配置文件?
  6. 如何使用ffmpeg去除视频声音?
  7. 如何在windows中使用命令行(choco)安装软件?
  8. 如何解决Express经过Nginx代理后req.ip不正确问题?

Nodejs使用内置函数解析参数

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

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

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

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


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>;

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

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 等参数解析包丰富,但好处在于不用安装额外的包,使用方便。

发表评论