git commit 前自动执行 Lint 检查怎么设置?husky + lint-staged 配置详解

清欢
清欢
发布时间:2026-08-22| 181人浏览过
原创

前言

很多项目都在做 Lint,但真正影响开发效率的,往往是检查时机太靠后:等到 CI 失败或 Review 提意见,修改成本已经上来了。本文把 `husky + lint-staged` 的职责、安装方式和两种常见配置拆开说明,帮助你判断该用“仅 ESLint”还是“Prettier + Lint”方案,并理解提交失败、自动格式化与跳过校验分别会带来什么结果。

很多团队已经在用 ESLint、Prettier 做代码规范检查,但真正拖慢效率的,往往不是“有没有检查”,而是“检查发生得太晚”。等到 Code Review 或 CI 才发现问题,开发者通常已经切到别的任务,回头修补的成本更高。

更直接的做法,是把检查前移到 git commit 之前:本次提交改了什么,就只检查哪些文件;有问题当场拦下,没问题再进入仓库。下面就按工具职责、安装方式和两种常见配置场景,梳理一套可直接落地的 husky + lint-staged 方案。

为什么要把 Lint 放到 commit 之前

传统流程里,代码风格检查经常放在 Code Review 或 CI 阶段执行。这种方式并非不能用,但问题在于反馈链条偏长:

  • 问题发现得晚,开发者已经离开当前上下文;
  • 一次提交里混入格式、语法、小错误,Review 成本会上升;
  • CI 因基础风格问题失败,容易占用不必要的排查时间。

如果把检查前移到 Git 的 pre-commit 钩子,就能在提交前完成最基本的一轮过滤。这样做的收益很直接:错误更早暴露,修复更快,进入仓库的代码也更整齐。

husky、lint-staged、prettier 分别负责什么

这一套方案里,三个工具的职责最好分开理解:

展示开发者提交代码后,husky、lint-staged、Prettier 与 ESLint 在 pre-commit 阶段如何串联执行,并决定提交通过或拒绝。
提交前自动检查的执行链路pre-commit 阶段的自动检查链路:谁负责触发、谁负责筛选文件、谁负责格式化与校验。
  • prettier:负责统一代码格式,例如缩进、空格、分号等,不处理复杂逻辑判断。
  • husky:负责管理 Git Hook,这里主要是绑定 pre-commit,让提交前自动触发任务。
  • lint-staged:负责只对 Git 暂存区里的文件执行任务,避免每次提交都全量扫描项目。

整个执行链路可以理解为:

  • 开发者写完代码后先执行 git add;
  • 随后执行 git commit;
  • husky 捕获 pre-commit 事件并调用 lint-staged;
  • lint-staged 找出本次暂存的文件,按预设命令逐个执行;
  • 如果其中任一检查失败,本次 commit 会被拒绝;
  • 全部通过后,提交才会继续完成。

先安装 husky 和 lint-staged

把这两个工具安装到项目的 devDependencies 即可。原文给出的命令如下:

npm install husky lint-staged --sa ve-dev

或者:

yarn add husky lint-staged --dev

如果你项目里已经有 ESLint 或 Prettier,只需要把它们和这两个工具接起来;如果还没有,也可以先把提交前的检查链路搭好,再逐步补充规则。

只做 ESLint 检查时,package.json 怎么配

如果当前项目暂时不打算接入 Prettier,只希望在提交前完成 ESLint 检查,可以直接在 package.json 中增加对应脚本、Hook 和 lint-staged 配置:

"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --open",
    ...
    "eslint": "eslint --ext .js,.vue src",
    "eslintfix": "eslint --fix --ext .js,.vue src",
    "lint-staged": "lint-staged"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint-staged"
    }
  },
  "lint-staged": {
    "**/*.{js,vue}": [
      "npm run eslint"
    ]
  },

这段配置的重点有两个:

  • 只匹配 .js 和 .vue 文件;
  • 只执行 ESLint,不做格式化处理。

适合已经有 ESLint 规则、但还不想把格式风格统一交给 Prettier 的项目。这样至少能先把语法错误和规则违规挡在提交之前。

同时接入 Prettier 时,提交流程会多一步

如果希望在提交前先自动格式化,再继续做 Lint 检查,那么可以使用下面这组更常见的配置,尤其适合 Vue 项目:

对比只使用 ESLint 与同时接入 Prettier 的 package.json 提交流程差异,突出命令顺序和适用场景。
两种 package.json 配置思路对比同样基于 lint-staged,是否接入 Prettier。
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,vue}": [
      "prettier --write",
      "vue-cli-service lint",
      "git add"
    ]
  }
}

这里的执行顺序值得单独看清:

  • prettier --write:先按照 Prettier 规则直接改写文件内容;
  • vue-cli-service lint:再对格式化后的代码做语法和规范检查;
  • git add:把格式化后重新写入的文件再次加入暂存区,确保提交内容是最新版本。

如果你不是 Vue 技术栈,也可以保持这套思路不变,只替换中间的检查命令。例如把 vue-cli-service lint 换成你项目里实际使用的 ESLint 命令即可。

.prettierrc 可以怎么写

接入 Prettier 后,通常还会补一个 .prettierrc 文件,用来明确团队代码风格。原文示例如下:

{
  "trailingComma": "es5", // 尾随逗号
  "tabWidth": 2,         // 缩进宽度
  "semi": false,         // 不要句尾分号
  "singleQuote": true,   // 使用单引号
  "end-of-line": "lf"    // 换行符统一为 LF
}

这几个选项主要影响的是代码外观,而不是运行逻辑。它们的价值在于让不同开发者、不同编辑器产出的代码格式尽量一致,减少无意义的格式争议。

提交失败或需要跳过检查时怎么办

完成以上配置后,每次执行 git commit,工具都会自动检查这次提交涉及的文件。

  • 如果检查失败,例如 ESLint 报错,终端会打印错误信息,本次提交被拒绝;
  • 如果所有任务都通过,commit 才会正常完成。

遇到特殊情况时,也可以临时跳过这套检查机制。原文给出的写法是:

git commit -no-verify

实际含义是通过 --no-verify 参数跳过 Git Hook。这个参数适合应急场景使用,但不建议作为日常提交方式,否则提交前检查就失去了意义。

这套方案适合哪些项目

husky + lint-staged 的核心价值,不在于“多加了一层工具”,而在于把反馈时机提前到了开发者最容易处理问题的那一刻。对前端项目尤其明显:只检查暂存区文件,执行速度通常可控,收益却很稳定。

如果你的目标是先把代码质量门槛立起来,可以从“仅 ESLint”开始;如果团队已经明确采用统一格式规范,再补上 Prettier 自动改写,会让整个提交流程更顺手。最终效果就是:低级错误更少进入仓库,团队成员之间也更容易保持一致的代码风格。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。