--- title: import slug: Web/JavaScript/Reference/Statements/import tags: - ECMAScript 2015 - JavaScript - Language feature - Modules - Reference - Statement - dynamic import - import translation_of: Web/JavaScript/Reference/Statements/import ---
import
文は、他のモジュールによってエクスポートされた読み込み専用のライブバインディングをインポートするために使用します。インポートされたモジュールは、宣言するかどうかにかかわらず、{{JSxRef("Strict_mode","Strict モード")}}になります。import
文は、スクリプトに type="module"
がない限り、埋め込みスクリプトで使用できません。インポートされたバインディングは、バインディングをエクスポートしたモジュールによって更新されるため、ライブバインディングと呼ばれます。
また、type="module"
のスクリプトを必要としない動的 import()
という関数のようなものもあります。
{{HTMLElement("script")}} タグの nomodule
属性を使用すると、下位互換性を確保できます。
import defaultExport from "module-name"; import * as name from "module-name"; import { export1 } from "module-name"; import { export1 as alias1 } from "module-name"; import { export1 , export2 } from "module-name"; import { foo , bar } from "module-name/path/to/specific/un-exported/file"; import { export1 , export2 as alias2 , [...] } from "module-name"; import defaultExport, { export1 [ , [...] ] } from "module-name"; import defaultExport, * as name from "module-name"; import "module-name"; var promise = import("module-name");
defaultExport
module-name
.js
ファイルへの相対または絶対パス名です。バンドラーによっては、拡張子を加えることが許され、あるいは求められることがあります。環境を確認してください。シングルクォートとダブルクォートだけが使えます。name
exportN
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
から暗黙的 (モジュール全体がエクスポートされた場合) あるいは {{jsxref("Statements/export", "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';
これは{{anch("Dynamic Imports", "動的インポート")}}にも対応しています。
(async () => { if (somethingIsTrue) { // 副作用のためのインポートモジュール await import('/modules/my-module.js'); } })();
プロジェクトで ESM をエクスポートするパッケージを使用している場合は、副作用のためだけにインポートすることもできます。これにより、パッケージエントリーポイントファイル(およびインポートするすべてのファイル)のコードのみが実行されます。
デフォルトの {{jsxref("Statements/export", "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'; // 特定の名前つきのインポート
{{anch("Dynamic Imports", "動的インポート")}}を使用してデフォルトのエクスポートをインポートする場合、動作が少し異なります。返されたオブジェクトから "default" キーを破棄して名前を変更する必要があります。
(async () => { if (somethingIsTrue) { const { default: myDefault, foo, bar } = await import('/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 リクエストの処理を支援する補助モジュールからインポートする方法を示しています。
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))); }
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; }); }); }
仕様書 |
---|
{{SpecName("ESDraft", "#sec-imports", "Imports")}} |
{{SpecName("ESDraft", "#sec-import-calls", "Import Calls")}} |
{{Compat("javascript.statements.import")}}
import.meta