Node.jsモジュール開発:module.exports vs exports の徹底解説
Node.jsにおける「module.exports」と「exports」の違い
オブジェクトへの参照方法
- module.exports: モジュールオブジェクトのプロパティとして存在します。
- exports: 変数として存在し、module.exportsと同じオブジェクトを参照します。
複数のオブジェクトを公開
- module.exports: 複数のオブジェクトを公開することはできません。常に最後に設定されたオブジェクトのみが有効になります。
- exports: オブジェクトのプロパティとして追加することで、複数のオブジェクトを公開できます。
動作の違い
- module.exports: モジュールが読み込まれた時にrequire関数によって返されます。
- exports: 直接アクセスすることはできず、module.exportsを通して間接的にアクセスされます。
使用例
- module.exports: 1つのオブジェクトを公開する場合
module.exports = function add(a, b) {
return a + b;
};
exports.add = function add(a, b) {
return a + b;
};
exports.subtract = function subtract(a, b) {
return a - b;
};
注意点
- module.exportsとexportsを同時に使用することは避けてください。予期せぬ動作が発生する可能性があります。
- exportsはmodule.exportsへのエイリアスであるため、exportsに新しいオブジェクトを代入するとmodule.exportsへの参照が失われます。
まとめ
module.exports を使用して1つのオブジェクトを公開
// add.js
module.exports = function add(a, b) {
return a + b;
};
// main.js
const add = require('./add');
console.log(add(1, 2)); // 3
exports を使用して複数のオブジェクトを公開
// math.js
exports.add = function add(a, b) {
return a + b;
};
exports.subtract = function subtract(a, b) {
return a - b;
};
// main.js
const math = require('./math');
console.log(math.add(1, 2)); // 3
console.log(math.subtract(4, 2)); // 2
module.exports と exports を同時に使用
// bad-example.js
module.exports = function add(a, b) {
return a + b;
};
exports.subtract = function subtract(a, b) {
return a - b;
};
// main.js
const add = require('./bad-example');
console.log(add(1, 2)); // 3
// エラーが発生: `exports.subtract` は存在しない
console.log(add.subtract(4, 2));
module.exports と exports を同時に使用することは避けてください。
Node.jsモジュールを公開する他の方法
ES Modulesは、JavaScriptの標準モジュールシステムです。CommonJSよりも新しい規格であり、より簡潔で分かりやすいコードを書くことができます。
// add.mjs
export function add(a, b) {
return a + b;
}
// main.js
import { add } from './add.mjs';
console.log(add(1, 2)); // 3
クラスを使用してモジュールを作成することもできます。
// Person.js
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name}!`);
}
}
// main.js
const Person = require('./Person');
const person = new Person('John Doe', 30);
person.sayHello(); // Hello, my name is John Doe!
ファンクション
単純なモジュールであれば、ファンクションとして公開することもできます。
// add.js
function add(a, b) {
return a + b;
}
// main.js
const add = require('./add');
console.log(add(1, 2)); // 3
まとめ
Node.jsモジュールを公開するには、module.exports
、exports
、ES Modules、クラス、ファンクションなど、さまざまな方法があります。それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分けることが重要です。
javascript node.js commonjs