util.parseArgs()



Вот уже 3 года тянется дискуссия на тему стандартного способа парсить CLI аргументы в Node.js.



Внутри скриптов нам хочется понимать какие флаги и с какими опциями передал пользователь и как-то менять поведение утилиты. В ноде эти опции можно получить через process.argv.



Запустив, например, команду для билда сторибука:

yarn build-storybook --output-dir dist/selene-static/storybook --quiet



Вызвав process.argv(), получим следующее:



[

"/Users/v7rulnik/.fnm/node-versions/v16.10.0/installation/bin/node",

"/Users/v7rulnik/projects/aviasales/selene/node_modules/@storybook/react/bin/build.js",

"--output-dir",

"dist/selene-static/storybook",

"--quiet"

]




Т.е. просто плоский список с разделением по пробелам. Работать с ним, прямо скажем, не очень удобно. Это послужило появлению yargs и minimist, которые упрощают парсинг, группируют название и опции и т.д.



И вот, в рамках обсуждения из ишью появилось предложение встроить в ноду утилиту для парсинга util.parseArgs(). Уже доступен полифилл @pkgjs/parseargs, но использовать его пока что не стоит. Это всего лишь proof of concept, который будут дорабатывать и, позже, он окажется доступен в самой ноде.





P.S. Если взглянуть на массив аргументов, то будет видно, что первым элементом всегда является путь до node. А вторым скрипт, который мы запускаем. Именно поэтому часто можно встретить process.argv.slice(2) — такиим образом обрезают два первых элемента, которые не содержат полезной информации.