Skip to content
返回构建教程

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,其余都绿后——它产生最多错误但防最多运行时崩溃。