ESLint + Prettier + Husky + lint-staged 完整配置指南
这篇文档给一套可以直接复制粘贴使用的前端工程化配置方案,覆盖从 0 到 1 的完整落地过程。
1. 先理解这些工具在干什么
很多教程上来就甩一堆安装命令,读者根本不知道在装什么、为什么要装。先花 3 分钟搞清楚每个工具的职责。
1.1 配置前 vs 配置后
1.2 每个工具的职责
1.3 最关键的理解
lint-staged 是整个链路的核心效率工具。 如果没有它,每次 git commit 都要全仓扫描几百个文件,提交一次卡半分钟,团队迟早会绕过检查。它的价值就是:只检查你这次改了的那几个文件,快、稳、不碍事。
2. 最终目录结构
配置完成后,你的项目根目录会多出这些文件:
3. 第一步:配置 ESLint + Prettier
先把两个基础工具配好,让它们能手动正常运行,再接自动化。
3.1 安装依赖
各包的作用:
3.2 配置 Prettier
创建 .prettierrc:
semi: true和singleQuote: true是 JS/TS 社区最主流的选择,如果你团队偏好无分号,把semi改成false即可。
创建 .prettierignore:
为什么这一步很重要: 如果没有 .prettierignore,执行 prettier . --write 时会扫进 dist、node_modules 等目录,又慢又可能出错。
3.3 配置 ESLint(Flat Config)
注意: ESLint 10.0 已完全移除旧版
.eslintrc配置格式。如果你看到.eslintrc.js、.eslintrc.json这类文件,那是旧版写法,不再推荐。本文全程使用 Flat Config(eslint.config.mjs)。
JavaScript 项目
创建 eslint.config.mjs:
TypeScript 项目
创建 eslint.config.mjs:
框架项目补充:
- React 项目额外装
eslint-plugin-react-hookseslint-plugin-react-refresh,把它们的 config 加到数组里- Vue 项目额外装
eslint-plugin-vue@vue/eslint-config-typescript- 用法都是
import xxx from 'xxx'然后放到 export 数组中即可
Vue 项目新增
3.4 添加 npm scripts
在 package.json 的 scripts 里加上这 4 条:
3.5 手动验证
四条命令都不报错,ESLint + Prettier 就配好了。
4. 第二步:接入 Husky + lint-staged
上一步配完后,你可以在手动跑命令了。但每次提交前都要手动跑一遍,很麻烦,也容易忘。这一步让 Git 在提交时自动帮你跑。
4.1 安装
4.2 初始化 Husky
这个命令会做两件事:
- 创建
.husky/目录 - 在
package.json里写入prepare脚本
检查一下 package.json,至少要有:
prepare 的作用是:团队成员执行 pnpm install 后自动启用 Git Hooks。这个文件需要提交到仓库,之后新人克隆项目后只需 pnpm install,Hooks 就自动生效了。
4.3 配置 lint-staged
创建 lint-staged.config.mjs:
配置解读:
- 大括号里是文件匹配规则 — 只有本次
git add的、匹配了 glob 的文件才会被处理 - 数组里是命令,按顺序执行 — 先 ESLint 修复,再 Prettier 格式化
- lint-staged 会自动把文件路径传给命令 — 不需要手写
eslint src --fix - 修改后的文件会自动加回暂存区 — 不需要再写
git add
如果你的项目没有
css/scss/less,删掉对应行即可。
4.4 编写 pre-commit 钩子
编辑 .husky/pre-commit,只写一行:
macOS/Linux 下如果是手动创建的文件,需要加执行权限:
4.5 验证
随便改一个文件,比如故意把格式写乱:
然后执行:
你会看到终端输出 lint-staged 的执行过程——ESLint 和 Prettier 自动运行、修好了格式,然后提交继续。
如果 ESLint 检查到严重问题(比如用了 eval()),提交会被拦截。你需要修复代码后重新 add 和 commit。
5. 第三步(可选):用 commitlint 约束提交信息格式
前面配完后,代码质量已经有人守门了。但提交信息还是可以随便写——fix bug、update、改了一下。如果你的团队想统一提交信息格式,就加上 commitlint。
5.1 安装
5.2 配置 commitlint + cz-git
创建 commitlint.config.mjs,这份配置同时服务两件事:
commitlint校验提交信息是否合规cz-git读取prompt部分,生成中文交互式提问题
配置解读:
extends: ['@commitlint/config-conventional']继承官方推荐规则rules部分被commitlint读取,用于校验提交信息prompt部分被cz-git读取,用于生成中文交互式提示- 如果团队不需要 emoji,把
useEmoji改成false即可
5.3 在 package.json 中注册 cz-git
脚本名用 cm 而不是 commit,避免与 Git 钩子产生冲突。
5.4 编写 commit-msg 钩子
创建 .husky/commit-msg:
macOS/Linux 下同样需要
chmod +x .husky/commit-msg
5.5 验证
用错误格式试一次:
会被拦截,终端输出类似:
再用正确格式试一次:
顺利通过。
6. 最终文件清单(可直接复制)
6.1 package.json(关键字段)
如果项目没用 cz-git,去掉 cm 脚本和 config 字段即可。
6.2 eslint.config.mjs(TypeScript 版)
6.3 eslint.config.mjs(纯 JavaScript 版)
6.4 .prettierrc
6.5 .prettierignore
6.6 lint-staged.config.mjs
6.7 .husky/pre-commit
6.8 commitlint.config.mjs(可选)
6.9 .husky/commit-msg(可选)
7. 日常使用流程
配置好之后,日常提交流程就是两条命令:
提交时自动发生的事情:
- Husky 触发
.husky/pre-commit - lint-staged 找出本次 git add 过的文件
- 对匹配
*.{js,jsx,ts,tsx}的文件:先eslint --fix,再prettier --write - 对匹配
*.{css,json,md}等文件:只跑prettier --write - 全部通过后,进入
.husky/commit-msg - commitlint 校验
"feat(user): 新增用户头像上传功能"是否合规 - 全部通过,提交完成
紧急情况怎么绕过?
git commit --no-verify会跳过所有钩子。但这是紧急出口,不要养成习惯。
8. 验证清单
配置完成后,按顺序验证以下 5 项:
pnpm lint— 能正常检查代码pnpm format— 能正常格式化- 改一个文件 →
git add .→git commit -m "test: 测试"— 能看到 lint-staged 自动运行 git commit -m "foo"— 被 commitlint 拦截(如果配了)git commit -m "feat: 正常提交"— 全部通过
5 项都通过,链路就接好了。
9. 常见问题
9.1 提交变慢了怎么办?
大概率是 pre-commit 里跑了全仓任务。lint-staged 的职责就是「只查 staged files」,不要在 Hook 文件里写成:
9.2 提交失败后,觉得代码丢了?
lint-staged 在运行前会自动创建 git stash 备份。如果提交失败后状态被回滚了,执行以下命令恢复:
9.3 不要在 lint-staged 的命令里手写路径
9.4 不要手写 git add
现代 lint-staged 会自动把修改后的文件加回暂存区。
9.5 避免重叠的 glob 规则
9.6 不要默认在 pre-commit 里跑整仓 tsc --noEmit
tsc --noEmit 是全仓类型检查,速度较慢。更推荐:
- 放到
pre-push钩子 - 放到 CI 流水线
如果你非要在 lint-staged 里跑,需要用函数写法避免自动拼接文件参数:
9.7 Windows 下的注意事项
.husky/pre-commit和.husky/commit-msg文件使用 UTF-8 编码- 直接在编辑器里手动创建 Hook 文件,不要用 PowerShell 的
echo命令写($1可能被转义)
9.8 Monorepo 项目怎么配
可以在根目录配通用文件(json、md),各子包各自配自己的规则。lint-staged 会自动找离文件最近的配置文件:
9.9 CI 环境不需要跑 Husky
在 CI 中设置环境变量 HUSKY=0,然后在 CI 步骤中显式跑 lint 和 format:
10. 一页安装命令
如果你不想看解释,只想快速落地,就按下面顺序执行:
然后把第 6 节的配置文件复制到项目对应位置,最后执行:
这套配置的核心思路就一句话:用最少的工具、最少的文件、最清楚的职责划分,把提交前检查这件事做稳。 不需要装十几个包,也不需要几百行配置,上面这些足够覆盖绝大多数前端项目。

