Husky + lint-staged:把好代码提交前的最后一关

Husky 管理 Git 钩子,lint-staged 只对暂存文件跑检查。本文讲解安装配置、pre-commit 钩子、高级配置(按文件类型跑不同命令)与提交信息校验。

最佳实践
事件循环与异步任务流转插画

组合方案一句话——Husky 把脚本挂进 Git 钩子,lint-staged 让检查只针对本次提交的文件:npx husky init 初始化,pre-commit 钩子里跑 npx lint-staged,配置中按文件类型指定 eslint/prettier/测试命令。提交前秒级完成质量检查,脏代码进不了仓库。

为什么需要这对组合

CI 里跑全量 Lint 要几分钟,等问题暴露代码已经提交推送——反馈太晚。把检查挪到提交前(pre-commit)反馈即时,但全量跑又太慢。lint-staged 的智慧在于只检查你改动的文件——改 3 个文件就查 3 个,毫秒级完成。

安装配置

npm install --save-dev husky lint-staged
npx husky init

package.json 配置 lint-staged:

{
  "lint-staged": {
    "*.{js,ts,jsx,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,md,css}": ["prettier --write"],
    "*.ts": ["bash -c 'tsc --noEmit'"]
  }
}

echo "npx lint-staged" > .husky/pre-commit 挂上钩子。提交时自动:暂存文件跑 ESLint 修复 + Prettier 格式化,修复结果自动重新暂存。

高级配置

  • 按项目分目录:monorepo 中各包可以有独立 lint-staged 配置;
  • 函数式配置(lint-staged.config.js):动态生成命令,如只对变更测试文件相关源码跑测试;
  • 并发控制:默认并发执行,--concurrent false 串行排查问题;
  • 测试联动:jest --bail --findRelatedTests 只跑与变更文件相关的测试。

commit-msg 钩子:规范提交信息

Husky 同样管理 commit-msg 钩子,配 commitlint 强制 Conventional Commits:

npm install --save-dev @commitlint/cli @commitlint/config-conventional
echo "npx --no-install commitlint --edit \$1" > .husky/commit-msg

feat: 新增用户导出 通过,update stuff 被拦截——规范的提交历史让 CHANGELOG 可以自动生成。

团队协作注意事项

  • 钩子随仓库走:Husky 安装后 .husky/ 目录入库,npm install 时自动激活(prepare 脚本);
  • 保持秒级反馈:钩子超过 10 秒团队就会想办法绕过,重活(全量测试)留给 CI。

常见问题(FAQ)

Q:Husky 钩子不生效怎么办?

检查:.husky/ 目录已提交、package.json 有 "prepare": "husky" 脚本、Git 版本 ≥ 2.9(core.hooksPath 支持)。新克隆仓库需跑一次 npm install 激活。

Q:lint-staged 修复后的文件需要手动再 add 吗?

不需要——lint-staged 自动把修复后的文件重新加入暂存区,提交的是修复后的版本。

Q:Windows 上 Husky 有问题吗?

现代版本(v9+)跨平台表现稳定。老项目 Husky v4 的配置方式(package.json 内嵌)已废弃,按官方迁移指南升级到 .husky/ 目录模式。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台