Lint 配置
配置 ESLint + Prettier + TypeScript strict,在提交前捕获风格和类型错误。
为什么
Linter 是你能得到的最便宜的代码评审——2 秒跑完,抓住 80% 不需要人类判断的问题。没有它,每个 PR 评审浪费 15 分钟在'这里用 const'和'这个 hook 无条件',没时间给真正重要的架构反馈。TypeScript strict 不可商量:它把 null 访问、隐式 any、缺返回类型的运行时崩溃变成编译错误。三者组合加 pre-commit hook 强制,意味着到达评审的代码已 达基线质量,评审聚焦意图而非语法。
何时使用
project-init 期间,第一个功能提交之前。约 30 分钟。仅对 50 行以下抛弃脚本可跳过。
如何做
1. 装三件套:eslint + prettier + typescript-eslint - pnpm add -D eslint prettier @typescript-eslint/eslint-plugin @typescript-eslint/parser - 用 eslint --init 选配置风格,然后扩展它 2. 在 tsconfig.json 启用 TypeScript strict - "strict": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true - 修产生的错误——不要降级来消音 3. 加 eslint-config-prettier 禁用冲突规则 - extends: ["next/core-web-vitals", "prettier"] - 这让 ESLint 把格式化交给 Prettier 4. 用 lint-staged 接 pre-commit hook - pnpm add -D husky lint-staged - npx husky init;编辑 .husky/pre-commit 跑 "npx lint-staged" - lint-staged 只对改动文件跑 eslint --fix 和 prettier --write 5. 把 lint 脚本加进 package.json 和 CI - "lint": "eslint . --ext .ts,.tsx --max-warnings 0" - CI 对任何警告失败——否则警告会烂成被忽略的噪音
示例
// .eslintrc.json
{
"extends": ["next/core-web-vitals", "prettier"],
"rules": {
"@typescript-eslint/no-floating-promises": "error",
"no-console": ["warn", { "allow": ["warn", "error"] }]
},
"ignorePatterns": ["dist/", ".next/"]
}
// package.json 里的 lint-staged 配置
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{json,md,css}": ["prettier --write"]
}常见问题
- ⚠启用太多规则导致 lint 要 30 秒,开发者开始用 --no-verify 跳过 hook 提交。
- ⚠设 --max-warnings 0 但加 50 个 eslint-disable 注释而非修根因。
- ⚠prettier 和 eslint 规则冲突,每次保存互相重新格式化。
- ⚠CI 不含 lint 步骤,pre-commit hook 成唯一门控且可用 --no-verify 绕过。
最佳实践
- ✓用 eslint-config-prettier(非 -recommended)——它只禁用不加规则,零冲突。
- ✓hook 里用 lint-staged、CI 里全仓 lint,保持 lint 5 秒以内。
- ✓把 eslint-disable 当代码异味,要求评审注释解释原因——别让它变例行公事。
- ✓最后开 noUncheckedIndexedAccess,其余都绿后——它产生最多错误但防最多运行时崩溃。