<link rel="stylesheet" href="/assets/fonts/jetbrains-mono/jetbrains-mono.css" />
All posts

npm, yarn ou pnpm : Quand choisir quel gestionnaire de paquets

Le choix du gestionnaire de packages n'est pas un détail de style : il impacte directement les temps de build CI, l'espace disque sur chaque machine de développement et runner, la surface d'attaque des dépendances malveillant et la commodité de gérer un monorepo avec des dizaines de packages interdépendants. npm, Fil e pnpm résout le même problème avec des architectures node_modules radicalement différentes, et le mauvais choix pour votre contexte rapporte en minutes CI perdues à chaque build, pas dans un problème ponctuel.

Aperçu rapide

CritèrenpmFil (Berry/v4)pnpm
Vitesse d'installation (cache chaud)BonneExcellenteExcellent
Lockfilepackage-lock.jsonyarn.lockpnpm-lock.yaml
Support de l'espace de travailNatif, essentielNatif, matureNatif, le plus avancé pour monorepo
Dépendances dédoubléesPartielleBonExcellent (magasin centralisé)
Utilisation du disqueÉlevée (copies multiples)Moyenne/faible (PnP évite les node_modules)Très faible (lien physique du magasin global)
Mise en cache réseauBasiqueBonExcellent
Sécurité/auditaudit intégré npmaudit npm filaudit pnpm, une disposition stricte empêche la dépendance fantôme
Écosystème/compatibilitéMaximum (Node.js par défaut)Élevé, PnP peut casser les outils existantsUne mise en page élevée et stricte peut casser le code avec l'importation implicite

Vérifiez toujours les versions installées avant de vous décider : npm -v, yarn -v, pnpm -v, et pour npm en particulier npm voir les versions npm pour connaître le dernières versions disponibles.

Critères de sélection par contexte

Petit projet de développement unique

npm est le choix par défaut correct : aucune configuration supplémentaire (fournie avec Node.js), compatibilité maximale avec chaque outil et tutoriel, aucun avantage pratique d'une déduplication avancé sur un projet avec quelques dizaines de dépendances.

Équipe moyenne (3-10 Dev)

pnpm commence à rentabiliser l'investissement de configuration : installations plus rapides sur CI partagé, moins d'espace disque sur chaque ordinateur portable de l'équipe et la disposition stricte empêche les bugs sournois de fantômes dépendance (importation de packages non explicitement déclarés qui "fonctionnent par hasard" avec npm/Yarn classique).

Monorepo Enterprise (des dizaines de packages)

pnpm workspaces est le standard de facto pour les grands monorepos : déduplication agressif via un magasin centralisé, filtres puissants (pnpm --filter) à exécuter des commandes uniquement sur les packages réellement modifiés, et des temps d'installation qui restent également gérables avec des centaines de packages interdépendants.

Bibliothèque publiable sur npm Registry

Le gestionnaire de packages de développement est indépendant du gestionnaire de packages consommateur : n'importe lequel de trois ouvrages à publier, mais pnpm aide à découvrir en premier les peerDependencies manquantes de la publication grâce à sa mise en page stricte, qui ne « cache » pas les dépendances transitives telles que accédé par erreur.

CI/CD et mise en cache cloud

Pour les pipelines GitHub Actions/GitLab CI/Vercel, pnpm et Yarn Berry offrent une mise en cache plus efficace grâce à magasin/cache global réutilisable entre les exécutions, tandis que npm nécessite l'intégralité du cache node_modules (plus lourd à sauvegarder/restaurer à chaque build).

Détails techniques du gestionnaire de packages

npm

npm install                  # installa da package.json, aggiorna il lockfile se necessario
npm ci                       # installa esattamente da package-lock.json, mai lo modifica — usa questo in CI
npm audit                    # scansione vulnerabilità note
npm outdated                 # dipendenze con versioni più recenti disponibili

npm ci (et non npm install) doit toujours être utilisé dans CI : il échoue explicitement si package.json et package-lock.json sont mal alignés, au lieu de mettre à jour silencieusement le fichier de verrouillage pendant une construction.

Fil (Baie / v4)

yarn set version berry        # migra al Yarn moderno (Plug'n'Play di default)
yarn install                  # installa dipendenze
yarn workspaces foreach run build   # esegue uno script su ogni workspace del monorepo
yarn npm audit                # audit di sicurezza

Plug'n'Play (PnP) élimine node_modules au profit d'un seul fichier .pnp.cjs qui mappe les résolutions — installation presque instantanée, mais certains outils hérités qui supposer que l'existence physique de node_modules peut se briser et nécessiter un repli vers nodeLinker : nœuds-modules. Zero-install commit le cache compressé de dépendances dans le référentiel lui-même, éliminant complètement le temps d'installation dans CI au prix d'un dépôt plus lourd.

pnpm

pnpm install                  # installa usando lo store centralizzato con hard link
pnpm import                   # converte un package-lock.json/yarn.lock esistente in pnpm-lock.yaml
pnpm -w add typescript -D     # aggiunge una dipendenza alla root del workspace
pnpm store path                # mostra il percorso dello store centralizzato condiviso

le strict layout de pnpm (chaque paquet ne voit que ses propres dépendances déclarées, pas l'intégralité du graphe aplati) est la différence architecturale la plus importante : elle empêche les images fantômes dépendance, mais cela peut casser le code existant qui dépendait implicitement des dépendances transitives. déclaré — un problème qui n'est découvert qu'à la première pnpm install sur un projet migré, il convient donc de l'anticiper avec un audit de code avant la migration.

Repères pratiques

#!/bin/bash
# benchmark-install.sh — confronta tempi di install a cache fredda/calda
for pm in npm yarn pnpm; do
  rm -rf node_modules
  echo "=== $pm (cache fredda) ==="
  time $pm install --force 2>&1 | tail -1
  echo "=== $pm (cache calda) ==="
  rm -rf node_modules
  time $pm install 2>&1 | tail -1
done
# Misura uso disco: node_modules locale vs store centralizzato pnpm
du -sh node_modules
pnpm store path && du -sh "$(pnpm store path)"

Pour reproduire des benchmarks fiables dans CI, exécutez toujours au moins 3 exécutions consécutives en ignorant la première (effets de cache du système de fichiers/runner) et corrige la version du gestionnaire de packages dans le workflow - un comparer différentes versions de npm/Yarn/pnpm invalide toute conclusion sur les différences véritable architecture.

Étude de cas 1 : Petite application (1 à 3 développeurs)

Une application interne avec 3 développeurs et ~60 dépendances directes. Recommandé : npm, car aucune configuration supplémentaire ne vaut tout gain de performance marginal sur un projet cette échelle. Intégration d'un nouveau développeur : moins de 5 minutes (npm install et c'est parti), contre les frictions initiales potentielles dans l’explication du PnP ou du magasin centralisé pour un avantage presque rien à cette échelle.

# GitHub Actions — small app, npm con cache standard
- uses: actions/setup-node@v4
  with: { node-version: 22, cache: 'npm' }
- run: npm ci
- run: npm run build

Étude de cas 2 : Monorepo Enterprise (plus de 20 packages)

Un monorepo avec 24 packages (8 applications, 16 bibliothèques partagées) et une équipe répartie sur 3 fuseaux horaires fois. Recommandé : espaces de travail pnpm. Structure :

// package.json root
{ "workspaces": ["apps/*", "packages/*"], "packageManager": "pnpm@9.0.0" }
# GitHub Actions — caching dello store pnpm condiviso tra run
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
  with: { node-version: 22, cache: 'pnpm' }
- run: pnpm install --frozen-lockfile
- run: pnpm -w run build --filter=...[origin/main]

Effort de migration estimé des espaces de travail npm vers pnpm : environ 60 heures-personnes pour un monorepo de celui-ci taille (audit de dépendance fantôme inclus). Résultat attendu : temps d'installation de CI réduit de 40 à 60 %, l'espace disque sur les exécuteurs est réduit proportionnellement au nombre de paquets partageant le mêmes dépendances.

Étude de cas 3 : Bibliothèque publique sur le registre npm

Une bibliothèque open source avec peerDependencies sur Angular/React. Choix recommandé : pnpm en développement (pour découvrir les dépendances manquantes grâce à une mise en page stricte), publication toujours compatible avec n’importe quel gestionnaire de paquets côté consommateur.

{
  "peerDependencies": { "react": "^18.0.0 || ^19.0.0" },
  "peerDependenciesMeta": { "react": { "optional": false } }
}
# Publish workflow
npm publish --dry-run          # verifica cosa verrebbe pubblicato prima del publish reale
pnpm publish --access public   # publish reale (funziona identicamente per consumer npm/yarn/pnpm)

Migration et plan opérationnel 30/60/90 jours

Jours 1 à 30 : Évaluation et projet pilote

  • Liste de contrôle de pré-migration : sauvegarde du fichier de verrouillage existant, base de référence de couverture de test, instantané du pipeline CI actuel.
  • Migration pilote sur un seul package/dépôt non critique — KPI : construction verte et tests après la migration.
# Migrazione da npm/yarn a pnpm preservando le versioni risolte nel lockfile esistente
pnpm import
pnpm install

Jours 31 à 60 : Déploiement progressif

  • Migrez les packages restants un par un, jamais tous d'un coup — KPI : 0 régression fonctionnelle par package migré.
  • Mise à jour du pipeline CI avec la mise en cache native du nouveau gestionnaire de packages — KPI : temps de construction CI mesuré avant/après.

Jours 61-90 : Consolidation

  • Suppression des anciens fichiers de verrouillage et de l'ancien gestionnaire de paquets de la documentation — KPI : 0 référence résiduelle à l'outil précédent.
  • Audit final de sécurité et d'utilisation du disque — KPI : réduction mesurée sur les deux métriques.

Plan de restauration : conserver le fichier de verrouillage du gestionnaire de packages précédemment validé jusqu'à la fin migration confirmée; revenir en arrière signifie simplement restaurer ce fichier de verrouillage et le commande d'installation d'origine, sans aucune autre modification de code.

CI/CD et mise en cache

# GitLab CI — cache dello store pnpm tra pipeline
cache:
  key: pnpm-store
  paths:
    - .pnpm-store
variables:
  PNPM_STORE_PATH: .pnpm-store

Pour Yarn Berry, mettez en cache le dossier .yarn/cache (et non node_modules, qui avec PnP n'existe peut-être pas du tout) ; pour npm, cachea ~/.npm plus éventuellement node_modules si le projet est suffisamment petit pour effectuer une récupération plus rapide que une installation à partir de zéro.

Sécurité et politique

npm audit --audit-level=high
yarn npm audit
pnpm audit

La présentation stricte de pnpm offre un avantage de sécurité indirect mais réel : un paquet ne peut pas accéder accidentellement à une dépendance transitive compromise que vous n'avez pas explicitement déclarée, réduisant la surface d'attaque des chaînes d'approvisionnement par rapport aux node_modules plats traditionnel npm/Yarn classique. Dans tous les cas, intégrez l'audit du gestionnaire de packages dans CI en étape bloqueur, pas comme une vérification manuelle occasionnelle, et envisagez un outil SCA dédié (Snyk o équivalent) pour les projets avec des exigences de conformité plus strictes.

FAQ

Puis-je mélanger différents gestionnaires de packages dans le même projet ?

Techniquement possible mais fortement déconseillé : plusieurs fichiers de verrouillage et des comportements de résolution différents provoquent des incohérences difficiles à diagnostiquer.

pnpm interrompt toujours les projets existants ?

Non, mais l'agencement strict peut révéler des dépendances fantômes préexistantes : un audit de code avant migration réduit les risques de surprises.

Yarn PnP est-il compatible avec tous les outils ?

Non, certains outils qui supposent des node_modules physiques sur le disque nécessitent un repli vers nodeLinker : node-modules.

Avez-vous besoin de npm ci ou simplement d'installation de npm dans CI ?

npm ci est toujours préférable en CI : il est plus rapide et échoue explicitement si le fichier de verrouillage est mal aligné, plutôt que de le modifier silencieusement.

Comment gérer les conflits de fichiers de verrouillage lors d'une fusion ?

Régénérez le fichier de verrouillage à partir de la branche mise à jour au lieu de résoudre manuellement les conflits ligne par ligne, ce qui est presque toujours plus lent et plus risqué.

Pnpm est-il plus sécurisé que npm ?

Fournit un avantage indirect via la disposition stricte qui limite l'accès aux dépendances transitives non déclarées, mais l'audit des vulnérabilités connues reste nécessaire avec les trois.

Comment gérez-vous les dépendances de pairs manquantes ?

pnpm les signale explicitement lors de l'installation grâce à une disposition stricte ; avec npm/Yarn classique, ils doivent être vérifiés manuellement ou avec des outils dédiés.

Est-ce que

pnpm fonctionne bien sous Windows ?

Oui, mais les liens physiques nécessitent que le magasin et le projet soient sur le même volume/disque pour fonctionner de manière optimale.

Vaut-il la peine de changer de gestionnaire de paquets à mi-chemin d'un projet déjà démarré ?

Seulement si les bénéfices attendus (CI, disque, monorepo) dépassent clairement le coût de la migration et des tests ; pour un petit projet stable, ce n'est souvent pas pratique.

Comment choisir entre Yarn et pnpm pour un nouveau monorepo ?

Les deux sont valides ; pnpm possède généralement les filtres de déduplication les plus agressifs et les plus matures pour les grands monorepos, Yarn PnP élimine entièrement les node_modules si la compatibilité des outils le permet.

Erreurs courantes et solutions rapides

  • Utiliser npm install au lieu de npm ci dans CI : risque de modifier silencieusement le fichier de verrouillage pendant une construction - utilisez toujours npm ci.
  • Commettez node_modules dans le référentiel : gonflez inutilement le référentiel, utilisez .gitignore et comptez sur le fichier de verrouillage pour la reproductibilité.
  • Mélanger les fichiers de verrouillage de différents gestionnaires de paquets : Supprimez toujours les autres fichiers de verrouillage lorsque vous en adoptez un nouveau.
  • Ignorer les avertissements de dépendance fantôme après une migration vers pnpm : ce sont de véritables bugs latents, pas de faux positifs à faire taire.
  • Ne corrigez pas la version du gestionnaire de packages dans le projet : utilisez le champ packageManager dans package.json pour garantir la cohérence entre les développeurs et les CI.
  • Cache CI non invalidé après la modification du fichier de verrouillage : la clé de cache doit inclure le hachage du fichier de verrouillage et ne pas être statique.
  • Yarn PnP avec des outils existants incompatibles : Vérifiez la compatibilité avant d'adopter le PnP sur un projet avec des dépendances sur des outils existants.
  • Stocker pnpm sur un disque/volume différent du projet : rompt l'efficacité des liens physiques sous Windows, vérifie la configuration du chemin de stockage.
  • Audit de sécurité effectué manuellement uniquement : Intégrez-le comme une étape de blocage du CI, et non comme une vérification ponctuelle.
  • Migrer un monorepo entier en une seule fois : augmente considérablement le risque, migrez package par package avec vérification à chaque étape.

Liste de contrôle finale : Matrice de décision rapide

CritèreChoix recommandé
Petite équipe (1-3 développeurs)npm
Monorepo avec des dizaines de packagespnpm
Resserrement des contraintes d'espace disquepnpm (ou Yarn PnP)
CI rapide comme priorité absoluepnpm ou Yarn Berry avec magasin de mise en cache
Sécurité/prévention des dépendances fantômespnpm (mise en page stricte)
Bibliothèque publique avec une compatibilité maximale avec les consommateursCôté publication indifférent, pnpm en développement

Comment vérifier

  • Rejouez les tests d'installation avec le script fourni sur le matériel/IC représentatif de votre cas réel.
  • Vérifiez que le cache est réellement réutilisé dans CI (vérifiez les journaux de réussite/échec du cache de workflow).
  • Exécutez la suite E2E complète après chaque migration du gestionnaire de packages, pas seulement les tests unitaires.
  • Vérifiez l'intégrité du fichier de verrouillage : npm ci/pnpm install --frozen-lockfile devrait se terminer sans changement.
  • Effectuez un essai à sec de publication avant chaque publication réelle : npmpublish --dry-run.
  • Surveillez l'utilisation du disque au fil du temps sur les machines de CI et de développement, pas seulement au moment de la migration.

Conclusion

Il n'existe pas de gestionnaire de paquets universellement meilleur : npm reste le choix le moins contraignant pour petits projets, pnpm offre les avantages les plus concrets sur les monorepo et les CI à haute fréquence de build, Yarn Berry avec PnP est une option valable lorsque la compatibilité des outils le permet et que vous souhaitez l'éliminer node_modules entièrement. La bonne décision dépend de la taille de l'équipe, du structure du référentiel et contraintes réelles de CI et de disque - pas une préférence générique basée sur popularité.

Voulez-vous le script de référence complet pour votre projet ou une évaluation de migration le mieux adapté à votre équipe ? Demander un audit technique : en quelques heures d'analyse c'est possible Estimez les avantages et les risques réels d'une migration d'un gestionnaire de packages pour votre base de code.

💬 Notes des lecteurs

0 notes

Écrire une note

Partagez votre avis, une suggestion ou un compliment

Dernières notes

Aucune note pour le moment. Soyez le premier à commenter !