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