Guide complet pour Next.js — avec npm et pnpm — basé sur la documentation officielle
Ce qu'on installe et pourquoi
Trois outils qui travaillent ensemble pour garder un code propre et des commits lisibles.
pre-commit, commit-msg) et exécute des scripts automatiquement. C'est le chef d'orchestre.type(scope): description. Si le format est mauvais → commit bloqué.# ❌ Mauvais commit → bloqué $ git commit -m "fix truc" ⧗ input: fix truc ✖ subject may not be empty [subject-empty] ✖ type may not be empty [type-empty] husky - commit-msg script failed (code 1) # ✅ Bon commit → accepté $ git commit -m "fix(auth): corriger la validation du formulaire" ✔ Commit accepté
📦 Installation (npm / pnpm)
La commande recommandée par la documentation Husky est husky init.
npm install --save-dev \ husky \ lint-staged \ @commitlint/cli \ @commitlint/config-conventional
pnpm add --save-dev \ husky \ lint-staged \ @commitlint/cli \ @commitlint/config-conventional
npx husky init
pnpm exec husky init
✅ Cela crée le dossier .husky/, ajoute le script "prepare": "husky" dans package.json, et génère un hook pre-commit exemple.
{
"scripts": {
"dev": "next dev",
"prepare": "husky" // ← généré automatiquement
},
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,css,md}": [
"prettier --write"
]
}
}
npm install / pnpm install. Tous les développeurs qui clonent le projet auront Husky actif immédiatement, sans configuration supplémentaire.⚙️ Configurer les hooks Git
Deux fichiers à créer dans le dossier .husky/ contrôlent les moments clés.
.husky/ à la racine de votre projet.
# .husky/pre-commit npx lint-staged
# .husky/pre-commit pnpm exec lint-staged
# .husky/commit-msg npx --no -- commitlint --edit $1
# .husky/commit-msg pnpm exec commitlint --edit $1
.husky/ ├── _/ │ └── husky.sh ← généré automatiquement, ne pas modifier ├── pre-commit ← À créer — lance lint-staged └── commit-msg ← À créer — valide le message avec commitlint
# .husky/pre-push npm run test
# .husky/pre-push pnpm test
pre-commit → vérifie le code (lint-staged).commit-msg → vérifie le format du message (commitlint). Les deux sont complémentaires.📏 Configurer commitlint
À la racine du projet, créez commitlint.config.ts (ou .js).
import type { UserConfig } from "@commitlint/types"; const config: UserConfig = { extends: ["@commitlint/config-conventional"], rules: { "header-max-length": [2, "always", 100], "type-enum": [ 2, "always", [ "feat", "fix", "docs", "style", "refactor", "test", "chore", "perf", "ci", "revert" ], ], }, }; export default config;
module.exports = { extends: ["@commitlint/config-conventional"], rules: { "header-max-length": [2, "always", 100], "type-enum": [ 2, "always", ["feat", "fix", "docs", "style", "refactor", "test", "chore", "perf", "ci", "revert"] ], }, };
✍️ Convention de commit (Conventional Commits)
Format que commitlint attend : type(scope): description
type(scope): description courte # type → obligatoire (feat, fix, docs, style, refactor, test, chore, perf, ci, revert) # scope → optionnel (ex: auth, api, ui, db) # description → obligatoire, minuscules, pas de point final
feat(auth): ajouter connexion Googlefix(cart): corriger calcul totalrefactor(api): simplifier fetchUserchore: mettre à jour dépendancesdocs: ajouter guide installationstyle: formater les fichiers authtest(user): ajouter tests unitairesperf(images): lazy-loader les images✓ feat(auth): ajouter la page de connexion ✓ fix: corriger le crash au démarrage ✓ chore(deps): mettre à jour next vers 15.2 ✓ refactor(ui): extraire le composant Button ✗ fix truc ← pas de ":" , type invalide ✗ Fix(auth): Corriger bug ← majuscule interdite ✗ feat(auth): nouveau login. ← point final interdit ✗ wip: en cours ← type "wip" non autorisé
🧪 Tester que tout fonctionne
Vérifiez chaque outil indépendamment.
echo "fix truc" | npx commitlint ✖ type may not be empty echo "fix(auth): corriger" | npx commitlint ✅ Passé
echo "fix truc" | pnpm exec commitlint ✖ type may not be empty echo "fix(auth): corriger" | pnpm exec commitlint ✅ Passé
npx lint-staged
pnpm exec lint-staged
$ git add . $ git commit -m "fix truc" ⧗ input: fix truc ✖ type may not be empty [type-empty] husky - commit-msg script failed (code 1) # Bloqué → c'est ce qu'on veut !
$ git commit -m "feat(auth): ajouter la page de connexion" ✔ Preparing lint-staged... ✔ Running tasks for staged files... ✔ Applying modifications from tasks... [main abc1234] feat(auth): ajouter la page de connexion
mon-projet-next/ ├── .husky/ │ ├── _/husky.sh │ ├── pre-commit ← À créer dans .husky/ │ └── commit-msg ← À créer dans .husky/ ├── commitlint.config.ts ├── package.json ← contient "prepare": "husky" + lint-staged └── next.config.js
npm install (ou pnpm install), le script prepare exécute automatiquement husky. Les hooks sont actifs immédiatement, sans aucune configuration manuelle.HUSKY=0 git commit -m "commit forcé" — utile pour les situations d'urgence.
📖 Basé sur la documentation officielle de Husky — Méthode husky init recommandée