import 文は、他のモジュールからエクスポートされたバインディング(関数、オブジェクト、プリミティブ)をインポートするために用います。インポートされたモジュールは宣言のあるなしにかかわらずStrict モードで動作します。import 文は、type="module" を指定しない限り、埋め込まれたスクリプトでは使えません。
構文
import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import(module-name);
defaultExport- モジュールからのデフォルトのエクスポートを参照する名前。
module-name- インポートするモジュール。 モジュールがある
.jsファイルへの相対または絶対パス名です。 バンドラーによっては、拡張子を加えることが許され、あるいは求められることがあります。 環境を確認してください。 シングルクォートとダブルクォートだけが使えます。 name- インポートを参照するとき名前空間のように用いられるモジュールオブジェクトの名前。
export, exportN- インポートするエクスポートの名前。
alias, aliasN- 指定されたインポートを参照する名前。
説明
name パラメータは、エクスポートを参照する名前空間のように用いられる「モジュールオブジェクト」の名前です。export パラメータは名前がつけられたエクスポートをそれぞれ指定します。それに対して、import * as name 構文はすべてをインポートします。構文の意味を明らかにするため、下記に例を示します。
モジュールのコンテンツすべてをインポートする
下記のコードは、myModule を現在のスコープに加え、/modules/my-module.js のファイルのモジュールからのエクスポートすべてを含めます。
import * as myModule from '/modules/my-module.js';
エクスポートにアクセスするには、モジュール名(ここでは「myModule」)を名前空間として用いることになります。 たとえば、上記でインポートされたモジュールがエクスポートにdoAllTheAmazingThings()を含む場合は、下記のように呼び出します。
myModule.doAllTheAmazingThings();
モジュールからエクスポートをひとつインポートする
myExport という名前のオブジェクトまたは値が、my-module から暗黙的 (モジュール全体がエクスポートされた場合) あるいは export 文を用いて明示的にエクスポートされると、myExport が現在のスコープに加えられます。
import {myExport} from '/modules/my-module.js';
モジュールから複数のエクスポートをインポートする
下記のコードは、foo と bar を現在のスコープに加えます。
import {foo, bar} from '/modules/my-module.js';
エクスポートを扱いやすいエイリアスにしてインポートする
インポートするときエクスポートの名前を変えることができます。 例えば下記のコードは、エクスポートを shortName として現在のスコープに加えます。
import {reallyReallyLongModuleExportName as shortName}
from '/modules/my-module.js';
インポートする際に複数のエクスポートの名前を変える
下記のコードは、複数のエクスポートを扱いやすいエイリアスにしてモジュールからインポートします。
import {
reallyReallyLongModuleExportName as shortName,
anotherLongModuleName as short
} from '/modules/my-module.js';
副作用のためだけにモジュールをインポートする
副作用だけのためにモジュール全体をインポートしたときは、何もインポートされません。 モジュールのグローバルコードが実行されるだけで、実際の値はインポートされないのです。
import '/modules/my-module.js';
デフォルトをインポートする
デフォルトの export(オブジェクト、関数、クラスなど)にも対応できます。 import 文を用いて、そのようなデフォルトをインポートします。
もっとも単純なやり方はデフォルトを直接インポートします。
import myDefault from '/modules/my-module.js';
また、デフォルトの構文とともに上記のエイリアス(名前空間または名前つきのインポート)を用いることもできます。 その場合は下記のように、デフォルトのインポートを先に宣言しなければなりません。
import myDefault, * as myModule from '/modules/my-module.js'; // myModule は名前空間として使う
あるいは、つぎのような書き方もできます。
import myDefault, {foo, bar} from '/modules/my-module.js';
// 特定の、名前つきのインポート
動的にインポートする
import キーワードを関数として呼び出すことで、モジュールを動的にインポートできます。この場合、Promise を返します。
import('/modules/my-module.js')
.then((module) => {
// module を使った何らかの処理
});
この方法は await キーワードを使えます。
let module = await import('/modules/my-module.js');
例
標準的なインポート
AJAX JSONリクエストの処理を助ける補助モジュールからインポートします。
モジュール: file.js
function getJSON(url, callback) {
let xhr = new XMLHttpRequest();
xhr.onload = function () {
callback(this.responseText)
};
xhr.open('GET', url, true);
xhr.send();
}
export function getUsefulContents(url, callback) {
getJSON(url, data => callback(JSON.parse(data)));
}
メインプログラム: main.js
import { getUsefulContents } from '/modules/file.js';
getUsefulContents('http://www.example.com',
data => { doSomethingUseful(data); });
動的なインポート
下記は、ユーザーの行動 (今回はボタンのクリック) をもとにページ内に何らかの機能を読み込み、そのモジュール内の関数を呼び出す方法を示すものです。
方法はこれだけではありません。import() 関数は await も使えます。
const main = document.querySelector("main");
for (const link of document.querySelectorAll("nav > a")) {
link.addEventListener("click", e => {
e.preventDefault();
import('/modules/my-module.js')
.then(module => {
module.loadPageInto(main);
})
.catch(err => {
main.textContent = err.message;
});
});
}
仕様
| 仕様書 | 策定状況 | コメント |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Imports の定義 |
標準 | 初期定義 |
| ECMAScript (ECMA-262) Imports の定義 |
現行の標準 | |
| tc39/proposal-dynamic-import | Stage 3 | 動的インポートの初期定義 |
ブラウザー実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
import | Chrome 完全対応 61 | Edge
完全対応
16
| Firefox
完全対応
60
| IE 未対応 なし | Opera 完全対応 48 | Safari 完全対応 10.1 | WebView Android 完全対応 61 | Chrome Android 完全対応 61 | Firefox Android
完全対応
60
| Opera Android 完全対応 45 | Safari iOS 完全対応 10.3 | Samsung Internet Android 完全対応 8.0 | nodejs
完全対応
13.2.0
|
| Dynamic import | Chrome 完全対応 63 | Edge 完全対応 79 | Firefox
完全対応
67
| IE 未対応 なし | Opera 完全対応 50 | Safari 完全対応 11.1 | WebView Android 完全対応 63 | Chrome Android 完全対応 63 | Firefox Android
完全対応
67
| Opera Android 完全対応 46 | Safari iOS 完全対応 11.3 | Samsung Internet Android 完全対応 8.0 | nodejs
完全対応
13.2.0
|
| Available in workers | Chrome
完全対応
80
| Edge
完全対応
80
| Firefox 未対応 なし | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 完全対応 80 | Chrome Android
完全対応
80
| Firefox Android 未対応 なし | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 実装ノートを参照してください。
- 実装ノートを参照してください。
- ユーザーが明示的にこの機能を有効にしなければなりません。
- ユーザーが明示的にこの機能を有効にしなければなりません。
関連情報
exportimport.meta- Previewing ES6 Modules and more from ES2015, ES2016 and beyond
- ES6 in Depth: Modules, Hacks blog post by Jason Orendorff
- ES modules: A cartoon deep-dive, Hacks blog post by Lin Clark
- Axel Rauschmayer's book: "Exploring JS: Modules"