generated at
top-level await

ES Modules コードのトップレベルでawaitできる機能
かつてのECMAScript仕様のasync/awaitでは、async関数内でしかawaitできなかった
のでコードをIIAFE (Immediately Invoked Async Function Expression) (async () => {})() で囲う必要がある
可読性低下
静的解析が難しい
テストしづらい
あるモジュールの読み込み中にawaitがあるとそれを置いておいて次のモジュールの読み込みに入る
index.mjs
import "./child-a.mjs"; import "./child-b.mjs"; console.log("親モジュール 実行");
child-a.mjs
import { setTimeout } from "timers/promises"; console.log("child-a 読み込み"); await setTimeout(2000); console.log("child-a 2秒後");
child-b.mjs
import { 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できない