なぜ今、globalThisなのか
フロントエンド開発の現場において、特定のランタイム(ブラウザのwindow、Node.jsのglobal、Web Workerのself)に依存したコードを書くことは、長年「技術的負債」の温床でした。これまで私たちは、環境を判定するための複雑なif文や、polyfillを駆使してグローバルオブジェクトへアクセスしてきましたが、ES2020で導入されたglobalThisは、その歴史に終止符を打つための標準仕様です。
環境判定コードの断捨離
かつて、ライブラリ開発者たちは以下のようなコードを頻繁に書いていました。
var getGlobal = function () {
if (typeof self !== ‘undefined’) { return self; }
if (typeof window !== ‘undefined’) { return window; }
if (typeof global !== ‘undefined’) { return global; }
throw new Error(‘unable to locate global object’);
};
これは見た目にも美しくありませんし、何よりメンテナンスコストがかかります。globalThisを採用すれば、これを一行で、しかも標準の挙動として記述できます。
const root = globalThis;
実務における注意点:ポリフィルの罠
globalThisは非常に強力ですが、古いブラウザ(IEなど)をサポート対象に含める場合、単に記述するだけでは動作しません。もし、あなたがレガシー環境を意識する必要があるなら、core-jsなどのライブラリを用いてポリフィルを注入する必要があります。
重要なのは、「グローバルオブジェクトに直接アクセスする処理を、可能な限り排除する」という設計思想です。globalThisはあくまで「どうしても必要な場合」の逃げ道として活用し、基本的には依存性の注入(DI)やモジュールスコープを活用して、状態をグローバルに持たせない設計を心がけるべきです。
次世代のフロントエンドに向けて
現在、フロントエンドはブラウザ単体から、Node.js環境でのSSR(サーバーサイドレンダリング)、Edge環境(Cloudflare Workers等)、そしてElectronのようなデスクトップアプリまで、非常に多様なランタイムで動いています。
globalThisを正しく使いこなすことは、単なる構文の習得ではありません。「特定のプラットフォームに縛られない、ポータブルなJSコードを書く」という、現代のフロントエンドエンジニアに求められるスキルの証明でもあります。ぜひ、既存のプロジェクトにある「環境判定ロジック」をglobalThisに置き換えるリファクタリングから始めてみてください。