Node.js モジュール開発:module.exports を使って関数・変数・オブジェクトを公開する方法

2024-04-02

Node.jsにおけるmodule.exportsの役割と使い方

module.exportsの役割

module.exports は、以下の2つの役割を担っています。

  1. モジュールの公開インターフェースを定義する モジュールから他のモジュールへ公開したい関数・変数・オブジェクトなどを module.exports に格納することで、外部からアクセス可能になります。
  2. デフォルトのエクスポートとして機能する 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.exportsexports の間には以下の違いがあります。

  • 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


初心者でもわかる!jQueryでiframeの読み込み完了時にイベントを発生させる方法

jQueryを使用して、iframeの読み込み完了時にイベントを発生させる方法はいくつかあります。 以下に、代表的な方法をいくつか紹介します。方法1: loadイベントを使用するこれは最も簡単な方法です。 loadイベントは、iframeのコンテンツが完全に読み込まれたときに発生します。 以下のコードは、loadイベントを使用して、iframeの読み込み完了時にメッセージを表示する方法を示しています。...


JavaScript、Node.js、Express を使って 404 エラー処理

Express は、Node. js 用の Web アプリケーション フレームワークです。迅速で効率的な Web アプリケーションを構築するために広く使用されています。Express を使用して、さまざまな種類の HTTP レスポンスを送信できます。404 レスポンスは、リクエストされたリソースが見つからない場合に送信される一般的な応答です。...


【徹底比較】HTML、Node.js、FFmpeg vs WebRTC vs WebSocket:リアルタイムHTTPストリーミングの最適な選択

HTML は、動画プレーヤーを埋め込むために使用されます。プレーヤーは、ビデオストリームを受信し、ブラウザ上でデコードして表示します。HTML5 の <video> タグを用いることで、シンプルなプレーヤーを簡単に作成できます。Node. js は、ストリーミングサーバーを作成するために使用されます。Node...


【JavaScript・iOS・Node.js】Firebaseアプリ開発でよく見かけるエラー「No Firebase App」の解決策とサンプルコード集

このエラーが発生する主な理由は 2 つあります。このエラーを解決するには、以下の手順に従ってください。コード例:firebase. app() 関数は、デフォルトの Firebase アプリを取得するために使用されます。デフォルトのアプリが既に初期化されている場合は、この関数はそのアプリを返します。...


TypeScript enum to object array

最も簡単な方法は、map 関数を使って列挙型の各メンバーをオブジェクトに変換することです。このコードでは、まず Object. keys(MyEnum) を使って列挙型のすべてのメンバー名を取得します。次に、map 関数を使って各メンバー名を変換し、オブジェクトを作成します。オブジェクトには、name プロパティと id プロパティが含まれます。name プロパティにはメンバー名、id プロパティにはメンバーの値が格納されます。...