Frameworks CLI para JavaScript (Node.js): Criando aplicações de console poderosas
O desenvolvimento de interfaces de linha de comando (CLI) é uma das tarefas-chave no ecossistema Node.js. De scripts simples a ferramentas complexas para DevOps, as aplicações CLI estão ao nosso redor. No entanto, escrever um parser de argumentos, lidar com subcomandos e gerar ajuda manualmente é um trabalho tedioso e propenso a erros. É aqui que os frameworks CLI para JavaScript (Node.js) entram em ação, assumindo toda a rotina.
Neste artigo, vamos detalhar os dois frameworks mais populares: Commander.js e Yargs. Você aprenderá como criar rapidamente aplicações CLI profissionais com suporte a argumentos, opções, saída colorida e geração automática de ajuda.
Commander.js — clássico e simplicidade
Commander.js é o framework mais conhecido e amplamente utilizado para criar CLI em Node.js. Ele é usado em projetos como Vue CLI, Angular CLI e muitos outros. Sua principal vantagem é uma API intuitiva, baseada em encadeamento de chamadas.
Instalação
npm install commanderExemplo básico
const { Command } = require('commander');const program = new Command();
program .name('greet') .description('CLI para saudação') .version('1.0.0');
program .command('hello') .description('Saudar o usuário') .argument('<name>', 'Nome do usuário') .option('-l, --language <lang>', 'Idioma da saudação', 'russo') .action((name, options) => { if (options.language === 'inglês') { console.log(`Hello, ${name}!`); } else { console.log(`Olá, ${name}!`); } });
program.parse(process.argv);Neste exemplo, criamos o comando greet hello, que aceita um argumento obrigatório name e uma opção opcional --language. O Commander gera automaticamente a ajuda para o comando --help.
Suporte a subcomandos
O Commander lida muito bem com hierarquia de comandos. Você pode criar comandos aninhados, o que é especialmente útil para ferramentas complexas:
const project = program.command('project');
project .command('init') .description('Inicializar projeto') .action(() => { console.log('Projeto inicializado'); });
project .command('build') .description('Compilar projeto') .option('-p, --production', 'Compilação de produção') .action((options) => { console.log(options.production ? 'Compilação de produção' : 'Compilação normal'); });Yargs — flexibilidade e poder
Yargs é outro framework poderoso que foca na análise de argumentos e oferece recursos muito flexíveis. Ele é especialmente bom quando você precisa de controle preciso sobre o comportamento do parser, ou quando está construindo interfaces complexas de vários níveis.
Instalação
npm install yargsExemplo com Yargs
const yargs = require('yargs/yargs');const { hideBin } = require('yargs/helpers');
const argv = yargs(hideBin(process.argv)) .command('serve [port]', 'Iniciar servidor', (yargs) => { yargs .positional('port', { describe: 'Porta do servidor', default: 3000 }); }, (argv) => { console.log(`Servidor iniciado na porta ${argv.port}`); }) .option('verbose', { alias: 'v', type: 'boolean', description: 'Saída detalhada' }) .example('$0 serve 8080', 'Iniciar servidor na porta 8080') .demandCommand(1, 'É necessário especificar um comando') .help() .argv;Yargs oferece uma abordagem mais determinística para definir comandos. Você pode especificar exatamente quais argumentos são posicionais, definir valores padrão para eles, verificar tipos e muito mais.
Validação e tipos
Um dos pontos fortes