Module Era
ESM + npm2015 – 2020Specified in 2015, shipped in runtimes years later. The language finally got a static module format — and the ecosystem got a decade-long CommonJS interop problem.
`import`/`export` are static: bindings are resolved before evaluation, which is what makes tree-shaking and cycle handling possible. Imports are live bindings, not copies.
// counter.js — a module that exports a *live* binding
export let hits = 0;
export function hit() {
hits++;
}
hit();
hit();
console.log("hits after two hit() calls:", hits);
// main.js would import the binding, not a snapshot:
// import { hits, hit } from "./counter.js";
// hit();
// console.log(hits); // 1 — the same binding, already updated