こんにちは!フロントエンドからNode.jsの深層までコードを書き続けている、ちょっとお節介な先輩エンジニアです。
皆さんは普段、HTMLファイルに`
この「どこからでもアクセスできる」という特性は、一見すると便利に思えますよね。しかし、これが大規模なアプリケーションになると大惨事を引き起こします。Aというライブラリが使っている変数名と、Bという自作スクリプトの変数名がたまたま同じだった場合、知らぬ間に値が上書きされてしまう(名前空間の汚染)という悪夢のようなバグを生むのです。
「これじゃいかん!」ということで、モダンなJavaScriptには、変数を安全なカプセル(小部屋)に閉じ込める仕組みが導入されました。それが ES Modules (ESM) です。
---
2. `type="module"` がもたらす革命:モジュールスコープの隔離
HTMLでES Modulesを使うには、`
`type="module"` が指定されたスクリプトファイルは、自動的にモジュールスコープという独立した隔離空間に配置されます。
イメージ図:グローバル空間 vs モジュール空間
【従来のグローバル空間(共有の広場)】
[ script A ] ==> [ グローバルオブジェクト (window) ] <== [ script B ]
(変数が混ざり合い、衝突リスク大!)
【モジュールスコープ(厳重に管理された個室)】
[ モジュール A の個室 ] --(完全隔離)-- [ モジュール B の個室 ]
│ │
(本当に必要なものだけ `export` で外部へ公開)
実際にコードでその違いを見てみましょう。
// counter.js (type="module"として読み込まれるファイル)
const count = 42; // モジュールスコープ(このファイルの外からは絶対に見えない!)
console.log(count); // 42 は普通に出力される
この `counter.js` を読み込んだ後、別の`