npmとnpxの違いを理解して使い分けられるようになろう

Node.jsの開発をしているとnpmnpxという似たようなコマンドを目にすることがあると思います。
両者のコマンドは文字は似ていますが役割が明確に異なるコマンドです。

本記事ではnpmとnpxのコマンドの違いを理解してどのように使い分けるかを紹介します。

npxはnpmのVersion 7.xからnpm execの一部となっています。
この記事はVersion 6.x以前のnpmを利用している方が対象です。

スポンサーリンク

npmはパッケージ管理、npxはパッケージ実行

まずはnpxとnpmは名前の通り役割が明確に異なります。

npmとnpxの役割の違い
  • npmはNode Packageを管理(manage)するコマンド
  • npxはNode Packageを実行(execute)するコマンド

npmはNode.jsのデフォルトのパッケージ管理ツールです。
npmコマンドを利用することでインターネット上のリポジトリからNodeパッケージをインストールしたり、パッケージのバージョン管理をするというのが主な責務です。

一方でnpxはNode.jsのパッケージランナーツールです。バージョン5.2からデフォルトでインストールされるようになりました。
npxコマンドを利用することでNodeパッケージをより手軽に実行可能にするというのが主な責務です。

混同するのはパッケージを利用する場面

役割が明確に分かれているように見えるnpmとnpxをなぜ混同してしまうかというと、Nodeパッケージをターミナルで実行する場面ではどちらのコマンドも利用できてしまうからです。

  1. package.jsonのscriptに実行コマンドを記載してnpm経由でコマンドを実行
  2. npx経由でコマンドを実行

通常npm経由でインストールしたパッケージはnode_modulesディレクトリに格納されますが、パッケージを実行しようとターミナルからコマンドを実行してもパスが通っていないのでエラーとなります。

$ npm install eslint

$ eslint // => eslint: command not found

なので上であげた方法を取ることになります。実行コマンドは以下のようになります。

// 1. npm経由でコマンドを実行
// package.jsonのscriptに{"lint": eslint}と記載されていると仮定
$ npm run lint

// 2. npx経由でコマンドを実行
$ npx eslint

非常にコマンドが似ていますね。これがnpmとnpxが混同する原因です。

npmとnpxの使い分け

ではどのようにnpxとnpxのコマンドを使い分ければいいかというと、私の場合は次のような方針を採用しています。

npxとnpmの使い分け
  • npmを利用する
    • ビルドやテスト、リントなどアプリケーション開発におけるステップの決まった操作に対して再現性を持たせる場合
  • npxを利用する
    • 上記以外

npm経由でコマンドを実行する場合はpackage.jsonのscriptに実行コマンドを追加する必要があります。そのため、実行コマンド自体がバージョン管理に値する場合はnpmコマンドを利用します。

それ以外の場合は基本的にnpxを利用すれば問題ありません。

npxを採用する理由

これを見るとnpxにそれほど特徴がないように見えますが、npxを使うべき理由は次のような特徴を持っているからです。

npxの特徴
  • インストール済みのNodeパッケージをターミナルで実行可能(説明済)
  • インストールしていないNodeパッケージもターミナルで実行可能

実はnpxはnpmでインストールしていないNodeパッケージも利用することが可能です。
具体的にはコマンド実行時に一時的にパッケージをインストールして実行終了時に破棄します。

そのため何かテストしたいパッケージがある場合や一時的に利用したいパッケージがある場合に、npmでインストールして使用後にアンインストールするという無駄な手順を省くことが可能なのです。

まとめ

この記事ではnpmとnpxのコマンドの違いと使い分けについて紹介しました。

Node.jsを使い始めたばかり、少し慣れてきたけど今回の内容は意識してこなかったという初心者・初級者の方向けにこちらの参考書はおすすめです。

コメント