pnpm vs npm : stockage, lockfiles, workspaces, correspondance des commandes | We.Inc
Comment pnpm et npm stockent les paquets, verrouillent les versions et gèrent les monorepos, un traducteur de commandes npm vers pnpm avec recherche, et les étapes exactes pour migrer un projet en toute sécurité.
npm copie chaque paquet dans le node_modules de chaque projet et les remonte à plat. pnpm garde un seul store adressable par contenu sur le disque, crée des liens physiques vers ses fichiers et ne place que vos dépendances directes à la racine de node_modules. Cela économise de l'espace disque et empêche le code d'importer des paquets qu'il n'a jamais déclarés. La plupart des commandes se correspondent une à une.
Différences clés
Sujet
Emplacement des fichiers de paquets
Une copie dans chaque projet
Un store partagé, lié physiquement dans les projets
Structure de node_modules
À plat, tout est remonté
Dépendances directes uniquement, le reste sous node_modules/.pnpm
Lockfile
Workspaces déclarés dans
Installation stricte en CI
npm ci
pnpm install (lockfile figé par défaut en CI)
Exécuter un paquet sans l'installer
pnpm dlx (aussi pnx, pnpx)
Les deux outils lisent le même package.json et installent depuis le même registre, donc le choix porte sur la structure, la vitesse des réinstallations, l'outillage monorepo et la rigueur. Voici comment chacun stocke les paquets, un traducteur pour les commandes que vous connaissez déjà et les étapes pour passer un projet existant de npm à pnpm.
Saisissez une commande npm dans le traducteur, ou cliquez sur l'un des exemples, pour voir l'équivalent pnpm.
Lisez la section sur le stockage pour comprendre pourquoi les installations pnpm utilisent moins de disque et repèrent les imports non déclarés.
Suivez les étapes de migration si vous décidez de changer, et commitez le nouveau lockfile.
Choisissez un seul gestionnaire de paquets par dépôt et supprimez l'autre lockfile, pour que personne n'installe à partir d'un fichier périmé.
En CI, pnpm install refuse de modifier un lockfile obsolète, donc commitez pnpm-lock.yaml à chaque modification de package.json.
Si un paquet casse sous pnpm parce qu'il importe quelque chose qu'il n'a jamais déclaré, signalez-le en amont : cet import ne fonctionnait que par hasard sous npm.
pnpm lance les scripts sans le mot run, donc pnpm dev fonctionne, tant que le nom du script n'entre pas en conflit avec une commande intégrée de pnpm.
Questions fréquentes
pnpm est-il plus rapide que npm ?
pnpm réutilise souvent des fichiers déjà présents dans son store, ce qui accélère les réinstallations sur la même machine. La vitesse dépend de l'état du cache, du réseau et de la taille du projet, alors chronométrez les deux sur votre propre projet plutôt que de vous fier à un benchmark publié.
Puis-je utiliser pnpm avec un projet qui a un package-lock.json ?
Oui. Lancez pnpm import pour créer un pnpm-lock.yaml à partir de package-lock.json, npm-shrinkwrap.json ou yarn.lock, puis supprimez l'ancien lockfile et node_modules et lancez pnpm install.
Pourquoi mon application ne trouve-t-elle plus un module après le passage à pnpm ?
Votre code, ou une dépendance, importe un paquet qui ne figure pas dans son propre package.json. La structure à plat de npm masquait cette erreur. Ajoutez le paquet manquant comme dépendance de ce qui l'importe.
pnpm a-t-il besoin de Node.js ?
La documentation d'installation de pnpm décrit pnpm 12 comme un exécutable natif qui n'a pas besoin de Node.js pour fonctionner. Les scripts de votre projet ont bien sûr toujours besoin de Node.js.
Lequel choisir quand on débute ?
npm, car il est fourni avec Node.js et presque tous les tutoriels l'utilisent. Passez à pnpm quand vous gérez un monorepo, de nombreux projets sur une même machine, ou si vous voulez la structure node_modules plus stricte.
Comment chaque outil stocke les paquets
npm écrit une copie complète de chaque dépendance dans le node_modules du projet et remonte les dépendances imbriquées au premier niveau quand il le peut. Dix projets qui utilisent la même bibliothèque en contiennent dix copies.
pnpm télécharge chaque fichier une seule fois dans un store global adressable par contenu. Les projets reçoivent des liens physiques vers ces fichiers, donc un second projet avec les mêmes versions ne prend presque pas d'espace supplémentaire, et une nouvelle version n'ajoute que les fichiers modifiés.
Dans le projet, pnpm place des liens symboliques vers vos dépendances directes dans node_modules et range tout le reste sous node_modules/.pnpm. Un paquet ne peut atteindre que ce qu'il a déclaré.
Workspaces et monorepos
Les workspaces npm sont listés dans le package.json racine et s'exécutent avec -w name ou --workspaces. pnpm les liste dans pnpm-workspace.yaml et les sélectionne avec --filter, qui comprend aussi les graphes de dépendances, par exemple un paquet plus tout ce dont il dépend.
Le protocole workspace: de pnpm fixe une dépendance sur le paquet local et refuse de se rabattre sur le registre. Il est converti en plage de versions normale lors de la publication.
Passer un projet de npm à pnpm
Étapes de migration
pnpm import lit le lockfile npm pour que vous gardiez les versions déjà testées. Lancez vos tests avant de commiter.
Chaque dossier correspondant ici devient un paquet du workspace. Placez le fichier à la racine du dépôt.
Dépendre d'un paquet local
workspace:* pointe toujours vers la copie locale de ui au lieu d'une version du registre.
Traducteur de commandes npm vers pnpm
Saisissez une commande npm
npm install -D vite
Équivalent pnpm
Pas de correspondance directe. La plupart des autres commandes npm gardent le même nom sous pnpm.