🔍 静态代码分析(规范与质量)¶
静态分析 = 不运行代码就发现错误、统一风格。本篇覆盖 ESLint(质量)、Prettier(格式)、Stylelint(CSS)、Commitlint(提交)、Husky + lint-staged(提交前卡口),按官方最佳实践组合。
1. 工具分工(别让它们打架)¶
| 工具 | 管什么 | 不管什么 |
|---|---|---|
| ESLint | 代码质量、潜在 bug、反模式 | 纯格式(交给 Prettier) |
| Prettier | 统一格式(引号/缩进/换行) | 逻辑错误 |
| Stylelint | CSS/SCSS 规范 | JS |
| Commitlint | Git 提交信息格式 | 代码 |
| Husky + lint-staged | 提交前自动跑上面的检查 | — |
ESLint 与 Prettier 必须解耦
二者规则重叠(如引号、分号)会互相覆盖报错。标准做法:Prettier 管格式,ESLint 关闭所有格式化规则并加 eslint-config-prettier。
2. ESLint 基础¶
// eslint.config.js(ESM,Flat Config,ESLint 9 默认)
import js from '@eslint/js'
import prettier from 'eslint-config-prettier'
export default [
js.configs.recommended,
{ languageOptions: { ecmaVersion: 2022, sourceType: 'module' } },
prettier,
]
常用规则:
- no-unused-vars:未使用变量(死代码)
- no-eval:禁用 eval
- eqeqeq:强制 ===
- @typescript-eslint/no-explicit-any:TS 里限制 any
别关掉报错规则用 // eslint-disable 掩盖
临时禁用要写原因且尽快修。把 no-explicit-any 之类全关 = 失去 TS 价值。
3. Prettier 配置¶
// .prettierrc
{ "semi": false, "singleQuote": true, "printWidth": 80, "trailingComma": "all" }
4. Stylelint(CSS/SCSS)¶
// .stylelintrc.json
{ "extends": ["stylelint-config-standard"] }
5. Commitlint(提交规范)¶
// commitlint.config.js
module.exports = { extends: ['@commitlint/config-conventional'] }
// 提交示例: feat(login): 新增验证码输入框
6. Husky + lint-staged(提交前卡口)¶
# 安装
npm i -D husky lint-staged
npx husky init
// package.json
{
"lint-staged": {
"*.{js,ts,vue,jsx,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["stylelint --fix"]
}
}
# .husky/pre-commit
npx lint-staged
# .husky/commit-msg
npx --no-install commitlint --edit "$1"
为什么用 lint-staged 而不是全量 lint
提交前只对暂存的文件跑检查,秒级完成;全量 lint 在大仓库会卡很久。配合 Husky 在 pre-commit 钩子触发。
Husky 的坑
- 团队成员需
npm install后 Husky 才装钩子;CI 里跳过钩子(CI 已单独跑 lint)。 - 别在钩子里做耗时操作(如全量构建),会让提交卡死。
7. 自检清单¶
- ESLint 开了
eslint-config-prettier,不与 Prettier 冲突 - Prettier 规则团队统一且已格式化全仓
- Stylelint 覆盖 CSS/SCSS
- Commitlint 卡住不规范提交
- Husky + lint-staged 在 pre-commit / commit-msg 生效
- 我没有用
eslint-disable掩盖真问题