require('hoge')
で実際にどのファイルが読み込まれるのか調べたいときは
console.log(require.resolve('hoge'))
とすれば絶対パスが表示される。
また、環境変数 NODE_DEBUG=module
をセットしてNode.jsを実行してみるとログが表示される。
requireの検索パス
-
./
や../
で始まる場合(例:require('./hoge')
)- requireが書かれているファイルからの相対パスになる。
-
./
../
/
のいずれでも始まらない場合(例:require('fs')
)- まずコアモジュール(
http
モジュールなど)が探される - 次にnode_modulesフォルダが探される。node_modulesフォルダを探す順番は、
- requireが書かれているファイルがあるフォルダ
- その親、その親…。
- 次に下記の場所も検索される。
- 0:
$NODE_PATH
($NODE_PATH
を使ってモジュールの位置を指定するのは古いやり方で、現在は推奨されていない。) - 1:
$HOME/.node_modules
- 2:
$HOME/.node_libraries
- 3:
$PREFIX/lib/node
($PREFIX
はNode.jsのビルド時に決定されたnode_prefix
)
- 0:
- まずコアモジュール(
require('hoge')のように拡張子を省略した場合
次のものが探される。
- hoge.js
- hoge.json
- hoge.node
- hogeという名前のフォルダ(package.jsonを含んでモジュール化されているもの)
- hogeという名前のフォルダ(index.js、index.json、index.nodeのいずれかを含んでモジュール化されているもの)
参考
公式ドキュメント。requireの擬似コードも含めてとても詳しく書かれている。
https://nodejs.org/docs/v6.10.3/api/modules.html