【Node.js入門】exports / module.exportsによるモジュール機能の使い方まとめ!

今回は、Node.jsが持つモジュール化の機能について詳しく学習をしていきましょう!

「モジュール化ってどういう機能なの?」
「複数のファイルに分割する方法が知りたい」
「exports / module.exportsの使い方を学びたい」

このような内容も含めて、本記事では以下のような構成で解説していきます!

【基礎】「exports」とは?
【基礎】「exports」の使い方
【実践】「modeule.exports」について
【実践】requireによるモジュールの読み込み方
【まとめ】exportsの使い方まとめ

この記事で、exportsをしっかり学習してスキルアップを目指していきましょう!

>>> 今すぐ「exportsの使い方」を知りたい方はこちら

目次

「exports」とは?

それでは、まず最初に「exports」について基本的な知識から身につけていきいましょう!

Node.jsには、モジュール化といってさまざまな機能を持ったプログラムを個別のファイルに分割することができます。

これにより効率よくコードを管理できるだけでなく、さまざまなユーザーが作成したプログラムを再利用しやすくできるわけです。

Node.jsにはこのようなモジュールを管理できるツール「npm」があり、世界中で便利なモジュールが公開されており誰でも無料で利用できるエコシステムがあります。

今回は、このようなモジュール化の作り方を中心に解説していきますのでぜひ参考にしてみてください!

「exports」の使い方

この章では、基本的なモジュール化の方法として「exports」の使い方を見ていきましょう!

主に、一般的な書き方や実際のモジュール作成方法について学んでいきます。

基本的な構文と書き方

まずは、exportsの基本となる書き方から見ていきましょう!

exportsを使うと、指定した値を外部のNode.jsファイルから読み込んで再利用することができるようになります。

次のサンプル例を見てください!

exports.プロパティ名 = 値

このように、exportsに続けて任意のプロパティ名を付与したうえで、外部ファイルから再利用したい値を設定すれば良いわけです。

この値は文字列・数値・配列・オブジェクト・関数など、さまざまなものを設定できます。

モジュールの作り方

早速ですが、実際にexportsを使って簡単なモジュールを作ってみましょう!

以下の例では、単純な文字列・オブジェクト・関数を使ってexportsしています。

exports.str = 'こんにちは';

exports.obj = {
  name: 'メロン',
  price: 500,
  store: '東京店舗'
};

exports.func = function() {
  console.log('exportsの関数');
};

この例では「exports.str」に文字列を格納し、「exports.obj」にオブジェクト「exports.func」に関数を格納していますね。

このように設定するだけでモジュール化されるので、あとはこのファイルを読み込めばいつでもこれらの値を再利用できるわけです。

※読み込み方法は後述します。

「module.exports」について

これまでexportsを使ってきましたが、実は類似のmodule.exportsを利用するのが一般的です。

使い方はほとんど同じで、以下のような形式になります。

module.exports.プロパティ名 = 値

そのため、例えばオブジェクトをexportsするには次のようになります。

module.exports.obj = {
  name: 'メロン',
  price: 500,
  store: '東京店舗'
};

前章のexportsの前にmoduleを付与しただけで、あとは特に変わりありません。

ただし、微妙に扱い方が異なる部分もあるので、もう少し詳しく見ていきましょう!

exports/module.exportsの違い

「exports」と「module.exports」の違いについて、最も分かりやすい例としてはプロパティを設定せずに値を直接格納できるかどうか?という点でしょう。

例えば、次のようなオブジェクトを格納する例を見てみます。

module.exports = {name: '太郎', age: 30}

この例では、「module.exports」にプロパティ名を設定せずに値を直接格納しているのが分かりますね。

これは問題ないのですが、次のように記述すると上手くいきません。

exports = {name: '太郎', age: 30};

この例では、「exports」にプロパティ名を設定せずに値を格納しています。

この場合はモジュール化とはならずに、外部から値を再利用することができません。

理由は簡単で、「module.exports」の場合はmoduleオブジェクトの中にあるexportsプロパティを参照していますよね?

exportsも同じようにデフォルト状態ではmoduleオブジェクトの中にあるexportsプロパティを参照しているのですが、値を直接格納してしまうとそれはただの新しいオブジェクトに変わってしまうからです。

つまり、「exports」という新しいオブジェクトを作成しているだけなので、モジュール化の機能は持っていないわけです。

このような理由から、一般的には「module.exports」を利用したモジュール化がよく使われています。

requireによるモジュールの読み込み方

さて、これまでexportsによってモジュール化の作り方を見てきましたが、このモジュールを読み込む方法も合わせて確認しておきましょう!

Node.jsでは「require」を利用することで、モジュールを簡単に読み込むことが可能です。

例えば、「sample.js」というファイル名で次のようなモジュールを作ってみます。

module.exports = {name: '太郎', age: 30}

これは単純なオブジェクトをexportsしているだけですね。

このモジュールを読み込むには、次のようにrequireを記述すればOKです!

var item = require('./sample.js');

console.log(item);

実行結果

{name: '太郎', age: 30}

requireの引数にモジュールとなる「sample.js」のファイルがあるパスを設定するだけです。

これにより、以降は変数「item」を利用して値を再利用できるわけです。

このreuqireにはさまざまな使い方があるのですが、その基本と応用を次の記事でまとめているのでぜひ合わせて参考にしてみてください!

「exports」の使い方まとめ

最後に、exportsの基本的な使い方をまとめておきます!

exportsは任意のプロパティ名を設定して再利用したい値を格納することで、外部ファイルからでも簡単に利用できるようになります。

基本的には、次のように文字列・数値・オブジェクト・関数などを格納できます。

exports.str = 'こんにちは';

exports.obj = {
  name: 'メロン',
  price: 500,
  store: '東京店舗'
};

exports.func = function() {
  console.log('exportsの関数');
};

いずれも任意のプロパティ名を付与していることを確認してください。

ちなみに、類似の「module.exports」を使っても同じことができます。

module.exports.obj = {
  name: 'メロン',
  price: 500,
  store: '東京店舗'
};

両者の大きな違いは、プロパティ名付与せずに値を直接格納できるかどうか?という点になります。

module.exports = {name: '太郎', age: 30};

この場合は問題なく動作しますが、「exports」に値を直接格納することはできません。

それは単に新しい「exports」というオブジェクトを作っているだけにすぎないからですね。

まとめ

今回は、Node.jsでexportsを使ったモジュール化の作り方について学習しました!

最後に、もう一度ポイントをおさらいしておきましょう!

・exportsは任意のプロパティ名を付与することでさまざまな値をモジュール化できる
・module.exportsも同じことが実現できてプロパティ名無しでもモジュール化できる
・exportsは必ずプロパティ名を付与しないと正しく機能しない

上記内容を踏まえて、ぜひ自分でもプログラミングに取り入れて活用できるように頑張りましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次