Node.js モジュール開発:module.exports を使って関数・変数・オブジェクトを公開する方法
Node.jsにおけるmodule.exportsの役割と使い方
module.exportsの役割
module.exports は、以下の2つの役割を担っています。
- モジュールの公開インターフェースを定義する モジュールから他のモジュールへ公開したい関数・変数・オブジェクトなどを module.exports に格納することで、外部からアクセス可能になります。
- デフォルトのエクスポートとして機能する
require()
でモジュールを読み込んだ際に、module.exports に格納された値がデフォルトで返されます。
module.exportsの使い方
オブジェクトリテラルで直接格納する
// モジュール内の関数
function add(a, b) {
return a + b;
}
// module.exports にオブジェクトリテラルを格納
module.exports = {
add: add,
};
この例では、add
関数を module.exports
に格納することで、他のモジュールから require
で読み込み、add
関数を利用できるようになります。
プロパティとして格納する
// モジュール内の関数
function add(a, b) {
return a + b;
}
// module.exports にプロパティとして格納
module.exports.add = add;
exports との違い
module.exports とよく似たオブジェクトに exports があります。exports もモジュールの公開インターフェースを定義するために使用できますが、module.exports と exports の間には以下の違いがあります。
- module.exports はオブジェクトへの参照であり、exports はオブジェクトそのものである
- module.exports はデフォルトのエクスポートとして機能するが、exports はデフォルトのエクスポートとして機能しない
一般的には、module.exports を使用することを推奨されています。
まとめ
モジュールファイル (my-module.js)
// モジュール内の関数
function add(a, b) {
return a + b;
}
// module.exports にオブジェクトリテラルを格納
module.exports = {
add: add,
// 他の関数や変数
subtract: (a, b) => a - b,
message: 'Hello from my-module!',
};
モジュールを読み込むファイル (app.js)
const myModule = require('./my-module');
// モジュールから関数・変数・オブジェクトを利用
console.log(myModule.add(1, 2)); // 3
console.log(myModule.subtract(4, 3)); // 1
console.log(myModule.message); // Hello from my-module!
このコードを実行すると、以下の出力が得られます。
3
1
Hello from my-module!
このサンプルコードは、my-module.js
モジュールを作成し、add
関数、subtract
関数、message
変数を module.exports
に格納しています。app.js
ファイルでは、require()
を使って my-module.js
モジュールを読み込み、add
関数、subtract
関数、message
変数を利用しています。
module.exports の代替方法
ES Modules
ES Modules は、JavaScript の標準モジュールシステムであり、Node.js でも使用できます。ES Modules を使用すると、以下のように export
キーワードを使ってモジュールを公開できます。
// モジュールファイル (my-module.js)
export function add(a, b) {
return a + b;
}
export const message = 'Hello from my-module!';
// モジュールを読み込むファイル (app.js)
import { add, message } from './my-module';
// モジュールから関数・変数を利用
console.log(add(1, 2)); // 3
console.log(message); // Hello from my-module!
ES Modules は、以下の利点があります。
- シンプルで読みやすいコード:
export
キーワードを使ってシンプルにモジュールを公開できます。 - 名前空間による衝突の回避: モジュールごとに名前空間が作成されるため、変数名や関数名の衝突を防ぐことができます。
- ツリーシェイキング: 使用されていないモジュールコードはバンドルから除外されるため、コードサイズを削減できます。
CommonJS
CommonJS は、Node.js 以前から使用されていたモジュールシステムです。CommonJS では、以下のように module.exports
オブジェクトにプロパティを追加することでモジュールを公開できます。
// モジュールファイル (my-module.js)
module.exports.add = function add(a, b) {
return a + b;
};
module.exports.message = 'Hello from my-module!';
// モジュールを読み込むファイル (app.js)
const myModule = require('./my-module');
// モジュールから関数・変数を利用
console.log(myModule.add(1, 2)); // 3
console.log(myModule.message); // Hello from my-module!
- Node.js 以前から使用されていた: Node.js 以前から使用されていたため、多くの既存モジュールが CommonJS 形式で提供されています。
- コードの互換性: CommonJS 形式で書かれたコードは、ES Modules でも使用できます。
AMD
AMD は、RequireJS などのモジュールローダーで使用されるモジュールシステムです。AMD では、以下のように define
関数を使ってモジュールを定義できます。
// モジュールファイル (my-module.js)
define(['require', 'exports'], function (require, exports) {
function add(a, b) {
return a + b;
}
exports.add = add;
exports.message = 'Hello from my-module!';
});
// モジュールを読み込むファイル (app.js)
require(['./my-module'], function (myModule) {
// モジュールから関数・変数を利用
console.log(myModule.add(1, 2)); // 3
console.log(myModule.message); // Hello from my-module!
});
- 非同期モジュールロード: 依存関係のあるモジュールを非同期にロードできます。
- 依存関係の解決: モジュールローダーが依存関係を解決してくれるため、コードをシンプルに書けます。
まとめ
module.exports は、Node.js モジュールで最も一般的に使用されるオブジェクトですが、ES Modules、CommonJS、AMD などの代替方法もあります。各方法にはそれぞれ利点と欠点があるため、プロジェクトの要件に合わせて最適な方法を選択する必要があります。
javascript node.js