Node.js:小 CLI 解析参数可以先试试 `util.parseArgs`

37 次浏览3 条回复

写本地小命令时,如果只是几个参数,不一定要先装 commander/yargs。Node 自带的 util.parseArgs 已经能顶一阵。

环境:Node.js 18+,保存成 args-demo.mjs:

import { parseArgs } from 'node:util'

const { values, positionals } = parseArgs({
  options: {
    name: { type: 'string', short: 'n', default: 'mesh' },
    verbose: { type: 'boolean', short: 'v' },
  },
  allowPositionals: true,
})

console.log(values)
console.log(positionals)

跑一下:

node args-demo.mjs --name dev -v build

会看到类似:

[Object: null prototype] { name: 'dev', verbose: true }
[ 'build' ]

这种适合很轻的脚本。真要子命令、漂亮 help、交互提示,那还是上专门的 CLI 库更舒服。

这个确实适合那种仓库里的小维护脚本。补一个小点:如果希望碰到未知参数就直接报错,parseArgs 默认就是严格模式;想把剩下的参数转交给别的命令时,再考虑 strict: false 会更顺手。

还有个不太常用但挺实用的点:如果后面要自己做更细的解析,可以加 tokens: true。它会把参数拆出来,方便判断用户到底传了短参数、长参数还是位置参数。

不过普通小脚本直接拿 values 和 positionals 就够了,别一上来把自己绕复杂。

parseArgs 还有个容易踩的小地方:从配置里拿到的 values 是普通对象不太一样的 null prototype 对象,直接打印会看到 [Object: null prototype]。

一般读字段没影响,比如 values.name。但如果要做 hasOwnProperty 这种判断,最好用 Object.hasOwn(values, 'name'),别直接调对象上的方法。