ESM (moduły ES)
Natywny system modułów JS ze składnią import / export. Zestandaryzowany w ES2015 (ES6). Przeglądarki wspierają go od 2018 r., Node.js stabilnie od 2020 r. W nowoczesnych projektach zastępuje CommonJS (require).
Natywnie w przeglądarce: <script type="module" src="app.js"> — przeglądarka sama obsługuje importy, bez bundlera. Node.js: "type": "module" w package.json albo rozszerzenie .mjs. Dobrze współgra z tree-shakingiem: analiza statyczna usuwa nieużywane importy. Obsługuje top-level await. Współpraca z CommonJS jest zdradliwa (zamieszanie z eksportem domyślnym). Ból migracji: istniejące bazy kodu CJS (Express, wiele middleware'ów) nie są w pełni zgodne z ESM. Bun i Deno są natywnie ESM. Trend 2024: nowe pakiety publikuje się zarówno jako ESM, jak i CJS, a „tylko ESM” bywa już dla autorów bibliotek akceptowalne.