Learn

pnpm en pratique

Le gestionnaire qui économise des gigaoctets via un store global et des hardlinks.

pnpm (Performant npm) est un drop-in replacement de npm avec deux idées fortes : un store global sur disque qui n'a qu'une copie de chaque paquet, et une résolution stricte qui empêche les dépendances fantômes.

Pourquoi pnpm économise tant de place

Quand tu fais npm install react, npm copie les fichiers dans ton-projet/node_modules/react/. Si tu as dix projets qui utilisent React, tu as dix copies identiques sur le disque.

pnpm fait différemment :

  1. Il télécharge React une seule fois dans un store global (~/.local/share/pnpm/store sur Linux/macOS, %LOCALAPPDATA%\pnpm\store sur Windows).
  2. Dans chaque projet, node_modules/react/ est un hardlink vers les fichiers du store. Un seul fichier physique, dix projets qui y accèdent.

Concrètement : sur une machine avec dix projets React, npm occupe ~400 Mo par projet. pnpm occupe ~40 Mo (le store partagé) quel que soit le nombre de projets.

Installer pnpm

Via npm (une seule fois) :

shell
npm install -g pnpm

Via corepack (inclus dans Node depuis v16) :

shell
corepack enable
shell
corepack prepare pnpm@latest --activate

Vérifie :

shell
pnpm --version

Les commandes courantes

Installer toutes les dépendances d'un projet existant :

shell
pnpm install

Ajouter un paquet :

shell
pnpm add react

Ajouter une devDependency :

shell
pnpm add -D typescript

Lancer un script défini dans package.json :

shell
pnpm run dev

Raccourci (sans run) pour les scripts courants :

shell
pnpm dev
shell
pnpm build
shell
pnpm test

Lancer une commande ponctuelle sans installer globalement :

shell
pnpm dlx create-next-app my-app

Mettre à jour toutes les dépendances :

shell
pnpm update

Supprimer un paquet :

shell
pnpm remove lodash

Résolution stricte : plus de dépendances fantômes

pnpm crée une structure node_modules/ non aplatie. Chaque paquet ne voit que ses propres dépendances déclarées. Ton code ne peut pas accéder à lodash si tu n'as pas explicitement ajouté lodash à ton package.json.

Ça peut sembler restrictif, mais c'est une sécurité : ton build est reproductible et ne dépend pas des dépendances transitives de tes dépendances.

pnpm et les monorepos

pnpm a le meilleur support de monorepos parmi les trois gestionnaires. Un fichier pnpm-workspace.yaml à la racine suffit pour déclarer plusieurs paquets :

yaml
packages:
  - "packages/*"
  - "apps/*"

Les paquets du workspace peuvent se référencer avec workspace:* comme version :

json
{
  "dependencies": {
    "@mon-projet/shared": "workspace:*"
  }
}
Documentation officielle pnpm pnpm Workspaces

Coche les étapes pour débloquer la suite

Retour au cours