今は「名前空間〈namespace〉」に変わり、これも推奨はされてないようだが、内部モジュールという仕掛けもある。グローバルモジュール(include方式)も内部モジュールも、ESM以前のナンチャッテモジュールのメカニズムを採用している。
手動で書いていた
var foo = foo || {}; var = function() { // ... }
を次の形で書く。
module foo { // ... }
実際のコンパイル結果は:
var foo; (function (foo) { }) ( foo || (foo = {}) );
var の繰り返し選言が可能であることを利用して、定義のマージができる。いわゆる「開いたモジュール」を実現する。どこからでもいつでもモジュールに追加ができる。
ESM方式とは別だが、ファイル内に階層的名前空間を書けること、別ファイルから同一内部モジュールを定義できることなどがメリット(同時にデメリット)だろう。