HUSKY_LINT_STAGED.md 6.01 KB

Husky + lint-staged 配置说明

✅ 配置完成

你的项目现在已经配置了 Huskylint-staged,在 Git 提交前自动运行代码检查和格式化。

📦 已安装的包

{
  "devDependencies": {
    "husky": "^9.1.7",
    "lint-staged": "^16.2.7"
  }
}

🔧 配置文件

1. Husky 配置

目录: .husky/

文件:

  • pre-commit - 提交前执行的 hook
  • _/husky.sh - Husky 辅助脚本

pre-commit 内容:

#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

2. lint-staged 配置

位置: package.json 中的 lint-staged 字段

配置:

{
  "lint-staged": {
    "*.{js,vue}": ["eslint --fix", "prettier --write"],
    "*.{css,less,scss}": ["prettier --write"],
    "*.{json,md}": ["prettier --write"]
  }
}

🚀 工作流程

自动化流程

1. git add .
   ↓
2. git commit -m "xxx"
   ↓
3. Husky 触发 pre-commit hook
   ↓
4. lint-staged 检查暂存的文件
   ↓
5. ESLint 自动修复问题
   ↓
6. Prettier 自动格式化代码
   ↓
7. 如果所有检查通过 → 提交成功 ✅
   如果有错误 → 提交失败,显示错误信息 ❌

文件类型处理

文件类型 操作
*.js, *.vue ESLint 检查并修复 + Prettier 格式化
*.css, *.less, *.scss Prettier 格式化
*.json, *.md Prettier 格式化

📝 使用示例

正常提交

# 1. 修改文件
echo "console.log('test')" >> test.js

# 2. 添加到暂存区
git add test.js

# 3. 提交(自动运行 lint-staged)
git commit -m "test: add test file"

# 输出:
# ✔ prettier --write test.js
# ✔ eslint --fix test.js
# [main xxxxx] test: add test file

提交失败(有错误)

# 1. 创建有错误的文件
cat > bad.js << 'EOF'
function test() {
  var x = 1  // 缺少分号,使用了 var
  return x
}
EOF

# 2. 尝试提交
git add bad.js
git commit -m "test: bad code"

# 输出:
# ✖ eslint --fix bad.js
# ✖ 1:7  error  Unexpected var, use let or const instead  no-var
# ✖ 1:18  error  Missing semicolon
# husky - pre-commit hook exited with code 1 (error)

跳过 Hook(不推荐)

# 使用 --no-verify 跳过 hook
git commit --no-verify -m "xxx"

🛠️ 调试

测试 lint-staged

# 不实际提交,只测试 lint-staged
npx lint-staged

查看已安装的 Hooks

# 查看所有 Git hooks
ls -la .husky/

# 查看 pre-commit 内容
cat .husky/pre-commit

手动运行 Hook

# 手动执行 pre-commit hook
.husky/pre-commit

📋 常见问题

1. Hook 不执行

检查:

# 1. 检查 .husky 目录是否存在
ls -la .husky/

# 2. 检查 pre-commit 是否可执行
ls -la .husky/pre-commit

# 3. 如果不可执行,添加权限
chmod +x .husky/pre-commit

2. lint-staged 找不到文件

原因: 文件未被 git add 到暂存区

解决:

# 确保文件已添加到暂存区
git add your-file.js

# 检查暂存区文件
git status

3. 提交速度慢

原因: lint-staged 检查的文件太多

优化:

  • 缩小 package.jsonlint-staged 的匹配范围
  • 只检查 src/ 目录
{
  "lint-staged": {
    "src/**/*.{js,vue}": ["eslint --fix", "prettier --write"]
  }
}

4. 想暂时禁用 Hook

方法 1 - 跳过单次提交:

git commit --no-verify -m "xxx"

方法 2 - 暂时删除 hook:

# 删除 hook
rm .husky/pre-commit

# 提交后恢复
git checkout .husky/pre-commit

🎯 最佳实践

1. 提交前检查

即使有 Husky,建议提交前也手动检查:

# 1. 格式化代码
pnpm format

# 2. Lint 检查
pnpm lint:check

# 3. 测试
pnpm test

# 4. 提交(Husky 会再次检查)
git add .
git commit -m "xxx"

2. 团队协作

确保团队成员都安装了依赖:

# 克隆项目后
pnpm install

# Husky 会自动安装(通过 prepare 脚本)

package.json 中的 prepare 脚本:

{
  "scripts": {
    "prepare": "husky"
  }
}

这确保了每次 pnpm install 后都会自动安装 Husky hooks。

3. CI/CD 集成

在 CI 中可以跳过 Husky(因为 CI 环境不使用 Git hooks):

# .github/workflows/ci.yml
- name: Lint and format
  run: |
    pnpm lint:check
    pnpm format:check

🔄 更新配置

添加新的 Hook

# 创建 commit-msg hook(检查提交信息)
cat > .husky/commit-msg << 'EOF'
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"

npx commitlint --edit $1
EOF

chmod +x .husky/commit-msg

修改 lint-staged 配置

编辑 package.json 中的 lint-staged 字段:

{
  "lint-staged": {
    "src/**/*.{js,vue}": ["eslint --fix", "prettier --write"],
    "src/**/*.{css,less}": ["prettier --write"],
    "*.md": ["prettier --write", "markdownlint --fix"]
  }
}

添加测试到 Hook

编辑 .husky/pre-commit:

#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"

# 运行 lint-staged
npx lint-staged

# 运行测试(可选)
pnpm test

📚 参考资源

🎉 总结

优势:

  • ✅ 自动化代码质量检查
  • ✅ 保持代码风格一致
  • ✅ 防止低质量代码进入仓库
  • ✅ 节省手动检查时间
  • ✅ 团队协作更高效

注意事项:

  • ⚠️ Hook 只在本地执行,不会影响已经推送的代码
  • ⚠️ 可以使用 --no-verify 跳过(不推荐)
  • ⚠️ CI/CD 中应该单独运行检查(不依赖 Hook)

下一步:

  • 添加 commitlint(提交信息规范)
  • 添加更多 Git hooks(commit-msg、pre-push)
  • 配置 CI/CD 中的质量检查

享受自动化的 Git 工作流!🚀