Are We ESM Yet?
NO
37% of packages are ESM-ready though
Updated: 2026-04-13
Next refresh: Mondays at 06:00 UTC
Trend
Area chart of ESM-ready package percentage over time. Latest point: 2026-04-13, 37% ESM-ready, which is 1,832 of 4,996 total packages.
- 2021-08-24: 8% ESM-ready (436 of 5,617 packages)
- 2021-11-09: 9% ESM-ready (530 of 5,647 packages)
- 2022-08-01: 12% ESM-ready (703 of 5,734 packages)
- 2022-11-04: 13% ESM-ready (734 of 5,747 packages)
- 2023-05-29: 17% ESM-ready (1,047 of 6,240 packages)
- 2023-11-22: 18% ESM-ready (1,244 of 6,818 packages)
- 2024-05-27: 22% ESM-ready (1,555 of 7,042 packages)
- 2024-11-27: 26% ESM-ready (2,094 of 8,087 packages)
- 2025-06-05: 30% ESM-ready (2,568 of 8,677 packages)
- 2025-12-04: 33% ESM-ready (4,726 of 14,159 packages)
- 2026-02-23: 33% ESM-ready (4,876 of 14,888 packages)
- 2026-02-24: 36% ESM-ready (1,804 of 4,996 packages)
- 2026-02-25: 36% ESM-ready (1,805 of 4,996 packages)
- 2026-02-26: 36% ESM-ready (1,806 of 4,996 packages)
- 2026-02-27: 36% ESM-ready (1,806 of 4,996 packages)
- 2026-03-02: 36% ESM-ready (1,808 of 4,996 packages)
- 2026-03-09: 36% ESM-ready (1,809 of 4,996 packages)
- 2026-03-16: 36% ESM-ready (1,822 of 4,996 packages)
- 2026-03-23: 37% ESM-ready (1,824 of 4,996 packages)
- 2026-03-30: 37% ESM-ready (1,826 of 4,996 packages)
- 2026-04-06: 37% ESM-ready (1,829 of 4,996 packages)
- 2026-04-13: 37% ESM-ready (1,832 of 4,996 packages)
ESM-ready = ESM-only + dual packages
Breakdown
ESM-only 17% dual 19% faux 8% CJS 55%
Glossary
ESM-only-
Packages that only provide ESM (no CJS).
type: 'module'or.mjsentry. Nativeimport/export. dual-
Both ESM and CJS via
exports. Works in either environment. faux-
Legacy "module" field. Not true Node ESM; no
type: 'module'or properexports. CJS-
CommonJS. Uses
require()/module.exports.
How data is collected
Data comes from a curated list of 5,000 high-impact npm packages from npm-high-impact. Each package's latest version is fetched from the npm registry and classified by inspecting its package.json
Classification looks at type, exports, module, main, and file extensions (.mjs / .cjs). Known spam and placeholder packages are excluded.
The crawl runs weekly on Mondays at 06:00 UTC via GitHub Actions. Historical data is bootstrapped from npm-esm-vs-cjs.
Data sources & credits
- npm-high-impact — curated package list
- npm-esm-vs-cjs — historical classification data
- npm registry — package metadata