import functionで読み込んだClassを使う(JavaScript)

この記事は約2分で読めます。
スポンサーリンク

やりたいこと

Dynamicでmoduleを読み込みたい場合import文ではなく import functionでモジュールを読み込みます。しかし単純に書いても思った通り動作しませんでした。

動作するように修正します。

スポンサーリンク

前提

修正前

以下のimport文をimport functionに書き換えます。

import { myClass } from './myClass.js';

myClass.jsからmyClass クラスを読み込みます。

ダメな例

以下のコードを試してみましたが動作しませんでした。

const myClass= import ('./myClass.js')
スポンサーリンク

動作するコード

結論から書くと以下のようにすると修正前ら書くと以下のようにすると修正前と同じ値がmyClassに入りました。

const myClass= (await import('./myClass.js'))['myClass'];
スポンサーリンク

解説

ではなぜダメな例では動かなかったのかを解説します。

これはimport()の返り値を2重で勘違いしているためです。

一つ目の勘違いはimport()がasync関数で返り値がpromiseであることです。

そのためawaitを追加して同期するようにしました。(もちろんthenで返り値を受けても問題ありません)

上記を踏まえて修正すると以下のようになりますが、まだ動作しません。

const myClass= await import('./myClass.js');

ここで二つ目の勘違いです。

上記のpromiseが返すのが欲しいクラスだけでなく、すべてのエクスポートを含んだオブジェクトを返すためです。(エクスポートが一つでも関係なくパックされます)

そのため以下のように[‘myClass’]で必要なクラス名を指定する必要があります。

const myClass= (await import('./myClass.js'))['myClass'];
スポンサーリンク

結果

import文をimport functionに置き換えることができました。

スポンサーリンク

参考にさせていただいたサイト

import() - JavaScript | MDN
import() 構文は、よくダイナミックインポートと呼ばれますが、非同期かつ動的に、 ECMAScript モジュールを、潜在的にモジュールではない環境に読み込めるようにする関数風の式です。

コメント

タイトルとURLをコピーしました