CLI фреймворки для TypeScript: создаём мощные консольные приложения
Разработка интерфейсов командной строки (CLI) на TypeScript — это не просто написание парсера аргументов. Современные CLI-приложения могут быть интерактивными, цветными, поддерживать автодополнение и даже отображать анимированные графики. Для этого существуют специализированные фреймворки и библиотеки. В этой статье мы разберём четыре ключевых инструмента для создания CLI на TypeScript: Commander.js, Ink, Oclif и Yargs. Вы узнаете их сильные стороны, получите готовые примеры кода и поймёте, какой инструмент подходит для вашей задачи.
1. Commander.js — классика и простота
Commander.js — это самый популярный фреймворк для создания CLI на Node.js и TypeScript. Он предлагает декларативный API для описания команд, аргументов и опций. Благодаря встроенной поддержке TypeScript, вы получаете автодополнение и проверку типов.
Основные возможности:
- Автоматическая генерация справки (
--help). - Поддержка вложенных команд (субкоманды).
- Валидация обязательных аргументов.
- Гибкая система опций: булевы, строковые, с значениями по умолчанию.
Пример простого CLI на Commander.js + TypeScript:
import { Command } from 'commander';
const program = new Command();
program
.name('greet')
.description('CLI для приветствия')
.version('1.0.0');
program
.command('hello')
.argument('<name>', 'Имя пользователя')
.option('-l, --lang <language>', 'Язык приветствия', 'ru')
.action((name, options) => {
if (options.lang === 'en') {
console.log(`Hello, ${name}!`);
} else {
console.log(`Привет, ${name}!`);
}
});
program.parse(process.argv);
Commander.js идеален для простых утилит и скриптов автоматизации. Он не перегружен лишними зависимостями и хорошо документирован.
2. Ink — реактивный CLI с компонентами
Ink — это уникальный фреймворк, который позволяет строить CLI-интерфейсы с помощью React-подобных компонентов. Вы пишете на JSX, а Ink рендерит это в терминал. В сочетании с TypeScript вы получаете строгую типизацию компонентов.
Ключевые особенности:
- Компонентный подход:
<Text>,<Box>,<Spacer>. - Автоматическое обновление при изменении состояния (реактивность).
- Поддержка анимации, индикаторов загрузки, прогресс-баров.
- Глубокая интеграция с React-хуками (
useInput,useApp).
Пример интерактивного CLI с Ink:
import React, { useState } from 'react';
import { render, Text, Box, useInput } from 'ink';
const Counter = () => {
const [count, setCount] = useState(0);
useInput((input) => {
if (input === '+') setCount(prev => prev + 1);
if (input === '-') setCount(prev => prev - 1);
});
return (
<Box>
<Text>Счётчик: {count}. Нажмите '+' или '-'</Text>
</Box>
);
};
render(<Counter />);
Ink подходит для сложных интерактивных утилит, мастеров установки, дашбордов в терминале. Это лучший выбор, если вам нужен красивый и отзывчивый интерфейс.
3. Oclif — фреймворк для масштабируемых CLI
Oclif (Open CLI Framework) от Heroku — это полноценный фреймворк для создания CLI-приложений любой сложности. Он поддерживает плагины, автоматическое обновление, хуки и генерацию проектов.
Сильные стороны:
- Встроенный генератор кода (
oclif generate). - Поддержка TypeScript из коробки.
- Система плагинов для расширения функциональности.
- Автоматическое обновление CLI через npm.
Пример команды в Oclif:
import {Command, Flags} from '@oclif/core';
export class HelloCommand extends Command {
static description = 'Приветствие пользователя';
static flags = {
name: Flags.string({char: 'n', description: 'Ваше имя', required: true}),
};
async run(): Promise<void>