CLI фреймворк для JavaScript (Node.js): создаём мощные консольные приложения
Разработка консольных (CLI) утилит — одна из ключевых задач в экосистеме Node.js. Будь то автоматизация сборки, управление пакетами, генерация кода или простые скрипты для DevOps — без качественного CLI-фреймворка не обойтись. В этой статье мы разберём три самых популярных инструмента: Commander, Yargs и Inquirer. Вы узнаете, как они работают, в чём их сильные стороны, и увидите примеры кода.
Зачем нужен CLI фреймворк?
Написать простую консольную программу можно и без фреймворка — достаточно обработать process.argv. Но как только проект разрастается, появляются подкоманды, флаги, интерактивные подсказки — ручное парсинг аргументов становится адом. Фреймворки берут на себя:
- парсинг аргументов и опций;
- генерацию справки (
--help); - валидацию входных данных;
- поддержку подкоманд (как в
git); - интерактивные диалоги с пользователем.
Commander — классика и стандарт
Commander — самый популярный CLI-фреймворк для Node.js. Его используют такие гиганты, как Vue CLI, NestJS и многие другие. Основные фишки: интуитивный API, автоматический вывод справки, поддержка вариативных аргументов.
Пример простого приложения:
#!/usr/bin/env node
const { Command } = require('commander');
const program = new Command();
program
.name('greet')
.description('Приветствие пользователя')
.version('1.0.0');
program
.command('hello')
.argument('<name>', 'Имя пользователя')
.option('-l, --lang <language>', 'Язык приветствия', 'ru')
.action((name, options) => {
if (options.lang === 'ru') {
console.log(`Привет, ${name}!`);
} else {
console.log(`Hello, ${name}!`);
}
});
program.parse();
Запуск: node app.js hello Иван --lang ru → Привет, Иван!
Commander автоматически генерирует справку по --help и поддерживает цепочки вызовов. Это идеальный выбор для большинства CLI-утилит.
Yargs — гибкость и удобство
Yargs — ещё один мощный фреймворк, который особенно силён в парсинге сложных опций и автоматическом определении типов. Он популярен в среде разработчиков, которым нужен тонкий контроль над аргументами.
Пример с Yargs:
#!/usr/bin/env node
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');
const argv = yargs(hideBin(process.argv))
.command('calc', 'Калькулятор', (yargs) => {
return yargs
.option('a', { describe: 'Первое число', type: 'number', demandOption: true })
.option('b', { describe: 'Второе число', type: 'number', demandOption: true })
.option('op', { describe: 'Операция (sum, sub)', type: 'string', default: 'sum' });
}, (argv) => {
const { a, b, op } = argv;
if (op === 'sum') console.log(`Сумма: ${a + b}`);
else if (op === 'sub') console.log(`Разность: ${a - b}`);
else console.log('Неизвестная операция');
})
.demandCommand(1, 'Укажите команду')
.help()
.argv;
Yargs умеет автоматически конвертировать строки в числа, булевы значения и даже массивы. Его мощная система middleware позволяет добавлять общие проверки для всех команд.
Inquirer — интерактивность в терминале
Inquirer — это не совсем фреймворк для CLI, а скорее библиотека для создания интерактивных консольных интерфейсов. Она идеально дополняет Commander или Yargs, когда нужны вопросы с выбором, ввод текста, чекбоксы.
Пример интерактивного опроса:
const inquirer = require('inquirer');
async function main() {
const answers = await inquirer.prompt([
{
type: 'input',
name: 'username',
message: 'Как вас зовут?',
validate: input => input.length > 0 ? true : 'Имя не может быть пустым'
},
{
type: 'list',
name: 'color',
message: 'Любимый цвет?',
choices: ['Красный', 'Зел