WebKitは2026年9月2日、Safari 27でJavaScriptのtop-level awaitを仕様に完全準拠させたとする解説記事を公開した。モジュールの読み込みと実行を管理するモジュールローダーを作り直し、初期化前の値にアクセスしてエラーになる問題を修正した。Safari 27は現地時間9月14日にリリースされる。
修正は6月に公開されたSafari 27ベータ版の紹介記事でも案内されており、今回の記事では実装を手がけたKai Tamkun氏が不具合の原因と修正の経緯を説明している。
Top-level await is fixed in Safari for iOS 27 and macOS Golden Gate. Here’s how I did it: https://t.co/UNHfzRRaaX
— Kai 🖖🏻👁👄👁🤘🏻 (@heimskr64) September 2, 2026
モジュールの初期化で非同期処理を待てるtop-level await
top-level awaitは、JavaScriptのモジュールの最上位で、async関数で囲まずにawaitを書ける機能。ECMAScript 2022に取り込まれた。たとえば外部からデータを取得し、その結果を使ってモジュール内の値を初期化するときに使える。
モジュールがtop-level awaitで非同期処理を待っている間は、それに依存するモジュールの実行も待機する。依存しない別のモジュールは、その間も実行を進められる。この仕組みにより、利用側のモジュールに初期化待ちの処理を別途書かずに、必要なデータがそろってから実行を始められる。
初期化前のアクセスエラーを解消、ローダーをC++で再実装
Safariは2021年のSafari 15でtop-level awaitを導入したが、旧ローダーは非同期のモジュール実行を前提としないWHATWG Loader提案に基づいていた。その設計にtop-level awaitを追加したため、ECMAScript仕様が定める非同期実行の手順とのずれが生じていた。
今回の解説記事では、同じモジュールを続けて動的に読み込む際の不具合を紹介している。初期化が終わる前に読み込みが完了した扱いになり、その後のアクセスでエラーが発生するという。
そこでWebKitは、ECMAScript仕様で定めるアルゴリズムに沿って、モジュールローダーをC++で実装し直した。新ローダーでは、初期化が終わるまで読み込みの完了を待つようになった。実装のプルリクエストは4月14日にマージされた。
この修正により、top-level awaitの対応が主要ブラウザーでそろう。MDNの互換性情報を見ると、対応済みのChrome、Edge、Firefoxに加え、Safariも27で対応となる。
Tamkun氏によると、複雑な依存関係を持つモジュール群を自動生成して新ローダーを検証し、Node.jsで実行した場合と出力が一致することを確認している。ECMAScriptの適合性テスト集test262ではモジュール関連の全テストを通過し、ブラウザー間の互換性を検証するWeb Platform Testsでも、それまで失敗していた多数のテストが通るようになったという。
