関連記事
Safari Technology Preview 250がJavaScriptの「using」に対応、主要3エンジンで実装

(Ferenc Almasi/Unsplash)[写真拡大]
AppleのWebKitチームは2026年8月13日、Safari Technology Preview 250(STP 250)を公開した。本リリースでは、JavaScriptの「using」「await using」宣言を含む「Explicit Resource Management(明示的リソース管理)」に対応した。
V8とSpiderMonkeyに続いてWebKitにも実装されたことで、主要3大JavaScriptエンジンで同機能の実装が揃った。ただし、STP 250は安定版Safariとは別に提供される開発者向けプレビューである。安定版ブラウザを対象とする本番環境では、引き続き対応バージョンの確認やトランスパイルが必要になる。
STP 250にはこのほか、WebAssemblyの複数メモリとRelaxed SIMD、fetch()によるストリーミングアップロードの初期サポート、Clipboard APIでのSVGデータの読み書き、CSS関連機能などが追加された。
■明示的リソース管理とは何か、なぜクロスブラウザ対応が重要なのか
JavaScriptでは従来、ファイルハンドルやストリームのロックなど、明示的な解放を必要とするリソースのクリーンアップにtry/finallyブロックが使われてきた。リソースを取得してtry内で処理し、finally内に解放処理を記述する方法だ。
この方法でも確実なクリーンアップは可能だが、複数のリソースを扱うとコードが複雑になりやすい。解放処理中にも例外が発生した場合は、処理本体で生じた例外との扱いにも注意が必要になる。
明示的リソース管理は、リソースを現在のスコープに関連付けるusingおよびawait using宣言を導入する。実行がスコープを離れると、通常終了、return、例外発生のいずれの場合でも、エンジンがリソースの[Symbol.dispose]()メソッドを呼び出す。非同期ispose](が呼び出され、その完了が待機される。
同じスコープ内でusingにより登録された複数のリソースは、LIFO(後入れ先出し)順で破棄される。最後に登録されたリソースから解放されるため、依存関係のあるリソースも取得時と逆の順番で後片付けできる。
この仕組みには、複数の破棄可能なリソースやクリーンアップ処理をまとめて管理するDisposableStackとAsyncDisposableStackも含まれる。処理本体とリソースの破棄の両方でエラーが発生した場合は、SuppressedErrorによって双方のエラー情報を保持できる。
V8チームは、この機能をファイルハンドルやネットワーク接続などのライフサイクルを明示的かつ決定的に管理する仕組みと説明している。[Symbol.dispose]()を実装したオブジェクトであればusingで扱えるため、ストリームリーダー、ロック、接続ラッパー、
ChromeやNode.jsで使われるV8と、Firefoxで使われるSpiderMonkeyには、すでに明示的リソース管理が実装されていた。WebKitがSTP 250で対応したことにより、主要3大JavaScriptエンジンに実装が揃ったことになる。
TypeScriptでは、2023年8月に公開されたTypeScript 5.2からusing宣言と明示的リソース管理に対応している。これまでTypeScriptから互換性のあるJavaScriptへ変換して利用してきた開発者にとって、WebKitへの実装は将来のネイティブ実行環境への移行に向けた前進となる。
■イテレータコンビネータ:複数の反復処理をまとめるAPI
STP 250には、TC39のJoint Iteration提案によるIterator.zip()とIterator.zipメソッドを使うと、複数の反復可能オブジェクトを事前に配列へ変換せず、対応する位置の要素をまとめて走査できる。
Iterator.zip()は、各入力から取得した要素を配列にまとめて返す。Pythonのzip()に近い働きをする。一方、Iterator.zipKeyed()は、指定されたキーに各入力の要素を対応付けたオブジェクトを返す。
いずれも遅延評価であり、結合後のイテレータが進められた時点で、入力元から必要な要素を取得する。このため、すべての要素をあらかじめメモリへ展開せずに処理できる。
■WebAssembly Relaxed SIMDへの対応
STP 250では、WebAssemblyのRelaxed SIMDが既定で利用できるようになった。Safari Technology Previewの従来バージョンでは、この機能はフラグの下に置かれていた。
WebAssembly 2.0に含まれる128ビットSIMD命令は、異なる実装間で結果を揃えるため、各命令の動作を厳密に定めている。一方、CPUごとに利用できる命令や細部の挙動は異なるため、同一の結果を保証するために追加処理が必要になる場合がある。
WebAssembly 3.0に含まれるRelaxed SIMDは、一部の命令について、仕様で定められた複数の結果のうち、実装が適切なものを選べるようにする。これにより、特定のハードウェアで利用可能な命令へ効率よく対応付けられる可能性がある。
画像・音声処理や機械学習推論など、SIMDによる並列処理を多用する用途では、実装やハードウェアによって性能上の利点が得られる可能性がある。一方、異なる環境で完全に同じ結果を再現する必要がある処理では、Relaxed SIMDの命令特性を確認したうえで利用する必要がある。
Relaxed SIMDはChromeではバージョン114、Firefoxではバージョン145から利用可能とされている。STP 250でWebKitのフラグなし実装が加わったが、安定版Safariへの導入時期は発表されていない。
■複数メモリサポートとWeb Inspectorの強化
従来のWebAssemblyでは、単一のモジュールから直接扱えるリニアメモリは1つに限られていた。複数のメモリオブジェクトを使うには、それぞれを別のモジュールで宣言して扱う必要があった。
WebAssembly 3.0に含まれる複数メモリ機能では、1つのモジュールが複数のリニアメモリを定義またはインポートし、命令から対象のメモリを指定できる。メモリ間でデータを直接コピーすることも可能になる。
これにより、用途の異なるデータ領域の分離、バッファリング、計測用領域の追加、複数のWasmモジュールを1つにまとめる静的リンクなどを実装しやすくなる。V8とSpiderMonkeyに続いてWebKitが対応したことで、主要3エンジンに複数メモリの実装が揃った。
Web Inspectorも改良され、SourcesタブでWebAssemblyモジュールを表示、検査できるようになった。開発者はWebKitの標準開発者ツールからWasmコードを確認できる。
■fetch()でのストリーミングアップロードとduplexオプション
STP 250では、fetch()のリクエストボディとしてReadableStreamを渡すストリーミングアップロードが初期サポートされた。
従来のWebKitでは、文字列、ArrayBuffer、Blobなど、あらかじめ用意されたデータをリクエストボディとして送信する方法が中心だった。ReadableStreamを利用すると、アプリケーションが生成したデータをチャンク単位で順次送信できる。
これにより、大容量ファイルやリアルタイムに生成されるデータを扱う際、リクエストボディ全体をアプリケーション側で先に用意する必要性を減らせる。実際のメモリ使用量や送信動作は、アプリケーション、ブラウザ、ネットワーク構成、サーバー側の実装によって異なる。
ストリームをリクエストボディに指定する場合は、Requestコンストラクタまたはfetch()のオプションでduplex: "half"を指定する必要がある。WebKitは今回の対応を「初期サポート」としており、安定版Safariでの提供時期や完全な仕様対応の範囲は発表していない。
■CSS関連機能とSVGクリップボード対応
STP 250では、CSSのテキスト表示やレイアウトに関する機能が追加された。
text-decoration-insetは、テキスト装飾線の描画範囲を調整するためのプロパティである。white-space-trimは、空白の処理を制御する。wrap-insideは、要素内部での折り返しを制御するために使われる。
ruby-overhangではspaces値がサポートされ、ルビ文字が隣接する空白や約物へはみ出す動作を制御できるようになった。noneはspacesの別名として扱われる。また、::marker擬似要素でcontentプロパティがサポートされ、リストマーカーの内容を指定できるようになった。
非標準のCSSカラー値「text」は削除され、標準の「canvastext」を使用することが推奨されている。
Clipboard APIでは、image/svg+xml形式のデータをコピーして貼り付けられるようになった。WebKitは読み取り時と書き込み時の両方でSVGマークアップをサニタイズし、スクリプトなどの安全でない要素を除去する。
これにより、対応するデザインツールや作図アプリケーションは、navigator.clipboard.read()とnavigator.clipboard.write()を通じてSVGデータを受け渡せるようになる。
■その他の修正点と安定版Safariへの提供時期
STP 250では複数の不具合も修正された。改行で終わるtextareaを移動する際、VoiceOverが余分な改行を読み上げたり行を飛ばしたりする問題が解消された。
HLSライブストリームでは、再生位置がライブエッジに到達した際に不要なpauseイベントやendedイベントが発生する問題が修正された。一意インデックスの制約によってIndexedDBのput()が失敗した際、上書き対象だったレコードが削除される問題にも対処している。
このほか、Page Downキーやスペースキーによるページ単位のスクロールで途中のスクロールスナップ位置が飛ばされる問題や、フォーカスされたウィンドウ内のiframeからDigital Credentialsのget()を呼び出した際の問題が修正された。
これらの機能が安定版Safariへ導入される時期について、Appleは発表していない。STP 250は安定版Safariとは別にインストールする開発者向けプレビューであり、macOS Golden GateおよびmacOS Tahoe向けに提供されている。
すでにSafari Technology Previewをインストールしている場合は、「システム設定」の「一般」から「ソフトウェアアップデート」を開いて更新できる。新規に利用する場合は、Appleの開発者向けリソースからSafari Technology Previewを入手する。
■注目ポイントQ&A
●JavaScriptのusingキーワードは何をするための構文ですか?
usingは、[Symbol.dispose]()を実装したリソースを現在のスコープに関連付ける構文です。処理がスコープを離れる際に、通常終了、return、例外発生のいずれの場合でも、エンジンが自動的に破棄処理を呼び出します。
同じスコープに複数のリソースがある場合は、LIFO(後入れ先出し)順で破棄されます。非同期版のawait usingは[Symbol.asyncDispose]()を呼び出し、非同期のクリーンアップ処理が終わるまで待機します。
●using構文は現在、すべての主要ブラウザの本番環境で安全に使用できますか?
主要3大JavaScriptエンジンのV8、SpiderMonkey、WebKitには実装が揃いました。ただし、WebKitでの今回の対応はSafari Technology Preview 250に対するものであり、安定版Safariへの搭載を意味するものではありません。
安定版ブラウザを対象とする本番コードでは、対応バージョンと対象ユーザーの利用環境を確認し、必要に応じてTypeScriptなどによる変換を継続してください。
●WebAssembly Relaxed SIMDとは何ですか?なぜWasm処理の高速化につながる可能性があるのですか?
Relaxed SIMDは、一部のSIMD命令について、実装依存の動作を仕様で定められた範囲内で認める仕組みです。CPUごとの差を吸収するための追加処理を減らし、ハードウェアに適した命令へ対応付けやすくなるため、実装や処理内容によっては性能が向上する可能性があります。
一方、異なるCPUや実装間で完全に同じ演算結果を必要とする場合は、使用するRelaxed SIMD命令の特性を確認する必要があります。
●fetch()のストリーミングアップロード対応によって何が変わりますか?
ReadableStreamをリクエストボディとして指定し、生成されたデータをチャンク単位で順次送信できるようになります。大容量データやリアルタイムに生成されるデータを扱うアプリケーションでは、送信前にボディ全体を用意する必要性を減らせます。
ストリームボディを使用する際は、duplex: "half"の指定が必要です。STP 250での実装は初期サポートであり、安定版Safariでの提供時期は発表されていません。
元記事: JavaScript using Keyword Lands in Safari, Closing Last Cross-Browser Gap
※この記事はTech Timesから提供を受けた記事を日本向けに翻訳・編集したものです。
スポンサードリンク
関連キーワード
