モジュールメモ

過去(といっても、2015年ごろ?)にはCommonJSやAMDなどモジュールの実装が複数あり、なおかつ公式のモジュール実装がなかったため、極めて混乱した状況になっていた。

ES2015でES modulesが策定され、公式のモジュール仕様ということもあり2021年現在ではデファクトスタンダードのポジションを確立しているようである。なので、ES modulesについてここではメモする。

nodeコマンドで実行する場合

拡張子をjsではなくmjsにする必要がある。

[TODO] なんでmjsである必要があるのか調べる

読み込まれる側

外部から参照できる関数などをexportで宣言する必要がある。C言語などでの*.hファイルのイメージ。

// module.js
export function add(a, b) {
  return a + b;
}

読み込む側

importでファイルを読み込む。

// entrypoint.js
import { add } from './module.js';

console.log(add(1,1));

色々な記述方法

まとめてインポートする

import * as パッケージ名 from ファイルを使うとモジュールでexportされている全ての関数などをパッケージ名に紐づけて読み込むことができる。

import * as PackageName from './module.js';

PackageName.add(1,1);

別名でインポートする

import { 関数など as 別名 } from ファイルを使うと読み込んだ関数などを別名で参照できるようになる。元の名前では参照できない。

import { add ass plus } from './module.js';

console.log(plus(1,1));

デフォルトのインポートを指定する

export default エクスポート対象を宣言するとインポート側でimport パッケージ名 from ファイルでインポートすることができるようになる。

// module.js
function add(a,b) { return a + b; }
function sub(a,b) { return a - b; }
export function multi(a,b) { return a * b; }

export default { add, sub };
// entrypoint.js
import pkg from './module.js'
pkg.add(1,2);
// entrypoint.js
// デフォルト以外の関数などもインポートする場合
import pkg, { multi } from './module.js'
pkg.add(1,2);
multi(1,2);