Node.jsでコマンドを実行したい時に使える『execa』の紹介
Node.jsでCLIのコマンドを実行する際、標準モジュールとして用意されている「child_process」を使う。ただ、調べてみたところNext.jsやGatsby.jsといったフレームワークの内部では「execa」というライブラリが使われていた。そこで気になったのでexecaについて調べた。
https://github.com/sindresorhus/execa
execaかはなにか?
child_processメソッドを改良したもの。 改善点として次のような点が挙げられている。
- Promiseインタフェースを採用
- 最終行の改行コードを除去
- クロスプラットフォームでshebangバイナリをサポート
- Windowsサポートの改善(内部ではcross-spawnが利用されている模様)
- ローカルでインストールしているコマンドの優先実行
- エラー表現の改善
利用方法
コマンド、引数をそれぞれ引数として渡す。 execaの返り値はChild Process Result。その中の標準出力stdoutを変数に格納し利用できる。(exitCode, stderrといったものも利用できる)
const execa = require('execa');
(async () => {
const {stdout} = await execa('echo', ['hello world']);
console.log(stdout);
//=> 'hello world'
// 同期処理用のメソッド
execaSync('echo', ['hello world']);
})();
引数に分割せず文字列を直接渡して実行するcommandメソッドも用意されている。
const execa = require('execa');
(async () => {
// 引数に分割せず文字列を直接渡して実行する
await execa.command('echo unicorns');
// 同期処理用のメソッド
execa.commandSync('echo unicorns');
})();
自分用のコードを書く際には機能的なメリットはあまり感じられず、真価を発揮するのはクロスプラットフォームで実行されるコードやライブラリを作成する時だろう。ただ、メソッドが少なく覚えやすく罠が少ないという点だけでも採用の価値はあるように思えた。