Node.jsのモジュール読み込みではmodule.exports、exportsが利用できますが、違いがいまいち理解できていなかったので自分なりに整理してみました。
実装上の違いといった細かいことはリンク先にとても詳しく記載されていますので、今回は使い分け方に焦点を当てています。
module.exportsとexportsの使い分け
単一のクラスや関数、オブジェクトをエクスポートする場合はmodule.exportsを使います。
class MyClass { ... } module.exports = MyClass;
複数の関数やオブジェクトを持つオブジェクトをエクスポートする場合はexportsを使います。
function myFunc1 { ... } function myFunc2 { ... } exports.myFunc1 = myFunc1; exports.myFunc2 = myFunc2;
※ module.exportsを利用しても記述できますが、exportsの方がシンプルに記述できます。
module.exports = { myFunc1: myFunc1, myFunc2: myFunc1 }
requireを複数回実行したときの挙動
初回ロード時のみ評価され2回目以降はキャッシュされたオブジェクトが返却されます。
- module.js
var _var = Math.random(); function func() { console.log(`module.js - func : _var=${_var}`) } exports.func = func;
- main.js
const module1 = require('./module.js') const module2 = require('./module.js') module1.func() module2.func()
- 実行結果
module.js - func : _var=0.7381836391077983 module.js - func : _var=0.7381836391077983