argparse vs commander vs minimist vs yargs
Node.js CLI引数パーサーの技術的比較
argparsecommanderminimistyargs類似パッケージ:

Node.js CLI引数パーサーの技術的比較

argparsecommanderminimistyargs はすべて Node.js 環境でコマンドラインインターフェース(CLI)の引数を解析するためのライブラリです。これらはユーザーが入力したフラグやオプション、サブコマンドをプログラム内で扱いやすい形式に変換し、堅牢な CLI ツールの構築を支援します。各ライブラリは設計思想や機能セット、API の使いやすさにおいて明確な違いを持ち、プロジェクトの規模や要件に応じて最適な選択肢が変わります。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
argparse0508-96年前Python-2.0
commander028,081209 kB142ヶ月前MIT
minimist066154.5 kB143年前MIT
yargs011,466231 kB31510ヶ月前MIT

Node.js CLI 引数パーサーの深掘り比較:argparse vs commander vs minimist vs yargs

Node.js で CLI ツールを作る際、ユーザーからの入力を安全かつ柔軟に処理するための引数パーサーは欠かせません。argparsecommanderminimistyargs はそれぞれ異なる哲学でこの課題に取り組んでおり、用途に応じて適切な選択が重要です。以下では、実際のコード例を交えながら、各ライブラリの特徴と使いどころを詳しく見ていきます。

🧩 基本的な引数解析:シンプルなフラグと値

まずは最も基本的なケース — -f file.txt--verbose のようなフラグを処理する方法を比較します。

minimist は最小限の処理に特化しており、単純なオブジェクトを返します。

// minimist
const minimist = require('minimist');
const args = minimist(process.argv.slice(2));
// 入力: node app.js -f file.txt --verbose
// 出力: { _: [], f: 'file.txt', verbose: true }

commander はメソッドチェーンでオプションを宣言します。

// commander
const { Command } = require('commander');
const program = new Command();
program
  .option('-f, --file <path>', 'input file path')
  .option('-v, --verbose', 'enable verbose mode');
program.parse();
const options = program.opts();
// options.file と options.verbose が利用可能

yargs.option() で設定し、.argv で結果を取得します。

// yargs
const yargs = require('yargs');
const argv = yargs
  .option('f', {
    alias: 'file',
    type: 'string',
    description: 'input file path'
  })
  .option('verbose', {
    type: 'boolean',
    description: 'enable verbose mode'
  })
  .argv;
// argv.file と argv.verbose が利用可能

argparse は Python 風の明示的なパーサー定義を使います。

// argparse
const { ArgumentParser } = require('argparse');
const parser = new ArgumentParser({
  description: 'Process some files.'
});
parser.addArgument(['-f', '--file'], {
  help: 'input file path',
  required: true
});
parser.addArgument(['--verbose'], {
  action: 'storeTrue',
  help: 'enable verbose mode'
});
const args = parser.parseArgs();
// args.file と args.verbose が利用可能

📚 サブコマンドのサポート:階層的な CLI 構造

Git や Docker のように、git commitdocker run のようなサブコマンドを持つ CLI を作る場合の違いを見ます。

minimist にはサブコマンドの概念がありません。自前で _ 配列を解析する必要があります。

// minimist(サブコマンドなし)
const args = minimist(process.argv.slice(2));
// 入力: node app.js commit -m "msg"
// args._ → ['commit']
// 以降の処理はすべて手動

commander.command() でサブコマンドを自然に定義できます。

// commander
const { Command } = require('commander');
const program = new Command();

program
  .command('commit')
  .option('-m, --message <msg>', 'commit message')
  .action((options) => {
    console.log('Committing with:', options.message);
  });

program.parse();

yargs.command() で同様の機能を提供し、さらに非同期アクションもサポートします。

// yargs
const yargs = require('yargs');
yargs
  .command('commit', 'make a commit', (yargs) => {
    yargs.option('m', {
      alias: 'message',
      type: 'string',
      demandOption: true
    });
  }, (argv) => {
    console.log('Committing with:', argv.message);
  })
  .parse();

argparseaddSubparsers() を使ってサブコマンドを実現できますが、API がやや冗長です。

// argparse
const { ArgumentParser } = require('argparse');
const parser = new ArgumentParser();
const subparsers = parser.addSubparsers({ dest: 'command' });

const commitParser = subparsers.addParser('commit');
commitParser.addArgument(['-m', '--message'], {
  help: 'commit message',
  required: true
});

const args = parser.parseArgs();
if (args.command === 'commit') {
  console.log('Committing with:', args.message);
}

🆘 ヘルプとバリデーション:ユーザー体験の差

エンドユーザーが迷わないようにするためのヘルプメッセージと、入力値の検証機能の違いです。

minimist はヘルプ生成もバリデーションも提供しません。すべて自前実装が必要です。

commander.help() で自動生成されるヘルプを提供し、.requiredOption() で必須チェックが可能です。

// commander
program
  .requiredOption('-f, --file <path>', 'must specify input file')
  .parse();
// 不正な入力時は自動でエラー表示+ヘルプ出力

yargs は最も洗練されたヘルプを提供し、.demandOption().choices().coerce() などで詳細なバリデーションが可能です。

// yargs
yargs
  .option('format', {
    choices: ['json', 'yaml'],
    default: 'json'
  })
  .demandOption('file')
  .argv;
// 無効な format 値を指定すると自動でエラー

argparserequiredchoices オプションで厳密なバリデーションができ、ヘルプも自動生成されます。

// argparse
parser.addArgument(['--format'], {
  choices: ['json', 'yaml'],
  defaultValue: 'json'
});
// 無効な値は自動で拒否され、ヘルプ表示

⚙️ 設定とカスタマイズ性

minimist は設定オプションが非常に少なく、ほぼ「そのまま」の挙動しかできません。

commander.configureHelp().configureOutput() で出力のカスタマイズが可能です。

yargs.usage().epilogue().locale() など多数のメソッドでヘルプの見た目や言語を細かく調整できます。

argparseformatterClassprefixChars など、Python の argparse 由来の高度なカスタマイズが可能です。

📌 まとめ:どのライブラリを選ぶべきか

ライブラリ最適な用途注意点
minimist超軽量スクリプト、内部ツール、依存関係を最小化したい場合ヘルプ・バリデーション・サブコマンドなし
commander中~大規模 CLI、サブコマンド中心の構造、TypeScript との連携高度なヘルプカスタマイズはやや制限あり
yargsエンドユーザー向け CLI、リッチなヘルプとバリデーションが必要な場合機能過多で軽量用途には不向き
argparse厳密な入力検証と Python 風 API を好む場合学習コストや冗長さがやや高め

💡 最終的なアドバイス

  • 内部スクリプトやビルドツールの補助コマンドminimist
  • 開発者向け CLI ツール(例:フレームワークの CLI)commander
  • 一般ユーザー向けアプリケーション(例:データ変換ツール)yargs
  • 科学計算やデータ処理系 CLI で厳密な入力制御が必要argparse

どのライブラリも安定しており、新規プロジェクトでの使用に問題はありません。あなたの CLI が「誰のために」「何を目的に」作られるかを軸に、最適な選択をしてください。

選び方: argparse vs commander vs minimist vs yargs

  • argparse:

    argparse は Python の argparse モジュールに強く影響を受けた設計で、厳密な型定義と高度な検証機能を必要とする CLI ツールに向いています。特に、複雑なオプション構成やヘルプメッセージのカスタマイズ性を重視する場合に有効です。ただし、TypeScript との統合が弱く、API がやや冗長になる傾向があるため、シンプルなユースケースではオーバーキルになりがちです。

  • commander:

    commander は直感的なチェーン式 API とサブコマンドのネストサポートにより、中規模から大規模な CLI アプリケーションに最適です。Git や npm のような階層的なコマンド体系を実装したい場合に特に強力です。TypeScript 定義も公式で提供されており、現代的な開発環境との親和性が高いです。

  • minimist:

    minimist は極小かつ高速な引数パーサーで、依存関係ゼロ・バンドルサイズ最小化が求められる軽量ツールや内部スクリプトに適しています。ただし、ヘルプ生成やバリデーション、サブコマンドなどの高レベル機能は一切提供しないため、これらの機能を自前で実装する必要があります。

  • yargs:

    yargs は豊富なビルトイン機能(自動ヘルプ生成、バリデーション、プロンプト、i18n 対応など)と柔軟な設定により、ユーザー体験を重視する本格的な CLI ツールに最適です。特に、エンドユーザー向けの親しみやすいインターフェースを短期間で構築したい場合にその真価を発揮します。ただし、機能が多いため学習コストがやや高く、過剰な機能が必要ない場合には重くなりがちです。

argparse のREADME

argparse

Build Status NPM version

CLI arguments parser for node.js, with sub-commands support. Port of python's argparse (version 3.9.0).

Difference with original.

  • JS has no keyword arguments support.
    • Pass options instead: new ArgumentParser({ description: 'example', add_help: true }).
  • JS has no python's types int, float, ...
    • Use string-typed names: .add_argument('-b', { type: 'int', help: 'help' }).
  • %r format specifier uses require('util').inspect().

More details in doc.

Example

test.js file:

#!/usr/bin/env node
'use strict';

const { ArgumentParser } = require('argparse');
const { version } = require('./package.json');

const parser = new ArgumentParser({
  description: 'Argparse example'
});

parser.add_argument('-v', '--version', { action: 'version', version });
parser.add_argument('-f', '--foo', { help: 'foo bar' });
parser.add_argument('-b', '--bar', { help: 'bar foo' });
parser.add_argument('--baz', { help: 'baz bar' });

console.dir(parser.parse_args());

Display help:

$ ./test.js -h
usage: test.js [-h] [-v] [-f FOO] [-b BAR] [--baz BAZ]

Argparse example

optional arguments:
  -h, --help         show this help message and exit
  -v, --version      show program's version number and exit
  -f FOO, --foo FOO  foo bar
  -b BAR, --bar BAR  bar foo
  --baz BAZ          baz bar

Parse arguments:

$ ./test.js -f=3 --bar=4 --baz 5
{ foo: '3', bar: '4', baz: '5' }

API docs

Since this is a port with minimal divergence, there's no separate documentation. Use original one instead, with notes about difference.

  1. Original doc.
  2. Original tutorial.
  3. Difference with python.

argparse for enterprise

Available as part of the Tidelift Subscription

The maintainers of argparse and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.