はじめに
CLIツールやビルドスクリプトを作っていて、console.logだけの出力だと「これはエラーなのか警告なのか、それとも成功メッセージなのか」がひと目で判断しづらいと感じたことはないでしょうか。ログが流れるたびに文字を目で追って意味を判断するのは地味にストレスがたまります。
こうした悩みを解決してくれるのが、Node.js向けターミナル文字装飾ライブラリのChalkです。メソッドチェーンを繋げるだけで、ターミナルの出力に色や太字・下線といった装飾を付けられます。npmで週数千万ダウンロードされ、CLIツールの定番中の定番として使われ続けているライブラリです。この記事では、Chalkの特徴から実践的な使い方までを解説します。
Chalkとは
Chalkは「Terminal string styling done right」を掲げるNode.js向けのターミナル文字列装飾ライブラリです。ANSIエスケープコードを直接扱う煩雑さを、chalk.red('text')のようなシンプルなAPI呼び出しに置き換えてくれます。依存パッケージを持たず、実行環境の色サポートレベルを自動で判定してくれるのも特徴です。
なお、ChalkはANSIエスケープコードを使ってターミナル上に色を表示する仕組みのため、ブラウザ上で実行しても色付きの表示にはなりません(エスケープコードの文字列がそのまま見えるだけです)。この記事のサンプルはNode.js環境での実行を想定しています。
主な特徴
- 直感的なメソッドチェーン -
chalk.blue.bold('text')のようにスタイルを繋げるだけで装飾できる - 色サポートの自動検出 - 実行環境(ターミナルやCI)に応じて、使える色数を自動で判定してくれる
- 256色・Truecolor対応 -
chalk.hex()やchalk.rgb()で、16色を超えた自由な色指定もできる - 依存関係ゼロ - シンプルな設計で、導入によるバンドルサイズへの影響を最小限に抑えられる
インストール
npmまたはyarnでインストールできます。
npm install chalk
yarn add chalk
Chalk 5系以降はESM専用パッケージです。CommonJSのプロジェクトでrequireを使いたい場合は、import()による動的インポートを使うか、旧バージョン系であるChalk 4系の利用を検討してください。
基本的な使い方
まずはメソッドチェーンで色や装飾を指定する、最もシンプルな使い方です。
import chalk from 'chalk'
console.log(chalk.blue('Hello world!'))
console.log(chalk.red.bold('Error occurred'))
console.log(chalk.green('Success!'))
// 複数の引数もまとめて渡せる
console.log(chalk.yellow('Warning:', 'Deprecated function used'))
chalk.blueやchalk.red.boldのように、色や装飾を表すプロパティをチェーンさせていくだけで、対応するANSIエスケープコードが自動的に文字列へ付与されます。
実践的なユースケース
ログレベルごとに色分けする
CLIツールやスクリプトのログを、レベルごとに視覚的に区別したいケースです。エラー・警告・成功を色で分けることで、ターミナルに流れるログの中から重要な情報を瞬時に見つけられるようになります。
import chalk from 'chalk'
const logger = {
error: (msg) => console.log(chalk.red.bold('✖ ERROR'), msg),
warn: (msg) => console.log(chalk.yellow('⚠ WARN'), msg),
success: (msg) => console.log(chalk.green('✔ SUCCESS'), msg),
info: (msg) => console.log(chalk.blue('ℹ INFO'), msg),
}
logger.error('データベース接続に失敗しました')
logger.warn('この関数は非推奨です')
logger.success('デプロイが完了しました')
logger.info('3件のファイルを処理しました')
loggerオブジェクトのように装飾をラップしておくと、呼び出し側は色指定を意識せずに済み、ログ出力のスタイルをプロジェクト全体で統一できます。
ネストしたスタイルとテンプレートリテラルで組み立てる
1行のログの中に複数の情報を色分けして詰め込みたいケースです。chalkはスタイルのネストに対応しているため、外側の色を保ちながら一部分だけ別の装飾を重ねられます。
import chalk from 'chalk'
const cpu = 92
const ram = 41
console.log(
chalk.red(`CPU: ${chalk.underline.bold(cpu + '%')} は高負荷です`)
)
console.log(`RAM使用率: ${chalk.green(ram + '%')}`)
// ネストしたスタイル
console.log(
chalk.green('全体は緑色 ' + chalk.blue.underline('ここだけ青い下線') + ' また緑色に戻る')
)
chalk.red(...)の中でさらにchalk.underline.bold(...)を呼び出しても、装飾が競合せず正しくリセットされます。テンプレートリテラルと組み合わせれば、変数を含む1行のログでも部分的な強調が簡単に作れます。
独自インスタンスでカラーレベルを制御する
CI環境やログファイルへの出力時など、色を強制的に無効化・有効化したいケースです。new Chalk()でカスタムインスタンスを作成すると、実行環境の自動判定に頼らずlevelを明示的に指定できます。
import { Chalk } from 'chalk'
// 色を完全に無効化したインスタンス(ログファイル出力用など)
const plainChalk = new Chalk({ level: 0 })
console.log(plainChalk.red('この文字列は装飾されません'))
// Truecolor(1600万色)を強制するインスタンス
const richChalk = new Chalk({ level: 3 })
console.log(richChalk.hex('#DEADED').bold('カスタムHex色で装飾'))
level: 0を指定すると装飾用のエスケープコードが一切付与されなくなるため、色付きログをそのままファイルへ書き出したい場合や、色に対応しないログ収集基盤へ送る場合に有効です。環境変数FORCE_COLORでも同様の制御ができます。
まとめ
Chalkは、ターミナル出力に色や装飾を加えるという一点にシンプルに特化したライブラリです。メソッドチェーンによる直感的なAPI、スタイルのネスト対応、環境に応じた色サポートの自動検出など、CLIツールやNode.jsスクリプトのログを見やすくするための機能が過不足なく揃っています。ログレベルごとの色分けから、CI環境向けの色制御まで、まずは手元のスクリプトのconsole.logをChalkに置き換えるところから試してみてはいかがでしょうか。
