JavaScript
Node.js
npm
npx

npxでnodeモジュールを実行する

npxについて

バージョン5.2.0以上のnpmにはnpxというツールがバンドルされています。
npxを使うとローカルにインストールしたnpmのバイナリをお手軽に実行できます。

特徴

個人的に良いと思った点は主に以下の三点ですかね。

  • シンプルに実行できる
  • ローカルに存在しないパッケージでも実行可能
  • nodeのバージョンを指定してnpm-scriptを実行できる

シンプルに実行できる

npmでバイナリを実行しようとすると、以下のような形になりますが、

$ ./node_modules/.bin/パッケージ名 // パスを指定してバイナリを叩く
$ $(npm bin)/パッケージ名
$ npm run タスク名 // package.json内のnpm-scriptsで定義したタスク

npxだと以下でOK。

$ npx パッケージ名

ローカルパッケージを、パスを気にしたり npm-scripts でタスクを定義しなくても実行できるのはいいですね。

ローカルに存在しないパッケージでも実行可能

もし指定したパッケージがローカルに存在しない場合は、一旦グローバルにインストールされ一度だけ実行できるという機能があります。処理が完了したらそのパッケージはグローバルから削除されるので汚染の心配もありません。
試しにcoswayというコマンドライン上で指定した文字列を牛に喋らせるというパッケージを実行してみます。

$ npx cowsay hoge
npx: installed 10 in 2.796s // インストールにかかった時間
 ______
< hoge >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |

終了後、npmでcowsayを実行すると削除されているのがわかります。

$ $(npm bin)/cowsay
-bash: 〜/node_modules/.bin/cowsay: No such file or directory

また、github上のリポジトリを実行することも可能です。バグフィックス済みだけど、npmに公開はされていないみたいなこともままあるみたいので、そういう時には有効かもしれません。

$ npx githhub:ユーザー名/リポジトリ名 

nodeのバージョンを指定してnpm-scriptsを実行できる

書いて字のごとく、nodeのバージョンを指定してnpm-scriptsを実行できます。
バージョンを上げたいけど、問題が起きないかどうかの検証を簡単に行えるのはいいですね。

$ npx -p node@10.3.0 npm run build

こちらも実行完了後にそのバージョンは削除されます。

最後に

プロジェクトのポータビリティを担保すると、結局ローカルインストールして、npm-scriptsにタスクを定義する方が無難なのかな、と思いますが、便利だしメリットも大きいのでもう少し使い所を考えたいところです。