Node.js ES2015 require の働きについて
ES2015によるモジュールの扱い方をまとめてみました。
- モジュールのインポートは require
- モジュールのエクスポートは module.exports
それぞれ、どのような性質があるのか見ていきましょう。
require の働き
require は引数による挙動が複数あるため、一つ一つ理解しましょう。 まず、パッケージがインストールされる経緯は2通りあります
- npm install 経由(./node_modules/ へ)
- 自作ライブラリ (任意のディレクトリへ)
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 を呼び出す方法
- require('./lib/helloWorld')
- require('lodash/../../lib/helloWorld') // 使わないと思うけど
まとめると
引数に渡す情報で挙動が異なる
- require('module_name')
- 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 については後日追加