Node.jsモジュール開発:module.exports vs exports の徹底解説

2024-04-02

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.exportsexportsを同時に使用することは避けてください。予期せぬ動作が発生する可能性があります。
  • exportsmodule.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.exportsexports、ES Modules、クラス、ファンクションなど、さまざまな方法があります。それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分けることが重要です。


javascript node.js commonjs


Node.jsでサクッと実現!JavaScriptで2つの日付間のすべての日の配列を取得する方法

このチュートリアルでは、JavaScriptとNode. jsを使用して、2つの指定された日付間のすべての日の配列を取得する方法を説明します。2つの方法を紹介します。ループを使用する: これは最も基本的な方法ですが、非効率になる可能性があります。...


JavaScriptとjQueryでオブジェクトを効率的にソート:比較とベストプラクティス

JavaScript の組み込みメソッドである sort() を使うと、オブジェクトの配列を簡単にソートできます。このメソッドは、配列の要素を比較して並び替えます。この例では、name プロパティでオブジェクトを昇順にソートしています。比較関数 (a, b) は、2 つのオブジェクトを受け取り、name プロパティを比較して、-1、0、1 のいずれかを返します。...


【決定版】Express.jsにおけるreq.body解析:json、urlencoded、カスタムミドルウェアの比較

Express. jsは、Node. js上でWebアプリケーションを構築するための軽量で柔軟なフレームワークです。express. json()とexpress. urlencoded()は、Express. jsにおける重要なミドルウェアであり、クライアントから送信されたリクエストボディを解析する役割を担っています。...


React StrictMode で発生する findDOMNode の非推奨警告とその解決策

この警告メッセージは、Reactの開発モードである StrictMode で findDOMNode 関数が使用された場合に表示されます。findDOMNode は、Reactコンポーネントインスタンスから対応するDOMノードを取得するために使用される関数です。...


JavaScriptで"Module not found: Error: Can't resolve 'fs' in '/usr/src/app/node_modules/jpeg-exif/lib'" エラーを解決する

Module not found: Error: Can't resolve 'fs' in '/usr/src/app/node_modules/jpeg-exif/lib'意味:'fs' モジュールが '/usr/src/app/node_modules/jpeg-exif/lib' ディレクトリで読み込まれません。...


SQL SQL SQL SQL Amazon で見る



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

module. exports は、以下の2つの役割を担っています。モジュールの公開インターフェースを定義する モジュールから他のモジュールへ公開したい関数・変数・オブジェクトなどを module. exports に格納することで、外部からアクセス可能になります。


Node.jsでモジュールを理解する:module.exportsとexportsの初心者向けチュートリアル

Node. jsにおいて、モジュールシステムはコードを分割し、再利用性を高める重要な機能です。モジュールを定義する際に、「module. exports」と「exports」という2つのオブジェクトが使われますが、混同されやすい点も存在します。