pnpm 12 passe en Rust : plus rapide, même API
Pourquoi ça compte pour toi
Si tu gères un monorepo JavaScript/TypeScript, pnpm 12 t'apporte des gains tangibles : résolutions de dépendances 2-3× plus rapides sur les gros projets, node/deno/bun qui épousent la version du projet au lieu de rester figés en global. Et c'est un vrai rewrite technique (Rust), pas juste du refactor cosmétique.
Ce qu'il faut retenir
- 1.Installation depuis le tag next-12 (le tag latest pointe encore pnpm 11) : pnpm self-update next-12
- 2.Aucune rupture d'API : les commandes, flags, lockfiles et configuration restent identiques
- 3.Cycles de dépendances résolus canoniquement → lockfiles byte-identical (le même projet produit toujours la même signature)
- 4.Binaires globaux conscients du projet : node/deno/bun s'adaptent à la version épinglée du projet, avec validation de confiance
- 5.Prise en charge native de plusieurs gestionnaires (npm, Yarn, Bun, Deno) : pnpm peut récupérer l'outil manquant pour une dépendance git
Tu galères avec le jargon ?
Lis la version réécrite en mode débutant — toutes les idées, sans le jargon.
Pourquoi c'est vraiment un rewrite, pas une rustification cosmétique
pnpm a été entièrement réécrit en Rust. Le gain de performance n'est pas du marketing : sur les espaces de travail chargés de cycles de dépendances (courant en monorepos), la résolution est 2–3× plus rapide et consomme 25% moins de mémoire. Les lockfiles deviennent aussi 25% plus petits.
Ce qui change vraiment : pnpm 12 résout les cycles de dépendances de façon canonique. Avant, l'ordre dans lequel on revenait à une dépendance cyclique changeait la signature du lockfile. Maintenant, c'est une fonction pure : mêmes dépendances, même ordre, byte-identical. Ça semble anecdotique, mais ça rend les builds déterministes et empêche les faux conflits en CI.
Les trois changements qui vont te toucher
1. Les binaires globaux comprennent le projet
Tu as Node.js 20 d'installé en global, mais ton projet épingle Node.js 22 ? Avant pnpm 12, tu devais jongler avec des hooks shell peu élégants ou nvm.
Maintenant, node obéit au .pnpmrc du projet. Idem pour deno et bun. Et c'est signé : une version stable de Node.js est vérifiée contre les signatures de l'équipe de publication ; tout le reste (prépublications, packages personnalisés) demande une validation de confiance une fois, puis la mémorise par machine et par projet.
Tu peux contourner ça avec PNPM_SHIM_BYPASS=1 si tu dois.
2. pnpm récupère les gestionnaires manquants
Tu clones un dépôt Yarn, mais tu as juste pnpm ? pnpm 12 télécharge Yarn depuis le registre authentifié, le lance, puis l'oublie. Zéro pollution globale.
Ça marche aussi avec pnx (en usage ponctuel) : pnx yarn@4 install, pnx npm@11 ci, etc. Et les shims : pnpm shim add yarn lie une yarn qui obéit à la version du projet.
3. Registry revisions : correctif sans rebump de version
Un package a une faille ? Au lieu de publier 1.2.3-patch ou attendre une mineure, le registre peut servir un artefact remplacé pour la même version, identifié par son SHA-512. pnpm l'enregistre dans le lockfile :
packages:
lodash@4.17.21:
resolution: integrity: sha512-...
revision: 1
Les dépendances et surcharges peuvent épingler une révision explicitement : lodash@4.17.21+r1. Et pnpm update --patches rafraîchit les artefacts sans toucher les numéros de version.
Les points moins visibles mais utiles
- ▸
Dépendances git plus cohérentes :
github:owner/repo,owner/repo,git+https://…,git+ssh://…passent tous par HTTPS canonique sauf si tu configures git pour le SSH. Le lockfile n'enregistre jamais une URL SSH pour GitHub/GitLab/Bitbucket. Les hôtes inconnus conservent leur URL intacte. - ▸
Fautes de frappe détectées dans pnpm-workspace.yaml : Tu oublies une lettre dans
minimumReleaseAge? pnpm le signale maintenant, avec une suggestion. Sur une version épinglée, ça échoue (ERR_PNPM_UNRECOGNIZED_WORKSPACE_SETTINGS) ; ailleurs, c'est un avertissement. - ▸
Liens durs avant clone sur Linux : Sur btrfs, un lien dur est plus rapide qu'un reflink (clone). pnpm 12 le passe en priorité sur Linux. ext4 était déjà lien-dur en premier. macOS garde le clone en premier (APFS clonefile).
- ▸
engineStrict regarde la bordure, pas le sous-arbre : Une incompatibilité de moteur remonte maintenant même si elle vient d'une
optionalDependencies. pnpm 11 n'enregistrait qu'une alerte ; pnpm 12 échoue.
Comment l'installer
Le tag latest pointe toujours pnpm 11 (compatibilité). Pour la version 12 :
pnpm self-update next-12
Ou pnpm init dans un nouveau projet : ça épingle maintenant la version de pnpm la plus récente (pas juste celle qui a lancé init), donc zéro dérive en héritage.
Homebrew, winget, Scoop, Chocolatey ne proposent pas encore pnpm 12. Les autres chemins d'installation (npm, binaire autonome) fonctionnent.
Et concrètement pour toi ?
Choisis ton profil — la lecture de l'article change selon qui tu es.
Pour toi, pnpm 12 en Rust illustre comment les écosystèmes matures se renforcent : au lieu de réinventer npm, on l'optimise en réécrivant les couches critiques. C'est pareil pour la plupart des infras qui deviennent stables—cherche cette évolution (JavaScript→Rust, Python→Rust) dans ton suivi techno.
Essayer maintenant
Installer pnpm 12 →Source
Pour aller plus loin
Cet article t'a donné envie d'approfondir ? Deux formations Noésis t'attendent :
Explorer les thèmes de cet article :