Node.js ES2015 require の働きについて

ES2015によるモジュールの扱い方をまとめてみました。

  • モジュールのインポートは require
  • モジュールのエクスポートは module.exports

それぞれ、どのような性質があるのか見ていきましょう。

require の働き

require は引数による挙動が複数あるため、一つ一つ理解しましょう。 まず、パッケージがインストールされる経緯は2通りあります

  1. npm install 経由(./node_modules/ へ)
  2. 自作ライブラリ (任意のディレクトリへ)

npm install 経由で入れた場合

通常のインストールであればpackage.jsonにパッケージ情報が追加されます。

lodashをインストールした package.jsonの例

{
  "name": "example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "lodash": "^4.17.11"
  }
}

dependencies に追加されたことがわかります。 では、lodashの package.jsonはどうでしょうか

{
  ...省略
  "main": "lodash.js",
  "name": "lodash",
  "version": "4.17.11"
}

name がパッケージ名, main がインポートされる js ファイルです。

上記の例だとrequire('lodash') をすると、./node_modules/lodash/lodash.js ファイルがインポートされます。

もし、./node_modules 以下にモジュールが見つからない場合は、ルートディレクトリに登りながら検索が行われます。

  • /hoge/ry/project/node_modules/lodash.js
  • /hoge/ry/node_modules/lodash.js
  • ...省略
  • /node_modules/lodash.js // ここで検索が終わる

なので一つ上のディレクトリにパッケージが含まれていた場合は npm install していなくても利用できます。

自作ライブラリの場合

require の引数に 自作ライブラリへの相対パスを渡せばインポートできます。

また、あるパッケージからの相対パスを用いたインポートも可能です。

├── main.js
├── lib
|  └── helloWorld.js 
└── node_modules
   └── lodash

上記のディレクトリ構成で main.js から helloWorld.js を呼び出す方法

  1. require('./lib/helloWorld')
  2. require('lodash/../../lib/helloWorld') // 使わないと思うけど
まとめると

引数に渡す情報で挙動が異なる

  • require('module_name')
    • /hoge/ry/project/node_modules/module_name.js // から探す。 ない場合はディレクトリが上がっていく。 ルートディレクトリで止まる。
    • /hoge/ry/node_modules/module_name.js
    • ...
    • /node_modules/module_name.js // stop
  • require('path/to/file')
  • require('example_module/path/to/file')
    • example_module のディレクトリを基準にして、ファイルを探す

とあるフォルダーをモジュール化するには

モジュールとして成り立つためには、モジュール化するディレクトリに package.json を作成する。 package.json に追加する項目は2つ

{
    "name" : "some-library",
    "main" : "./lib/some-library.js"
}

これだけです。簡単ですね!

あとは require で読み込むだけ。

module については後日追加