CommonJSモジュールのエクスポートの違い
JavaScriptにおけるCommonJSモジュールシステムでのmodule.exports
とexports
の違い
CommonJSモジュールシステムは、Node.jsやブラウザ環境でJavaScriptのコードをモジュール化するための規格です。このシステムでは、モジュールは独立したファイルとして存在し、他のモジュールからrequire
関数を使用してインポートされます。
exports
オブジェクト
- このオブジェクトのプロパティやメソッドを他のモジュールからインポートすることができます。
exports
オブジェクトは、モジュールがデフォルトで公開するオブジェクトです。
// module.js
exports.name = "John Doe";
exports.age = 30;
// main.js
const module = require('./module');
console.log(module.name); // Output: John Doe
console.log(module.age); // Output: 30
module.exports
オブジェクト
module.exports
を直接変更することで、モジュールが公開するオブジェクトをカスタマイズすることができます。exports
オブジェクトは、module.exports
オブジェクトのエイリアスとして扱われます。module.exports
オブジェクトは、モジュールが実際に公開されるオブジェクトです。
// module.js
module.exports = {
name: "John Doe",
age: 30
};
// main.js
const module = require('./module');
console.log(module.name); // Output: John Doe
console.log(module.age); // Output: 30
いつどちらを使うべきか
- カスタムオブジェクトを公開する場合
module.exports
を直接変更して、任意のオブジェクトを公開することができます。 - 通常の場合
exports
オブジェクトを使用するのが一般的です。
exports
は、module.exports
のエイリアスであり、通常はexports
を使用します。
CommonJSモジュールシステムにおけるmodule.exports
とexports
の違い:具体的なコード例と解説
exportsオブジェクトを使った例
// module.js
exports.name = 'Taro Yamada';
exports.age = 30;
// main.js
const module = require('./module');
console.log(module.name); // 出力: Taro Yamada
console.log(module.age); // 出力: 30
- 解説
module.js
でexports.name
とexports.age
のようにプロパティを直接追加することで、module
オブジェクトのname
とage
プロパティとして外部からアクセスできるようにしています。main.js
でrequire
を使ってmodule.js
をインポートし、module.name
やmodule.age
で値を取得しています。
// module.js
module.exports = {
name: 'Hanako Suzuki',
age: 25,
greet: function() {
console.log('こんにちは!');
}
};
// main.js
const module = require('./module');
console.log(module.name); // 出力: Hanako Suzuki
module.greet(); // 出力: こんにちは!
- 解説
module.exports
に直接オブジェクトを代入することで、そのオブジェクト全体をモジュールとして公開しています。- この例では、
name
、age
というプロパティに加えて、greet
という関数も公開しています。 main.js
でmodule.greet()
のように関数を実行することも可能です。
exportsとmodule.exportsを混在させた例 (推奨されない)
// module.js
exports.name = 'John Doe';
module.exports = {
age: 30
};
// main.js
const module = require('./module');
console.log(module.name); // undefinedとなる可能性がある
console.log(module.age); // 30が出力される
- 解説
exports
とmodule.exports
を両方使用した場合、module.exports
に最後に代入された値がモジュールとして公開されます。- この例では、
module.exports
にオブジェクトが代入されたため、exports.name
は無視され、module.name
はundefined
になる可能性があります。 - このような書き方は混乱を招きやすく、推奨されません。
exports
とmodule.exports
を混在させることは避けるべきです。- 通常は
exports
を使用してプロパティを追加していくことで、モジュールを公開します。
- シンプルなモジュールであれば、
exports
を使用するのが一般的です。
- CommonJSはNode.jsで広く利用されているモジュールシステムですが、最近のJavaScriptではES Modulesが主流になりつつあります。ES Modulesでは
export
とimport
キーワードを使用し、より簡潔な記述が可能になります。
より詳しく知りたい方へ
exports
とmodule.exports
の違いについて、より詳細な解説や他の例を見たい場合は、以下のキーワードで検索してみてください。- CommonJS モジュールシステム exports module.exports 違い
- Node.js モジュール exports module.exports
- JavaScript モジュールシステム
直接module.exportsに値を代入
最も一般的な方法です。module.exports
に任意の値(オブジェクト、関数、プリミティブ型など)を直接代入することで、その値がモジュールのエクスポートとなります。
// module.js
module.exports = 42; // 数値をエクスポート
exportsオブジェクトのプロパティを直接変更
exports
オブジェクトは、module.exports
のエイリアスとして扱われます。そのため、exports
オブジェクトのプロパティを直接変更することで、module.exports
の内容も変更できます。
// module.js
exports.message = 'Hello, world!';
関数式
モジュールを関数として定義し、その関数の戻り値をmodule.exports
に代入することで、より複雑なエクスポートを実現できます。
// module.js
module.exports = function() {
return {
name: 'John Doe',
age: 30
};
};
クラス
ES6以降ではクラスが導入されました。module.exports
にクラスを代入することで、クラスをモジュールとしてエクスポートできます。
// module.js
class Person {
constructor(name) {
this.name = name;
}
}
module.exports = Person;
複数の値をエクスポート
// module.js
module.exports = {
name: 'Alice',
age: 25,
greet: function() {
console.log('Hello!');
}
};
どの方法を選ぶべきか
- 複雑なロジック
関数やクラスを定義し、module.exports
に代入する。 - シンプルな値
数値、文字列などの場合は、直接module.exports
に代入する。
注意点
module.exports
に一度値を代入すると、その後exports
オブジェクトのプロパティを追加しても、module.exports
には反映されません。
CommonJSモジュールシステムでは、module.exports
とexports
以外にも、さまざまな方法でモジュールをエクスポートできます。どの方法を選ぶかは、モジュールの構造やエクスポートしたい値の種類によって異なります。
- 命名規則
モジュール名を分かりやすくするために、PascalCase(大文字で始まる単語を連結)で命名することが一般的です。 - ES Modules
より新しいモジュールシステムであるES Modulesでは、export
キーワードを使用してモジュールをエクスポートします。CommonJSと比較して、より簡潔な記述が可能になります。
javascript node.js commonjs