package.jsonに定義するscriptでは、ローカルパッケージのコマンドでもnpxは必要ありません。
'webpack ...' や 'yarn ...' と書いても問題ない。
でもnodemonだけは別です。'npx nodemon' としないとコマンドが見つからないと言われてしまう。
まずは、package.jsonの中身を見てください。
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"external-css": "python css-minify-v2-honban.py",
"cleanup": "python cleanup.py",
"build": "webpack --mode=production --profile --progress=profile & yarn external-css & yarn cleanup",
"dev": "webpack --mode=development & yarn external-css & yarn cleanup",
"watch": "npx nodemon --ext scss,js,html --watch src --exec yarn build"
},
}
npmパッケージのコマンド webpack, yarn は npxがついてないのに、nodemonにはついてます。
(pythonはプログラム言語Pythonの実行コマンド。スクリプトは多言語のコマンドも実行できる。)
この環境では、npmパッケージのグローバルインストールはしていません。
なので、スクリプトの実行はこうなる。
npx yarn build
スクリプト定義では通常、ローカルパッケージのコマンドでもコマンド名のフルパスやnpxは必要ありません。
(上記ではwebpack, yarn。)
npmパッケージのグローバルインストールでは、npmのインストール先(/usr/local/lib)にnode_modulesディレクトリが作られ、そこにパッケージファイルがインストールされる。
(Windowsでは ユーザ\AppData\Roaming\npm\)
ローカルは、ソースプロジェクトのホームディレクトリ(package.jsonのあるところ)にnode_modulesディレクトリが作られる。
グローバルにインストールされたパッケージのコマンドは、あたかもOSの環境変数に追加されたようにコマンドが使える。
(コマンドのフルパス指定はいらず、いきなりコマンド名から使える。)
でも、nodemonはちがうよう。パッケージの説明でもそんな文言があります。
With a local installation, nodemon will not be available in your system path or you can't use it directly from the command line. Instead, the local installation of nodemon can be run by calling it from within an npm script (such as npm start) or using npx nodemon.
(ローカルインストールのnodemonは、システムパスでの利用、コマンドラインからの直接使用はできません。代わりに、npmスクリプト(npm startなど)内から呼び出すか、npx nodemonを使用して、nodemonのローカルインストールを実行できます。)
npmパッケージ公式サイト - nodemon Instllation(筆者和訳)
そういう仕様なんだからしょうがないですね?
コマンドが見つからないならnpxを追加すればいいだけの話で、そんなに気にすることではないです。
でも、スクリプトにもnpxがいるんだと思ってしまって、webpack, yarnなどほかのコマンドに付けないように気をつけましょう。
nodemonは特殊だから。
最後に大事なことを忘れてた。nodemonは指定した拡張子のファイルを監視して、ファイルの追加・編集・削除したら指定したコマンドを実行する、開発支援ツールの自動化のためのものです。
これなしでは開発したくないと思うほどの優秀なパッケージ。
(上記定義では、webpackの起動を自動化している。)
npmパッケージ公式サイト