Création d'outils CLI sur Node.js : aperçu des frameworks Commander, Yargs et Inquirer

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Framework CLI pour JavaScript (Node.js) : créons des applications console puissantes



Le développement d'utilitaires console (CLI) est l'une des tâches clés de l'écosystème Node.js. Que ce soit pour l'automatisation de la construction, la gestion de paquets, la génération de code ou des scripts simples pour DevOps — un framework CLI de qualité est indispensable. Dans cet article, nous analyserons trois outils les plus populaires : Commander, Yargs et Inquirer. Vous découvrirez comment ils fonctionnent, quels sont leurs points forts, et verrez des exemples de code.



Pourquoi un framework CLI est-il nécessaire ?

Écrire un programme console simple peut se faire sans framework — il suffit de traiter process.argv. Mais dès que le projet s'agrandit, avec des sous-commandes, des drapeaux, des invites interactives, l'analyse manuelle des arguments devient un cauchemar. Les frameworks prennent en charge :

  • l'analyse des arguments et options ;
  • la génération d'aide (--help) ;
  • la validation des données d'entrée ;
  • la prise en charge des sous-commandes (comme dans git) ;
  • les dialogues interactifs avec l'utilisateur.


Commander — classique et standard

Commander est le framework CLI le plus populaire pour Node.js. Il est utilisé par des géants comme Vue CLI, NestJS et bien d'autres. Principales fonctionnalités : API intuitive, affichage automatique de l'aide, prise en charge des arguments variables.



Exemple d'application simple :

#!/usr/bin/env nodeconst { Command } = require('commander');const program = new Command();

program .name('greet') .description('Salutation de l\\'utilisateur') .version('1.0.0');

program .command('hello') .argument('<name>', 'Nom de l\\'utilisateur') .option('-l, --lang <language>', 'Langue de salutation', 'fr') .action((name, options) => { if (options.lang === 'fr') { console.log(`Bonjour, ${name}!`); } else { console.log(`Hello, ${name}!`); } });

program.parse();


Exécution : node app.js hello Jean --lang fr → Bonjour, Jean!



Commander génère automatiquement l'aide avec --help et prend en charge les chaînes d'appels. C'est le choix idéal pour la plupart des utilitaires CLI.



Yargs — flexibilité et commodité

Yargs est un autre framework puissant, particulièrement fort dans l'analyse d'options complexes et la détection automatique des types. Il est populaire parmi les développeurs qui ont besoin d'un contrôle fin sur les arguments.



Exemple avec Yargs :

#!/usr/bin/env nodeconst yargs = require('yargs/yargs');const { hideBin } = require('yargs/helpers');

const argv = yargs(hideBin(process.argv)) .command('calc', 'Calculatrice', (yargs) => { return yargs .option('a', { describe: 'Premier nombre', type: 'number', demandOption: true }) .option('b', { describe: 'Deuxième nombre', type: 'number', demandOption: true }) .option('op', { describe: 'Opération (sum, sub)', type: 'string', default: 'sum' }); }, (argv) => { const { a, b, op } = argv; if (op === 'sum') console.log(`Somme : ${a + b}`); else if (op === 'sub') console.log(`Différence : ${a - b}`); else console.log('Opération inconnue'); }) .demandCommand(1, 'Spécifiez une commande') .help() .argv;


Yargs sait convertir automatiquement les chaînes en nombres, valeurs booléennes et même en tableaux. Son puissant système de middleware permet d'ajouter des vérifications communes pour toutes les commandes.



Inquirer — interactivité dans le terminal

Inquirer n'est pas vraiment un framework CLI, mais plutôt une bibliothèque pour créer des interfaces console interactives. Elle complète parfaitement Commander ou Yargs lorsque des questions avec choix, saisie de texte, cases à cocher sont nécessaires.



Exemple de questionnaire interactif :

const inquirer = require('inquirer');

async function main() { const answers = await inquirer.prompt([ { type: 'inp

Recommendations