ESM-only (fin du double format)

JavaScript 🟡 Mid

Définition

Pratique de publier un paquet npm uniquement en modules ES, sans build CommonJS parallèle. Elle est devenue défendable depuis que require(esm) est activé par défaut dans Node 22.12.0 et 20.19.0 (stable en 25.4.0) : un consommateur CommonJS peut charger le paquet. L'article « Move on to ESM-only » (5 février 2025) chiffre l'adoption d'ESM sur npm à 25,8 % fin 2024 et liste les coûts du double format : deux jeux de fichiers et de .d.ts, singletons dupliqués, taille doublée.

Analogie

Arrêter d'imprimer un journal en deux formats quand tous les kiosques acceptent le nouveau.

Exemple de code

{
  "name": "ma-lib",
  "type": "module",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "default": "./dist/index.js"
    }
  },
  "engines": { "node": ">=20.19" }
}

Cas d'usage

Nouvelles bibliothèques, outils en ligne de commande, paquets destinés au navigateur (tree shaking) ou aux versions de Node qui supportent require(esm).

Anti-pattern

Garder un top-level await dans le point d'entrée d'une lib ESM-only : les consommateurs CommonJS ne pourront plus la require().
#best-practice#modules#node22

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre