CommonJS
ES Modulesの世界観上ではcommonjsなソースファイルはmoduleではなくscriptとして扱われることに注意 module.exports や exports を使ってエクスポートする
code:mod.js
// 同じ
module.exports.add = (x, y) => x + y;
module.exports = { add: (x, y) => x + y, };
exports.add = (x, y) => x + y;
exports は module.exports を参照している
exports.add = ... はできるが exports = {add: ...}すると参照先が変わって正常にエクスポートできない
参照を隠蔽しようとするとこういうことになるのでやめたほうがいいよ
require() でインポートする
code:main.js
const mod = require("./mod");
mod.add(42, 46);
拡張子 .js は省略できる
ディレクトリ foo を指定すると foo/index.js を参照する
ES Modulesの import "" と異なり require() はどこでも書ける
ES Modulesの import() と異なり require() は同期的に読み込まれる
読み込んだモジュールをキャッシュするので、REPLで一回呼んだモジュールをあとで変更した場合はキャッシュを消す必要がある
require.cache[モジュールのフルパス] に入っている
モジュールのフルパスは require.resolve(相対パス) で得られる
ES Modulesとして見たときCommonJSモジュールはmoduleではなくscriptになるので "use strict" がないとstrictモードにならない