Skip to content

ESLint 配置

概述

Walnut Admin 使用 ESLint 10.3 flat config + @antfu/eslint-config 作为统一的代码检查方案。配置通过 @walnut/eslint-config 共享包分发给所有 workspace 成员。

我们做了什么

1. Flat Config 迁移

ESLint v9+ 默认只支持 flat config(eslint.config.mjs)。旧的 .eslintrc.* 格式已被废弃。项目已完成全量迁移:

js
// root eslint.config.mjs — 全仓库入口
import vueConfig from '@walnut/eslint-config/vue'
export default vueConfig()

2. 共享 ESLint Config 包

@walnut/eslint-config 提供三种预设:

预设文件适用场景
vuevue.mjsapps/admin — Vue 3 + TypeScript
nestnest.mjsapps/server — NestJS + CJS + decorators
basebase.mjspackages/* — 纯 TypeScript 共享包

每个消费者只需一行 import:

js
import nestConfig from '@walnut/eslint-config/nest'
export default nestConfig()

3. NestJS 特殊规则放宽容忍

ESLint 的类型感知规则(ts/no-unsafe-*)在 NestJS 中做了降级处理(errorwarn)。原因:pnpm workspace symlink 下,TypeScript 的 ESLint 插件无法解析 @walnut/contractas const 对象的字面类型。tsc --noEmit 本身零报错——这些 ESLint 告警是已知误报,见 ADR-0012

4. Prettier 集成

根目录统一管理 .prettierrc,通过 eslint-config-prettier 关闭 ESLint 中与 Prettier 冲突的格式规则。prettier 是 catalog 统一版本。

5. Git Hooks 门禁

jsonc
// package.json
{
  "simple-git-hooks": {
    "pre-commit": "pnpm lint-staged",
    "pre-push": "pnpm types:check"    // pre-push 才跑类型检查(慢)
  },
  "lint-staged": {
    "*.{ts,vue,mjs,js}": "eslint --fix --concurrency=auto",
    "*.md": "eslint --fix"
  }
}

分层策略:

时机做什么耗时
pre-commitESLint fix on staged files秒级
pre-push全仓库类型检查十秒级
CI完整 lint + typecheck + test分钟级

没做什么 / 为什么

不用 oxlint / biome

oxlint 和 biome(Rust 写的极速 linter)都不支持 Vue SFC(.vue 文件)。Walnut Admin 的前端是 Vue 3,这是 blocker。将来如果它们支持 Vue SFC,可以作为 ESLint 之前的第一道快速扫描层。

不用 legacy .eslintrc

已全量迁移到 flat config。ESLint v10 将彻底移除对旧格式的支持。


关键文件

文件作用
eslint.config.mjs根入口,委托给 @walnut/eslint-config/vue
packages/eslint-config/vue.mjs前端 Vue 3 预设
packages/eslint-config/nest.mjs后端 NestJS 预设
packages/eslint-config/base.mjs共享包预设
.prettierrc格式化统一配置

基于 MIT 许可发布