Git提交前ESLint校验实践(Husky + lint-staged)

背景

在前端项目里,最常见的问题不是"代码跑不起来",而是"能跑,但有 lint warning/error,最后在 CI 或 Vercel 部署阶段失败"。

一个更稳妥的做法是把校验前置到 git commit

  • 本地提交前先过 ESLint
  • 发现 warning/error 直接阻止提交
  • 减少反复 push 后再回头修复的问题

这和 VSCode 有关系吗?

核心机制不是 VSCode,而是 Git Hook

  • 无论你是在 VSCode 点"提交",还是在终端执行 git commit
  • 只要仓库里配置了 pre-commit hook
  • 就会触发同一套检查逻辑

所以本质是"仓库配置",不是"编辑器拦截"。

整体链路

提交时的执行链路通常是:

  1. git commit
  2. Git 读取 core.hooksPath(例如 .husky/_
  3. 触发 .husky/pre-commit
  4. 执行 npx lint-staged
  5. lint-staged 仅对"已暂存文件"执行 eslint --max-warnings=0
  6. 若有 warning/error,命令返回非 0,Git 中止本次提交

为什么推荐 lint-staged

直接在 pre-commit 跑 eslint . 也能拦截,但效率较低:

  • 每次提交都扫全量代码
  • 速度慢,影响日常开发体验

lint-staged 的优势是:

  • 只检查暂存文件
  • 速度快
  • 更适合日常频繁提交

标准配置(单仓库)

1. 安装依赖

bash 复制代码
yarn add -D husky lint-staged

2. package.json 增加脚本和 lint-staged 配置

json 复制代码
{
  "scripts": {
    "lint": "eslint .",
    "prepare": "husky"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --max-warnings=0"
    ]
  }
}

3. 初始化 Husky 并创建 pre-commit

bash 复制代码
yarn prepare

新建 .husky/pre-commit

sh 复制代码
npx lint-staged

建议给脚本可执行权限:chmod +x .husky/pre-commit

子目录前端项目(父目录才是 Git 根)

如果前端项目在子目录(例如 backend-admin/),而 Git 根在上一级,需要特别处理:

package.json 的 prepare

json 复制代码
{
  "scripts": {
    "prepare": "cd .. && ./backend-admin/node_modules/.bin/husky backend-admin/.husky"
  }
}

pre-commit(从 Git 根进入子项目执行)

.husky/pre-commit

sh 复制代码
cd backend-admin || exit 1
npx lint-staged

这样可以避免 husky.git can't be found,并确保命令在正确目录执行。

常见坑与解决方案

1. 有 warning 也要阻止提交

必须使用:

bash 复制代码
eslint --max-warnings=0

否则 warning 默认不会让命令失败。

2. lint-staged 中环境变量不生效

lint-staged 默认不是 shell 执行,写成 FOO=bar eslint ... 可能报 ENOENT

可选方案:

  • cross-env 包装
  • 或改成脚本文件统一处理

3. Monorepo / 多项目目录误扫

建议:

  • 在目标子项目目录放 package.jsonlint-staged 配置
  • pre-commitcd 到目标目录再执行

这样只校验该项目的暂存文件,不影响其他子项目。

4. Husky v9 提示旧模板弃用

Husky v9 不需要旧的 husky.sh 引入模板。

pre-commit 直接写:

sh 复制代码
npx lint-staged

即可。

团队落地建议

  1. 在 README 或团队规范里写清楚"提交前拦截策略"。
  2. 把"warning 视同失败"作为统一标准,避免每人本地口径不一致。
  3. CI 仍保留 lint 检查,Hook 负责前置,CI 负责兜底。
  4. 新同学拉代码后执行一次依赖安装(会触发 prepare)。

结论

这套方案的核心不是 VSCode,而是 Git Hook。通过 Husky + lint-staged + eslint --max-warnings=0,可以把问题拦在提交前,显著减少"部署时才发现 lint 问题"的返工。

如果你的目标是"提交质量稳定 + 部署失败率下降",这套配置是性价比很高的基线方案。

相关推荐
朱昆鹏6 小时前
开源 Claude Code + Codex + 面板 的未来vibecoding平台
前端·后端·github
猫头虎8 小时前
OpenClaw-VSCode:在 VS Code 里玩转 OpenClaw,远程管理+SSH 双剑合璧
ide·vscode·开源·ssh·github·aigc·ai编程
hh随便起个名9 小时前
适合小白的git的基础使用方法
git
我会一直在的10 小时前
Devps持续集成
git·ci/cd
你听得到1110 小时前
我彻底搞懂了 SSE,原来流式响应效果还能这么玩的?(附 JS/Dart 双端实战)
前端·面试·github
宁雨桥10 小时前
Gitee迁移GitHub开源全攻略:一键配置自动同步,仅需维护单一仓库
gitee·开源·github
掘金安东尼10 小时前
⏰前端周刊第 452 期(2026年2月2日-2月8日)
前端·javascript·github
CoderJia程序员甲11 小时前
GitHub 热榜项目 - 日榜(2026-02-08)
git·ai·开源·llm·github
猫头虎11 小时前
手动部署开源OpenClaw汉化中文版过程中常见问题排查手册
人工智能·langchain·开源·github·aigc·agi·openclaw