モジュール
- コアモジュール、ファイルモジュール、ディレクトリモジュール
require()
の動作node_modules/
による方法
モジュールとは
- スクリプト外にあるJavaScript(ファイル)をロード(実行)
- エクスポートされたオブジェクトを受け取れる
分類
- コアモジュール: Node.jsに付属
- 自作モジュール: スクリプト外部のJavaScriptファイル
- ここでは主に手動での管理の文脈
- npmパッケージ:
npm
コマンドとpackage.json
による自動管理
コアモジュールの使用方法
大半のコアモジュール
require('モジュール名')
でロードが必要const fs = require('fs') // 同名変数に入れるのが通例
- REPLでは自動でロード
一部: global
オブジェクトにあるもの
- すぐ使える
timer
モジュール:setTimeout()
などconsole
、process
モジュールなど
REPL
# いきなりosオブジェクトを使える
> os.platform()
'linux'
# コアモジュールの一覧
# これは例外的にrequire必要
> require('module').builtinModules
スクリプト
// osモジュールをロード
const os = require('os')
console.log(os.platform()) // linux
// osモジュールにどんなオブジェクト(関数など)があるか
console.log(Object.getOwnPropertyNames(os))
自作モジュール
- モジュール側: エクスポート
module.exports = オブジェクト
- 利用する側: インポート(ロード)
const 変数 = require('ファイルパス')
(.js
は省略可)require()
の戻りはmodule.exports
のオブジェクト
モジュール側
// hello.js
// この関数をモジュール化
function 挨拶() {
console.log('こんにちは')
}
module.exports = 挨拶
console.log('読込完了:', __filename)
利用側
const hello = require('./hello') // 読込完了: /path/to/hello.js
hello() // こんにちは
// 2回目は何も出力しない
require('./hello')
module.exports === exports
- ショートカットの
exports
- ダメな例:
exports = オブジェクト
- =>
module.exports
とは別物になってしまう
- =>
複数のオブジェクトをエクスポート
// exportsそのものではなく、そのプロパティに代入すること
exports.aaa = [1, 2, 3]
exports.bbb = (引数1) => console.log(引数1)
// module.exportsはプロパティだから代入していい
module.exports = {
aaa: [1, 2, 3],
bbb(引数1) {
console.log(引数1)
},
}
// 利用側
require('./モジュール.js').bbb(引数1)
require()
による検索順番
require('パス')
:/
./
../
で開始するもの- ファイルモジュール(優先)
- ディレクトリモジュール
require('モジュール名')
: 名前だけ- コアモジュール(優先)
node_modules/
にあるモジュール
require()
の動作
- 同期的: 記述の段階で読込(実行)完了 (内部の非同期は別)
- キャッシュされる
- 同じものを複数回
require()
しても、実行は1回だけ - 複数回実行したいなら、関数をエクスポート
- 同じものを複数回
- 相対パスのとき、
require()
記述のファイルから見た位置- 実行位置や親モジュールの位置ではない
ディレクトリをモジュール化: index.js
を作る
モジュール側ディレクトリ
- メインモジュール:
index.js
の名前で作成- 名前等はnpmパッケージの方法で変更できる
- サブモジュール:
index.js
の中でロード
// 例: mymodule/index.js
module.exports = {
aaa: require('./aaa.js'),
bbb: require('./bbb.js'),
}
利用側
require('ディレクトリパス')
require('/path/to/mymodule').aaa
node_modules/
による方法
- パスではなく
require('モジュール名')
のとき
- 優先: コアモジュールを検索
- なければ、
./node_modules/
にあるディレクトリ(名)で検索 - なければ、上層の
node_modules/
で見つかるまで検索
- 主にnpmパッケージの方法で使う
グローバルなディレクトリによる方法
以上のどこにもモジュールが見つからないとき、下記でも検索される。
- 環境変数
NODE_PATH
::
区切りで指定のディレクトリ $HOME/.node_modules/
など