JP Coders

Published on

node.jsのrequireで参照されるライブラリのパスを取得

例えばカレントディレクトリの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に指定されているか、を確認することが重要と言える。

(参考)

In node.JS how can I get the path of a module I have loaded via require that is not mine (i.e. in some node_module) - Stack Overflow
Authors
  • avatar
  • Name
  • 情報技術者 / Z世代プログラマー / 米大学院にてデータサイエンスを学ぶ

  • ITプロフェッショナルとして活動しています。React.js等のモダンなウェブ制作・アプリ開発を得意としており、Java・Python・Rust等のプログラミング言語を用いたソフトウェア開発全般を行っています。

お手伝いできますか? 🤝

他の方法でのご連絡をご希望ですか?
web制作ご依頼受付中

本記事で掲載している情報やコードは執筆時点のものであり、動作を保証するものではありません。 自己責任のもと、プログラムの実行や情報の利用にあたってはご注意ください。


本記事には提携する企業の広告が含まれる場合があります。