Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2020年1月.
import() 構文は、よくダイナミックインポートと呼ばれますが、非同期かつ動的に、 ECMAScript モジュールを、潜在的にモジュールではない環境に読み込めるようにする関数風の式です。
宣言スタイルのものとは異なり、動的インポートは必要なときだけ評価され、より柔軟な構文が可能になります。
import() 呼び出しは関数呼び出しによく似た構文ですが、 import 自体はキーワードであり、関数ではありません。const myImport = import のようなエイリアスを作成することはできず、 SyntaxError が発生します。
末尾カンマは、ランタイムが options にも対応している場合にのみ許可されます。ブラウザーの互換性を確認してください。
インポート元モジュール。指定子の評価はホスト次第ですが、常に静的なインポート宣言と同じアルゴリズムに従います。
optionsインポートオプションを格納するオブジェクト。以下のキーが認識されます。
with以下のプロミスを返します。
メモ: import() が同期的にエラーを発生させることはありません。
import 宣言の構文 (import something from "somewhere") は静的で、常にモジュールが 読み込まれた時点で評価される結果となります。ダイナミックインポートを使用すると、import宣言の構文の硬直性を回避し、条件付きまたはオンデマンドでモジュールを読み込むことができます。以下のような理由で、動的インポートが使用することがあります。
動的インポートは必要なときだけ使用してください。静的な形は、初期の依存関係を読み込むのに適しており、静的解析ツールやツリーシェイキングの恩恵を受けやすくなります。
ファイルがモジュールとして実行されていない場合(HTML ファイルで参照される場合、script タグに type="module" が必要)、静的な import 宣言は使用できませんが、非同期の動的 import 構文は常に利用できるので、モジュール以外の環境にもモジュールをインポートすることができます。
options 引数を使用すると、さまざまなインポートオプションを指定できます。例えば、インポート属性などです。
動的モジュールインポートは、すべての実行コンテキストで許可されているわけではありません。例えば、import() はメインスレッド、共有ワーカー、専用ワーカーで使用できますが、サービスワーカーやワークレット内で呼び出すと例外が発生します。
モジュール名前空間オブジェクト は、モジュールからのすべてのエクスポートを記述しているオブジェクトです。これは静的なオブジェクトで、モジュールが評価されるときに作成されます。モジュールの名前空間オブジェクトにアクセスする方法は 2 つあります。名前空間インポート (import * as name from moduleName)、または動的インポートの履行値を通じてです。
モジュール名前空間オブジェクトは封印された、プロトタイプが nullのオブジェクトです。これは、オブジェクトのすべての文字列キーが、モジュールのエクスポートに対応し、余分なキーがないことを意味しています。すべてのキーは辞書順に列挙可能で(すなわちArray.prototype.sort() の既定の動作)、デフォルトエクスポートは default というキーで利用できます。さらに、モジュール名前空間オブジェクトには [Symbol.toStringTag] プロパティがあり、値は "Module" で、 Object.prototype.toString() で使用されるものです。
文字列プロパティは構成不可能で、Object.getOwnPropertyDescriptors() を使用してその記述子を取得すると書き込みが可能になります。しかし、プロパティを新しい値に再割り当てることはできないため、実質的に読み取り専用となります。この動作は、静的インポートが「ライブ結合」- 値をエクスポートするモジュールは再割り当てることができるが、インポートするモジュールはできない - を作成するという事実を反映したものです。プロパティの書き込み可否は、値が変化する可能性を反映します。構成不可能で書き込み不可のプロパティは一定でなければならないためです。例えば、変数のエクスポートされた値を再代入することができ、新しい値はモジュール名前空間オブジェクトで監視することができます。
それぞれの(正規化された)モジュール指定子は固有のモジュール名前空間オブジェクトに対応するため、一般的には以下のようになります。
ただし、1 つだけ奇妙な場合があります。プロミスは決して thenable に履行されることはないので、もし my-module.js モジュールが then() という関数をエクスポートすると、その関数はプロミス解決プロセスの一部として、ダイナミックインポートのプロミスが履行されると自動的に呼ばれることになります。
警告: モジュールから then() という名前の関数をエクスポートしないでください。これにより、モジュールは動的にインポートされたときと静的にインポートされたときで異なる動作をします。
この積極的なキャッシュにより、JavaScript コードは複数回インポートされても一度だけしか実行されないことが保証されます。将来のインポートは HTTP リクエストやディスクアクセスにすら発展しません。JavaScript 環境全体を再起動せずにモジュールを再インポートして再評価する必要がある場合、一つの可能なトリックは、モジュール指定子で一意のクエリーパラメーターを使用することです。これは URL 指定子をサポートするブラウザー以外のランタイムでも動作します。
これにより、長時間実行されるアプリケーションでメモリーリークが発生する可能性があることに注意してください。エンジンはモジュール名前空間オブジェクトを安全にガベージコレクションできないためです。現在、モジュール名前空間オブジェクトのキャッシュを手動でクリアする方法はありません。
また、フェッチ API を使用してモジュールのソースコードをテキストとして取得し、モジュールの型に応じて手動で評価することもできます。
ただし、これは意味的には動的インポートとは異なります。フェッチの出力先、CSP、モジュールの解決といったユーザーエージェントの設定が、正しく適用されない可能性があるからです。
モジュール名前空間オブジェクトのキャッシュは、正常に読み込まれ、リンクされたモジュールにのみ適用されます。モジュールは 3 つのステップでインポートされます:読み込み(モジュールの取得)、リンク(主にモジュールの解析)、評価(解析されたコードの実行)。評価の失敗のみがキャッシュされます。モジュールの読み込みやリンクに失敗した場合、次のインポートで再度読み込みとリンクを試行する場合があります。ブラウザーは取得操作の結果をキャッシュする場合としない場合がありますが、一般的な HTTP セマンティクスに従うべきなので、そのようなネットワーク障害の処理は fetch() の失敗を処理することと異なるべきではありません。
自分のプロジェクトで ESM をエクスポートするパッケージを使用する場合、副作用がある場合のみインポートすることもできます。この場合、パッケージのエントリーポイントファイル(およびこのファイルがインポートするすべてのファイル)内のコードのみが実行されます。
インポートされたモジュール名前空間オブジェクトを構造分解する場合、default は予約語であるため、default キーの名前を変更する必要があります。
この例では、ユーザーの操作(この場合はボタンのクリック)に基づいてページに機能を読み込ませ、そのモジュール内の関数を呼び出す方法を示しています。この機能を実装するための唯一の方法というわけではありません。import() 関数は await にも対応しています。
サーバーサイドレンダリングなどの処理では、サーバーとブラウザーで異なるグローバルやモジュールと対話するため、異なるロジックを読み込む必要がある場合があります(例えば、ブラウザーのコードは document や navigator などのウェブ API に、サーバーコードはサーバーファイルシステムにアクセスすることができます)。条件付きの動的インポートによって、このようなことが可能になります。
動的インポートでは、モジュール指定子として、文字列リテラルに限らず、任意の式で指定することができます。
ここでは、 /modules/module-0.js、/modules/module-1.js など、10 個のモジュールを並列に読み込んで、それぞれがエクスポートする load 関数を呼び出しています。
インポート属性を import() 構文の第二引数として受け入れることができます。
| ECMAScript® 2027 Language Specification # sec-import-calls |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2026年4月1日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.