mottox2 blog

Node.jsでコマンドを実行したい時に使える『execa』の紹介

devnodejs

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といったものも利用できる)

js
const execa = require('execa');

(async () => {
  const {stdout} = await execa('echo', ['hello world']);
  console.log(stdout);
  //=> 'hello world'
  // 同期処理用のメソッド
  execaSync('echo', ['hello world']);
})();

引数に分割せず文字列を直接渡して実行するcommandメソッドも用意されている。

js
const execa = require('execa');

(async () => {
  // 引数に分割せず文字列を直接渡して実行する
  await execa.command('echo unicorns');
  // 同期処理用のメソッド
  execa.commandSync('echo unicorns');
})();

自分用のコードを書く際には機能的なメリットはあまり感じられず、真価を発揮するのはクロスプラットフォームで実行されるコードやライブラリを作成する時だろう。ただ、メソッドが少なく覚えやすく罠が少ないという点だけでも採用の価値はあるように思えた。

B!
dev

Next.jsのStatic Generationを追う際に参考にしたページ

Next.jsのStatic Generationを追っておく際に見たページをまとめた。簡単に要点をまとめてはいるが、詳しくはリンク先のオリジナルを見てほしい。 > 2019 in Review2

dev

リモート勤務なITエンジニアが分報で気をつけること

2020年になり誰もが予想しなかった速度で、人々の営みはオンライン上で行われるようになりました。もちろん仕事も例外ではありません。 そういった変化の中ではオンライン上のコミュニケーションがより重要

poen

うちでやりたい○つのこと

新型コロナウイルスの影響で外出が推奨されなくなって数週間がたった。 「自分は普段から引きこもりがちだ。大して影響はないだろう。」と構えていたが、日に日に後ろ向きの感情が強くなっているように感じている

うちにいよう
Copyright © 2019 @mottox2 All Rights Reserved.