Déploiement
Déploiement • Chapitre 2 : Préparation d'un projet avant le déploiement

Gestion des dépendances

La gestion des dépendances est le talon d'Achille de nombreux déploiements. Une mise à jour imprévue d'un sous-paquet transitif peut faire planter votre serveur de production alors que tout fonctionnait hier. Découvrez les règles impératives de reproductibilité avec npm ci, le verrouillage de version et l'isolation des dépendances de build.

🔒
L'Absolu npm ci

Ne lancez jamaisnpm install sur un serveur de production ou en CI/CD : utilisez exclusivement npm ci.

📜
Package-lock.json

Le fichier de verrouillage contenant l'arbre exact, les sommes de contrôle SHA-512 et les versions figées de chaque sous-module.

⚖️
Isolation devDependencies

Pour une API en production, purgez les outils de développement (Jest, ESLint, TypeScript) via --omit=dev.

🛡️
Audit & Failles CVE

Anticipez les alertes de sécurité dans la chaîne d'approvisionnement (Supply Chain Attacks) avec npm audit.

Comparateur Technique : npm install vs npm ci

Reproductibilité de Production

Cliquez sur chaque commande pour simuler son comportement sur un serveur de déploiement :

Pourquoi "npm ci" est le standard universel de CI/CD :
  • Intégrité garantie : Il supprime le dossier node_modules/ existant et reconstruit l'arborescence exacte dictée par le lockfile.
  • Immutabilité stricte : Il ne touche jamais au package-lock.json. Si le lockfile et le package.json sont désynchronisés, il plante immédiatement (Fail-Fast).
  • 2x à 3x plus rapide : Il ne recalcule rien et extrait directement les paquets depuis le cache npm.
$ npm ci --omit=dev
added 142 packages in 3.42s (zero modification to lockfile, 100% reproducible)

Optimisation du Poids en Production (Multi-Stage Build)

Dans une application backend déployée avec Docker, inclure les devDependencies (comme TypeScript et Jest) fait exploser l'image Docker de 150 Mo à plus de 1 Go. Voici le pattern moderne du Multi-stage Build :

Dockerfile de Production Optimisé
# Étape 1 : Construction et compilation (Builder)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Installation de TOUTES les dépendances (y compris devDependencies pour compiler le TypeScript)
RUN npm ci
COPY . .
RUN npm run build

# Étape 2 : Image finale de production ultra-légère (Runtime)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
# Installation STRICTEMENT des dépendances de production
RUN npm ci --omit=dev
# Copie uniquement des fichiers compilés du stage précédent
COPY --from=builder /app/dist ./dist

USER node
EXPOSE 3000
CMD ["node", "dist/main.js"]
Le Piège de "npm audit fix --force"

Quand npm affiche des vulnérabilités, beaucoup de développeurs exécutent aveuglément npm audit fix --force.

Danger : Le flag --force installe des versions majeures (Breaking Changes) de vos bibliothèques. Cela brise fréquemment des fonctionnalités entières en production sans que vous ne vous en rendiez compte !
La Bonne Pratique de Sécurité

Comment traiter les alertes de sécurité en production :

  • 1. Lancer npm audit seul pour identifier les paquets affectés.
  • 2. Utiliser npm audit fix (sans --force) pour les patchs non destructifs.
  • 3. Si la faille est dans une devDependency, l'impact en production est généralement nul car ces paquets ne tournent pas sur le serveur.