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