# Pre-commit Configuration Template husky + lint-staged 配置模板,三种变体:Node.js 项目、Go 项目、Monorepo。 --- ## 变体 1: Node.js 项目(React / Vue / 纯 TS) ### 安装 ```bash npm install -D husky lint-staged prettier eslint npx husky init echo "npx lint-staged" > .husky/pre-commit ``` ### package.json ```json { "lint-staged": { "*.{ts,tsx}": [ "eslint --fix --max-warnings 0", "prettier --write" ], "*.{css,less,scss}": [ "prettier --write" ], "*.{json,md}": [ "prettier --write" ] } } ``` --- ## 变体 2: Go 项目 ### 安装 ```bash # Go 项目需要 package.json 来驱动 husky npm init -y npm install -D husky lint-staged npx husky init echo "npx lint-staged" > .husky/pre-commit ``` ### package.json ```json { "lint-staged": { "*.go": [ "gofmt -s -w", "bash -c 'go vet ./...'" ] } } ``` ### 可选:golangci-lint(更严格) ```json { "lint-staged": { "*.go": [ "gofmt -s -w", "bash -c 'go vet ./...'", "bash -c 'golangci-lint run --fix'" ] } } ``` --- ## 变体 3: Monorepo(Go + Node.js) ### 安装(根目录) ```bash npm install -D husky lint-staged npx husky init echo "npx lint-staged" > .husky/pre-commit ``` ### package.json(根目录) ```json { "lint-staged": { "frontend/**/*.{ts,tsx}": [ "bash -c 'cd frontend && npx eslint --fix --max-warnings 0'", "bash -c 'cd frontend && npx prettier --write'" ], "frontend/**/*.{css,less,json}": [ "bash -c 'cd frontend && npx prettier --write'" ], "backend/**/*.go": [ "gofmt -s -w", "bash -c 'cd backend && go vet ./...'" ] } } ``` ### 注意事项 - `bash -c 'cd xxx && ...'` 确保命令在正确的子目录中执行 - lint-staged 传递的文件路径是相对于根目录的,部分工具(如 `go vet`)需要在子目录执行 - 如果前端和后端各自有 `package.json`,lint-staged 仍然在根目录配置 --- ## 验证配置 ```bash # 修改一个文件后测试 pre-commit hook echo "// test" >> some-file.ts git add some-file.ts git commit -m "test: verify pre-commit hook" # 应该看到 lint-staged 执行 ESLint + Prettier # 如果有 lint 错误,commit 会被阻止 ``` ## 常见问题 | 问题 | 原因 | 解决 | |------|------|------| | lint-staged 不执行 | `.husky/pre-commit` 内容不对 | 确认内容为 `npx lint-staged` | | ESLint 报错太多 | 旧项目首次启用 | 先 `npx eslint --fix` 全量修复,再启用 hook | | gofmt 修改后 commit 内容不一致 | lint-staged 自动 format 后需要 re-stage | lint-staged 自动处理,无需手动 | | Monorepo 路径错误 | lint-staged 传递根目录相对路径 | 使用 `bash -c 'cd sub && ...'` 包装 |