ES Modules の使い方
主にフロントエンド(クライアント)で用いられるファイルの読み込み方法である ES Modules について解説する。ES Modules は ES6 で追加された機能であり、古いブラウザでは動作しない場合がある。
importの使い方
importは、ほかの .js や .ts ファイルを読み込むための機能であり、CommonJS のrequire()と同等の役割を果たす。しかし、基本的なimport構文は、require()とは異なり、ファイルの最上部に記述する必要がある。
以下に使用例を示す。
import * as package1 from 'package1';
import package2 from 'package2';
import { package3 } from 'package3';
アスタリスク(*)を使ったimport
* を使って import すると、exportされている変数や関数を一度にインポートし、package1 オブジェクトとしてアクセスすることが可能になる。
例えば、package1 モジュールが関数 foo と bar をエクスポートしている場合、以下のように利用できる。
import * as package1 from 'package1';
package1.foo();
package1.bar();
dynamic import
ES6 からはimport()という形式のdynamic importも導入されている。このdynamic importは、モジュールを非同期に読み込むための機能で、ファイルの任意の位置、つまりファイルの最上部に記述する必要はない。これにより、条件付きのモジュール読み込みや、パフォーマンスを向上させるための遅延ロード等が可能となっている。
なお、この dynamic import はPromiseを返すため、非同期処理の管理にはasync/awaitや.then()を用いる。
exportの使い方
exportは CommonJS のmodule.exportsに相当する機能であり、記述方法はdefault exportとnamed exportと呼ばれる 2 つがある。
// `default export`
export default (i) => i + 1;
// `named export`
export const increment = (i) => i + 1;
default exportの使い方
まず、exportするファイルで以下のように記述する。
const increment = (i) => i + 1;
export default increment;
次にモジュールを利用するファイルで以下のように記述する。
import increment from './util';
console.log(increment(3)); // -> 4
named exportの使い方
まず、exportするファイルで以下のように記述する。
const increment = (i) => i + 1;
export { increment };
次にモジュールを利用するファイルで以下のように記述する。
import { increment } from './util';
console.log(increment(3)); // -> 4
// or
import * as util from './util';
console.log(util.increment(3)); // -> 4
importで名前を変更する場合、requireとは異なりasという表記を用いて変更する。
この例ではconstで定数宣言をしているが、letを用いても読み込み側からincrementの定義を書き換えることはできない。
import { increment as inc } from './util';
console.log(inc(3)); // -> 4