top-level await
のでコードをIIAFE (Immediately Invoked Async Function Expression) (async () => {})()
で囲う必要がある
可読性低下
静的解析が難しい
テストしづらい
あるモジュールの読み込み中にawaitがあるとそれを置いておいて次のモジュールの読み込みに入る
index.mjsimport "./child-a.mjs";
import "./child-b.mjs";
console.log("親モジュール 実行");
child-a.mjsimport { setTimeout } from "timers/promises";
console.log("child-a 読み込み");
await setTimeout(2000);
console.log("child-a 2秒後");
child-b.mjsimport { setTimeout } from "timers/promises";
console.log("child-b 読み込み");
await setTimeout(1000);
console.log("child-b 1秒後");
結果❯ node top-level-await/index.mjs
child-a 読み込み
child-b 読み込み
child-b 1秒後
child-a 2秒後
親モジュール
CommonJSの
require()
は同期的なのでCommonJSではtop-level awaitできない