lefthook 和 lint-staged 是不是用一个就够了
是的,通常情况下 lefthook 和 lint-staged 用一个就够了,因为它们解决的是同类问题:在 Git 提交前(或其他 Git 钩子阶段)自动运行代码检查或格式化任务。
但它们的定位、能力和实现方式有显著区别。选择哪一个,取决于你的需求和偏好。
🔍 核心对比
| 特性 | lint-staged | lefthook |
|---|---|---|
| 核心功能 | 只处理 staged files(暂存区文件),配合 linters/formatters 使用。 | 通用 Git hooks 管理器,可运行任意命令(不仅限于 staged 文件)。 |
| 配置语言 | JavaScript / JSON(通过 package.json 或 .lintstagedrc) |
YAML(.lefthook.yml),更简洁清晰 |
| 性能 | 基于 Node.js,启动稍慢 | Go 编写,极快(毫秒级启动) |
| 跨语言支持 | 依赖 Node.js 环境 | 无需 Node.js,独立二进制,适合非 JS 项目(如 Go、Rust、Python) |
| 钩子范围 | 主要用于 pre-commit |
支持 所有 Git hooks(pre-push, commit-msg, post-merge 等) |
| 与 Husky 关系 | 通常搭配 Husky 使用(Husky 负责注册钩子,lint-staged 负责过滤文件) | 自带 Git hooks 管理,无需 Husky |
| 文件过滤 | 自动只处理 staged 文件 | 需手动指定 files 或使用 git diff --cached |
✅ 如何选择?
👉 选 lint-staged 如果:
- 你的项目是 纯前端/Node.js 项目。
- 你已经用了 Husky,且只需要在
pre-commit时格式化/检查 staged 文件。 - 你习惯 JS 配置,且对性能要求不高。
- 生态成熟,社区广泛。
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,ts}": ["eslint --fix", "prettier --write"]
}
}
👉 选 lefthook 如果:
- 你追求 极致速度(Go 编译,无 Node 启动开销)。
- 项目是 多语言混合(如前端 + 后端 Go/Rust)。
- 你想管理 多个 Git 钩子(不只是 pre-commit)。
- 你喜欢 YAML 配置,希望工具链更轻量、不依赖 Node。
- 想摆脱 Husky + lint-staged 的组合。
# .lefthook.yml
pre-commit:
commands:
lint:
glob: "*.{js,ts,vue}"
run: npx eslint {staged_files} --fix
format:
glob: "*.{js,ts,json,md}"
run: npx prettier --write {staged_files}
💡
lefthook也支持files: git diff --cached --name-only来模拟lint-staged的行为。
🚫 能否同时用?
技术上可以,但强烈不推荐:
- 功能重叠,造成冗余。
- 钩子冲突风险(比如两个都注册了
pre-commit)。 - 增加维护复杂度。
✅ 结论
| 场景 | 推荐工具 |
|---|---|
| 简单 JS 项目,已有 Husky | lint-staged |
| 追求性能、多语言、现代化配置 | lefthook(更推荐) |
| 只需要 pre-commit + staged 文件处理 | 两者皆可,但选一个即可 |
建议:新项目优先考虑
lefthook—— 更快、更通用、配置更清晰,且正在成为现代 Git hooks 管理的新标准。

浙公网安备 33010602011771号