CommonJS vs ESM:Node.jsモジュールスコープの深淵と、メモリ空間を汚染しない変数の要塞設計
コードレビューをしていて、未だに「なぜかグローバル空間に変数が漏れ出している」「CommonJSとESMを混在させてハマった」というコードを見かける。
JavaScriptの変数の挙動を語るとき、多くのエンジニアはブラウザのグローバルオブジェクト(`window`)や関数スコープの話で止まってしまう。しかし、サーバーサイドや近代的なビルドパイプラインの基盤であるNode.jsランタイムにおいて、変数がどのようにカプセル化され、V8エンジンのメモリ空間に配置されるのか。その「境界線のメカニズム」を理解しているか否かで、プロダクション環境におけるメモリリークや、モジュール解決の致命的なバグを防げるかどうかが決まる。
今回は、CommonJS(`require`)とESM(`import`)におけるスコープの隔離メカニズムの本質を解き明かし、実務で絶対に破綻しない堅牢なモジュール設計の極意を伝授しよう。
—
1. モジュールスコープの根本思想:Node.jsはスクリプトを「関数」で包んでいる
ブラウザの `