lefthook 和 lint-staged 是不是用一个就够了

是的,通常情况下 lefthooklint-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 hookspre-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 管理的新标准。

posted @ 2025-12-17 20:55  龙陌  阅读(0)  评论(0)    收藏  举报