npxは、リモートでホストされるNode.jsのCLIツールや実行ファイルを実行できるツールである。名称はNode Package eXecutorの略に由来する。まんまだ。

何ができるか

npxは、主に以下の2つのことを行う。

  • ローカルのNode.jsのCLIツールや実行ファイルをパス指定なしで実行。
  • リモートでホストされるNode.jsのCLIツールや実行ファイルを一時的にインストール&実行。

実行する際は、npx コマンド名 or パッケージ名のようにコマンドを打つ。

該当のパッケージがローカルのnode_modulesに存在すれば、それが実行される。なければ、npmレジストリ(https://registry.npmjs.org/)にリクエストを投げ、ホストされていればインストール&実行の後に削除する。

レジストリに存在しないパッケージであれば、404エラーをコンソールに表示する。

なお、npmレジストリに限らず、アクセスできるリモートのパッケージであればURLを指定して実行できる。

便利なポイント

npxを利用するメリットは、環境を汚さずに任意のコードを実行できる点にある。例えばReactの基本的な環境構築を行ってくれるnpx create-react-app my-appなどが良い例だ。

また、ローカルインストールしたパッケージを実行する際にパスを省略できるのもメリットである。

npmとnpxの違い

npm(Node Package Manager)が担うのはパッケージの管理、npxが担うのはCLIツールや実行ファイルの実行、という点で違う。「実行ファイルの実行」ってなんか気持ちの悪い表現だが、なんて言えばいいのかわからないので妥協する

npxは、かつては独立したNode.jsパッケージだった。それがnpmのv5.2.0で本体に取り込まれた。いまは、npmをインストールすると自動でnpxもついてくる。

使い方

npxの使い方は、npmと同じく超簡単である。npxの後ろに実行したいパッケージをただ指定すれば良い。

bash
npx パッケージ名

また、以下のような形で、パッケージのバージョンや実行コマンド、引数(オプション)を指定できる(v10.5.2の例)。

bash
npx -- パッケージ名[@バージョン] [引数...]
npx --package=パッケージ名[@バージョン] -- コマンド名 [引数...]
npx -c 'コマンド名 [引数...]'
npx --package=パッケージ名 -c 'コマンド名 [引数...]'

なお、この指定方法はnpm execのものと共通している。

npm execとの違い

npm execは、npxの代替である。明記されてはいないが、npm execのv7.24.2の概要にはnpm execコマンドとnpxコマンドが併記されている。

ドキュメントには、npxのページもnpm execのページもある。ただ、npm execの方が新しく、ドキュメントも手厚く、おまけにnpxの引数パーサーやインストールプロセスにはnpm execが使われているようである。

npxは、npm execのショートハンドみたいなもの……なの? よくわからないが、個人的には、npm execよりもnpxの方が短くて良い。

参考資料