例えばカレントディレクトリのnodeプログラムがどこのnodeパッケージを参照するのか、それはカレントディレクトリのnode_modulesであるべきだが、node pathに指定されたデフォルトのnode_modulesを参照しているケースもある。そのような場合、カレントディレクトリのリポジトリをgithubなどにポストしても、任意の環境にcloneされた実行環境ではパッケージのnot foundエラーとなることとなる。
e.g. カレントディレクトリは /mnt/c/pg/ でpackages.jsonは定義されていないが、デフォルトのnode_pathの /mnt/c/pg/node/ がされる例
/mnt/c/pg$ node
> require.resolve('express')
'/mnt/c/pg/node/node_modules/express/index.js'
e.g. expressやexpressはカレントディレクトリのnode_modulesを参照できているが、corsに関しては見つからないためデフォルトが参照される例
/mnt/c/pg/web/vue_dev$ node
> require.resolve('cors')
'/mnt/c/pg/node/node_modules/cors/lib/index.js'
> require.resolve('express')
'/mnt/c/pg/web/vue_dev/node_modules/express/index.js'
> require.resolve('express')
'/mnt/c/pg/web/vue_dev/node_modules/moment/moment.js'
さらに、パッケージがカレントディレクトリのローカルにインストールされている場合でも、依存関係としてインストールされておりそれが使用されている状況なのか、きちんとpackages.jsonにバージョン指定でインストールされ使用ているのか、でも後に問題を引き起こしかねない
例えばpackages.jsonにexpressが定義されていないがローカルの./node_modules/express/index.jsが参照できている場合、他の何らかのパッケージの依存関係としてインストールされた任意のバージョンのexpressが使用されていることになる。
npm list -g | less
npm list | less
npm listなどで依存関係ツリーのどこにそれが位置しているか、バージョンは何か、トップレベルで使用されているパッケージはすべてpackages.jsonに指定されているか、を確認することが重要と言える。
(参考)