CLI фреймворки для TypeScript: создание мощных консольных приложений
Современная разработка на TypeScript немыслима без инструментов командной строки (CLI). Будь то сборка проекта, генерация кода или автоматизация задач — качественный CLI-интерфейс повышает продуктивность разработчика. В этой статье мы рассмотрим лучшие фреймворки для создания CLI на TypeScript, их особенности и приведем практические примеры.
Зачем нужен CLI фреймворк?
Создание CLI с нуля — трудоемкая задача. Фреймворки предоставляют готовые решения для:
- Парсинга аргументов командной строки
- Создания иерархии команд (подкоманды)
- Автоматической генерации справки (
--help) - Обработки ошибок и валидации ввода
- Интерактивных подсказок (автодополнение)
- Цветного вывода и прогресс-баров
Топ CLI фреймворков для TypeScript
1. Commander.js
Самый популярный фреймворк для Node.js CLI. Отличается простотой и гибкостью. Отлично подходит для проектов любого размера.
import { Command } from 'commander';
const program = new Command();
program
.name('my-cli')
.description('Пример CLI приложения')
.version('1.0.0');
program
.command('greet')
.argument('<name>', 'Имя пользователя')
.option('-l, --language <lang>', 'Язык приветствия', 'ru')
.action((name, options) => {
const greetings: Record<string, string> = {
ru: `Привет, ${name}!`,
en: `Hello, ${name}!`,
es: `¡Hola, ${name}!`,
};
console.log(greetings[options.language] || greetings['ru']);
});
program.parse(process.argv);
Преимущества Commander:
- Интуитивно понятный API
- Поддержка TypeScript из коробки
- Легкая интеграция с другими библиотеками
- Большое сообщество и документация
2. Ink (React для CLI)
Уникальный фреймворк, позволяющий строить CLI-интерфейсы с использованием React-компонентов. Идеален для интерактивных приложений с богатым UI.
import React, { useState } from 'react';
import { render, Text, Box, useInput } from 'ink';
const Counter = () => {
const [count, setCount] = useState(0);
useInput((input) => {
if (input === 'q') process.exit(0);
if (input === '+') setCount(c => c + 1);
if (input === '-') setCount(c => c - 1);
});
return (
<Box flexDirection="column" alignItems="center">
<Text color="green" bold>Счетчик: {count}</Text>
<Text dimColor>Нажмите + или - для изменения, q для выхода</Text>
</Box>
);
};
render(<Counter />);
Преимущества Ink:
- Компонентный подход (знаком React-разработчикам)
- Автоматическое обновление интерфейса
- Поддержка анимаций и прогресс-баров
- Гибкая кастомизация вывода
3. Oclif (Heroku CLI Engine)
Фреймворк от создателей Heroku CLI. Предлагает мощный генератор проектов и встроенную поддержку плагинов. Отлично подходит для enterprise-решений.
import { Command, Flags } from '@oclif/core';
export class Greet extends Command {
static description = 'Приветствие пользователя';
static flags = {
name: Flags.string({ char: 'n', description: 'Имя', required: true }),
uppercase: Flags.boolean({ char: 'u', description: 'Верхний регистр' }),
};
async run(): Promise<void> {
const { flags } = await this.parse(Greet);
let message = `Привет, ${flags.name}!`;
if (flags.uppercase) message = message.toUpperCase();
this.log(message);
}
}
Преимущества Oclif:
- Автоматическая генерация CLI (через
npx oclif generate) - Встроенная система тестирования
- Поддержка хуков и плагинов
- Отличная производительность
4. Yargs
Легковесный фреймворк с богатыми возможностями парсинга. Идеален для простых утилит и скриптов.
import y