はじめに: JavaScriptのシングルスレッド神話
JavaScriptを学び始めたとき、「シングルスレッド」という言葉をよく耳にします。これは言語レベルでは正確ですが、実際のアプリケーションではWeb Workerなどを活用したマルチスレッド環境が利用可能です。より正確には、**「JavaScriptのrealmはシングルスレッド」**と言えます。realmとはコードが実行される環境を指し、ブラウザのタブ、Web Worker、iframeなどがそれぞれ独立したrealmとなります。
問題は、これらのrealmが異なるグローバルオブジェクトを持つため、あるrealmで定義した変数が他のrealmに影響を与えられないことです。この特性を利用すればコードを分離できますが、従来の方法では煩雑で制限がありました。

ShadowRealm API: ダークな反射、クリーンな分離
TC39で提案中のShadowRealm APIは、独自のグローバルオブジェクトとビルトインオブジェクトを持ちながら、独自の実行スレッドを持たない「シャドウ領域」を作成します。コードはホストrealmのスレッドで実行されますが、グローバル環境は完全に分離されます。基本的な使い方は非常にシンプルです。
// ShadowRealmの作成
const shadow = new ShadowRealm();
// 外部realmでグローバル関数を定義
function globalFunction() {};
console.log(globalThis.globalFunction);
// 結果: function globalFunction()
// ShadowRealm内でグローバル関数を確認
console.log(shadow.evaluate('globalThis.globalFunction'));
// 結果: undefined
上記のコードからわかるように、ShadowRealm内のグローバルオブジェクトは外部と完全に分離されています。逆に、ShadowRealm内で定義した関数も外部からアクセスできません。
// ShadowRealmの作成
const shadow = new ShadowRealm();
// ShadowRealm内でグローバル関数を宣言
shadow.evaluate('function globalFunction() {};');
// 外部からはアクセス不可
console.log(globalThis.globalFunction);
// 結果: undefined
// ShadowRealm内からはアクセス可能
console.log(shadow.evaluate('globalThis.globalFunction'));
// 結果: function globalFunction()
さらに、importValueメソッドを使用すると、モジュールを動的にインポートし、分離された環境で実行できます。
// spookycode.js
export function greeting() {
return "Hello from the ShadowRealm!";
}
// メインスクリプト
async function shadowGreeter() {
const shadow = new ShadowRealm();
// importValueはPromiseを返し、第二引数でエクスポートされた関数を指定
const shadowGreet = await shadow.importValue("./spookycode.js", "greeting");
// 呼び出し
shadowGreet();
}
shadowGreeter();
// 結果: Hello from the ShadowRealm!
![]()
注意点と限界
ShadowRealmは完全なセキュリティ境界を提供するわけではありません。コードが他のrealmの情報を推測できるため、**整合性境界(integrity boundary)**として理解する必要があります。また、現在はStage 2.7であり、まだブラウザでは使用できません。evalと同様にunsafe-evalのCSPルールが適用される可能性があります。
実務で適用する際には、以下の点を考慮する必要があります。
- テスト環境: 単体テストでモックデータと実際のデータの衝突を防げます。
- プラグインシステム: サードパーティコードを分離し、グローバル汚染を防げます。
- パフォーマンスオーバーヘッド: 分離された環境でコードを実行するため、追加コストが発生する可能性があります。

まとめ: 準備された者が未来を先取りする
ShadowRealm APIは、JavaScriptの長年の課題であるコード分離を実現する有望なソリューションです。まだ標準化が進行中ですが、この概念を先に理解しておくことで、ブラウザ実装が始まった際にすぐ活用できます。
特に日本の開発現場では、レガシーコードとサードパーティライブラリ間の衝突問題が頻繁に発生しており、ShadowRealmがこの問題を解決する大きな役割を果たすでしょう。ただし、セキュリティ境界と誤解せず、整合性境界としてアプローチすることが重要です。
次のステップとして、TC39のプロポーザル文書を直接確認し、Stage 3以降のブラウザ実装情報を注視することをお勧めします。また、マイクロソフト Maia 200、AI推論のために生まれた超高性能アクセラレータの詳細分析のような最新技術トレンドも併せて確認してみてください。
合わせて読みたい記事: