🚀
【超初心者向け】Node.jsに出てくる「module」は何者?
Firebase Cloud Functionsの
エンドポイント(リクエスト(API呼び出し)が実行される場所)を定義している、
const express = require('express');
について、前回はコチラでまとめましたが、
functions/src/api/routes/events.routes.js
の中には
まだまだ、私にはよくわからない記述(呪文)があります。
その中の一つに、
module.exports = router;
という記述が(大抵)ありますが、
その意味についてまとめました。
moduleが登場する場所
エンドポイント(リクエスト(API呼び出し)が実行される場所)を定義している、
functions/src/api/routes/events.routes.js
の中の
const express = require('express');
const router = express.Router();
const { createEvent } = require('../controllers/events.controller');
router.post('/events', createEvent);
module.exports = router;
といったソースに(大抵の場合)書かれているのが
module.exports = router;
という処理になります。
この処理は
「ルーターをエクスポートして他のファイルで使用可能にする」
という処理になりますが、突然「module」が出てきて、
初見では「どこから出てきたんじゃ?」と困惑する人もいるでしょう(私のこと)
「module」は何者?
module
はNode.jsのモジュールシステムの一部で、各JavaScriptファイルで自動的に利用できるグローバルオブジェクトです。
ここで、Node.jsの「モジュール」の考え方を説明すると、
- Node.jsでは、各.jsファイルは独立した「モジュール」として扱われます
- 各モジュールには自動的に
module
というオブジェクトが提供されます。「各モジュール」に「module
というオブジェクト」、ヤヤコシイネ。 -
module.exports
は、そのモジュールが外部に公開したい値やオブジェクトを設定するためのプロパティです
「グローバル」というと、「色んなところから見える」
みたいなイメージがありますが、
C言語のようなグローバル変数、とmodule
は異なります。
// Node.jsの場合
console.log() // どこでも使える
process // どこでも使える
module // どこでも使える
// でも...
module = {} // ← これはエラー!変更はできない
// C言語の場合
int globalVar = 10;
// どこでも見える&変更も可能
globalVar = 20; // OK
つまり:
- 「見える」という点では似ています
- でも Node.js の場合は「見えるけど勝手に変更はできない」という安全な設計になっています
- C言語のグローバル変数は「見える&変更も自由」という、より自由な(でも危険な可能性もある)設計です
このように、Node.jsは「どこからでも使えるけど、安全に使える」という
現代的な設計思想を採用しています。
おしまいに
グローバル変数を追いかけすぎて迷子になること、よくありました。
Discussion