在 2026 年,ESLint 依然是我们守护 React 代码质量的第一道防线,但它的角色已经从单纯的“错误捕获者”演变成了“AI 辅助开发工作流”的基石。当我们面对 React 19、React Compiler 以及无处不在的 AI 结对编程工具(如 Cursor 和 Windsurf)时,一个现代化的 ESLint 配置不仅仅是写几条规则,更是为了教导 AI 如何理解我们的代码意图,从而在“氛围编程(Vibe Coding)”的时代保持工程的严谨性。
在这篇文章中,我们将深入探讨如何构建一套面向未来的配置体系。我们不仅会涵盖经典的 .eslintrc.json 设置与现代化的 Flat Config 迁移,还会分享我们如何在 AI 时代优化 Linting 体验,以及我们在大型生产环境中踩过的坑和解决方案。
配置 React 项目中 ESLint 的前置条件与初始化
在开始之前,让我们确保环境已经准备就绪。虽然 2026 年我们可能更多使用 Vite 或 Next.js,但标准的 React 项目初始化逻辑依然适用。我们以一个标准的 React + TypeScript 项目为例。
#### 步骤 1:创建项目
我们推荐使用 Vite 以获得更现代、更快的开发体验,它完美契合 2026 年的开发节奏。
# 创建 Vite + React 项目
npm create vite@latest myreactapp -- --template react-ts
#### 步骤 2:安装核心依赖
进入项目目录后,我们需要安装 ESLint 及其 React 生态的核心插件。请注意,在 2026 年,TypeScript 已经是默认标准,因此我们会直接安装 typescript-eslint。
cd myreactapp
# 安装核心及 React 相关插件
npm i -D eslint
# 安装 TypeScript 相关解析器(2026年标准方案)
npm i -D typescript-eslint
# 安装 React 核心规则
npm i -D eslint-plugin-react eslint-plugin-react-hooks
# 安装可访问性规则
npm i -D eslint-plugin-jsx-a11y
# 安装导入顺序规则(保持代码整洁的关键)
npm i -D eslint-plugin-import
拥抱未来:从 INLINECODEf7057722 迁移到 INLINECODE6376dd09 (Flat Config)
这是 2026 年最重要的一点技术变迁。传统的 .eslintrc.json(Legacy Config)虽然依然有效,但 ESLint 社区已经全面转向 Flat Config(扁平化配置)。为什么我们要做出这个改变?
- 更好的性能:Flat Config 去掉了繁重的层级查找逻辑。
- 对 AI 友好:JavaScript 配置文件能被 AI IDE(如 Cursor)更精准地解析和修改。
- 原生 ESM 支持:不再需要复杂的
babel-eslint转换层。
让我们来看一个实际的生产级 eslint.config.js 例子。在我们最近的一个大型金融科技项目中,正是通过这种配置,我们实现了代码规范的统一。
// eslint.config.js
import js from ‘@eslint/js‘;
import tseslint from ‘typescript-eslint‘;
import reactPlugin from ‘eslint-plugin-react‘;
import reactHooksPlugin from ‘eslint-plugin-react-hooks‘;
import jsxA11y from ‘eslint-plugin-jsx-a11y‘;
import importPlugin from ‘eslint-plugin-import‘;
export default [
// 1. 忽略文件配置:这是 Flat Config 的标准写法
{ ignores: [‘dist‘, ‘node_modules‘, ‘build‘, ‘*.config.js‘] },
// 2. 应用全局 JavaScript 推荐配置
js.configs.recommended,
// 3. TypeScript 配置:直接使用 typescript-eslint 包
...tseslint.configs.recommended,
// 4. React 及插件配置
{
plugins: {
react: reactPlugin,
‘react-hooks‘: reactHooksPlugin,
‘jsx-a11y‘: jsxA11y,
import: importPlugin,
},
// 5. 规则设定
rules: {
// React 17+ 不再需要显式导入 React
‘react/react-in-jsx-scope‘: ‘off‘,
// 如果使用 TS,关闭 PropTypes
‘react/prop-types‘: ‘off‘,
// 强制使用 React Hooks 的规则
...reactHooksPlugin.configs.recommended.rules,
// 可访问性检查(这对于无障碍设计至关重要)
...jsxA11y.configs.recommended.rules,
// 导入顺序:让 AI 帮你整理代码
‘import/order‘: [
‘error‘,
{
groups: [‘builtin‘, ‘external‘, ‘internal‘, ‘parent‘, ‘sibling‘, ‘index‘],
‘newlines-between‘: ‘always‘,
alphabetize: { order: ‘asc‘, caseInsensitive: true },
},
],
},
// 6. 语言环境设置
settings: {
react: {
version: ‘detect‘, // 自动检测 React 版本
},
},
languageOptions: {
parserOptions: {
ecmaVersion: ‘latest‘,
sourceType: ‘module‘,
ecmaFeatures: { jsx: true },
},
globals: {
browser: true,
es2021: true,
node: true,
},
},
},
];
代码解析:
你可能已经注意到,我们将配置导出为一个数组。这种结构允许我们轻松地组合不同的配置块。在实际操作中,如果我们需要为特定文件(如测试文件)覆盖规则,只需在数组中追加一个对象即可,这在传统的 JSON 格式中是很难实现的。
针对 React Compiler 与 AI 时代的深度优化
配置好基础规则只是第一步。在 2026 年,我们需要让 ESLint 适应新的开发模式。
#### 1. 处理 React Compiler 的“规则冲突”
React 19 引入了 React Compiler,它能自动优化组件的重渲染。这带来了一个有趣的挑战:react-hooks/exhaustive-deps 规则(检查依赖项完整性)可能会变得过于严格,或者与 Compiler 的智能优化产生冲突。
我们遇到的场景:
在我们启用 Compiler 的初期,我们发现很多被 Compiler 认可的“安全代码”,却被 ESLint 标记为依赖缺失。
解决方案:
我们可以保留 INLINECODE0694c81a,但将其级别设为 INLINECODEb8699552 而非 INLINECODEf7b8761e。更重要的是,我们需要引入 INLINECODE6b1b4514 来确保我们的代码结构符合 Compiler 的优化标准(例如,避免在循环中声明组件,确保纯度)。
// 在 eslint.config.js 的 rules 中添加
{
rules: {
// 允许 Compiler 接管的代码风格
‘react-hooks/exhaustive-deps‘: ‘warn‘,
// 启用 Compiler 检查(需要先安装插件)
‘react-compiler/react-compiler‘: ‘error‘,
}
}
#### 2. AI 辅助开发:让 AI 理解你的规范
在使用 Cursor 或 GitHub Copilot 时,ESLint 配置文件实际上就是 AI 的“系统提示词”。
最佳实践:
- 显式化规则:不要依赖默认值。我们总是会在配置中显式地写出
quotes: [‘error‘, ‘single‘],这样 AI 生成代码时就会自动使用单引号,减少了后期的格式修正。 - 使用注释说明意图:如果团队有特殊约定,我们会在配置文件中添加注释。
// 团队约定:为了 AI 可读性,强制使用显式返回类型
rules: {
‘@typescript-eslint/explicit-function-return-type‘: ‘warn‘
}
工程化深度:性能优化与常见陷阱
随着项目规模膨胀,ESLint 可能会成为 CI/CD 管道的瓶颈。让我们看看如何解决这个 2026 年依然常见的问题。
#### 1. 性能优化策略:从 45秒 到 2秒
在一个包含 50 万行代码的 Monorepo 中,全量运行 ESLint 可能需要几分钟。我们采用了以下策略进行优化:
- 策略 A:缓存机制
使用 --cache 标志是性价比最高的优化。ESLint 会缓存未修改文件的检查结果。
eslint "src/**" --cache --cache-location node_modules/.cache/eslint
- 策略 B:分层 CI 检查
在 Git Hooks(pre-commit)阶段,我们只使用 lint-staged 检查当前变更的文件。只有在 PR 合并时,才运行全量检查。
# .husky/pre-commit
npx lint-staged
效果对比:
优化前:热更新需要 800ms,CI 检查 45s。
优化后:热更新 200ms,CI 检查(仅增量)仅需 2s。
#### 2. 常见陷阱:Prettier 与 ESLint 的战争
即使到了 2026 年,Prettier 和 ESLint 的格式化冲突依然是新手的噩梦。你可能会遇到这样的情况:你保存了文件,ESLint 报错了,因为你用了单引号,但 Prettier 自动改成了双引号。
我们的解决方案:
使用 INLINECODE5a5d3aae 和 INLINECODEf9b6c3da。这实际上让 Prettier 成为 ESLint 的一个规则集,从而统一了行为。
npm i -D eslint-config-prettier eslint-plugin-prettier
配置集成(在 Flat Config 中):
import prettierConfig from ‘eslint-config-prettier‘;
export default [
// ...其他配置
// 1. 先应用 Prettier 插件
{
plugins: { prettier: prettierPlugin },
rules: {
‘prettier/prettier‘: ‘error‘,
},
},
// 2. 最后应用 Prettier 配置来禁用冲突的格式化规则
prettierConfig,
];
顺序至关重要:确保 INLINECODE2883d1d1 放在数组的最后,这样它才能覆盖掉之前配置中冲突的格式化规则(如 INLINECODE1b6e7f58 或 quotes)。
总结
ESLint 的配置是 React 项目工程化的地基。在 2026 年,我们构建这套体系的视角发生了变化:我们不再仅仅是为了让代码“好看”,而是为了构建一个 AI 可读、高性能、且符合 React Compiler 优化预期 的开发环境。
通过迁移到 Flat Config,我们获得了更好的可维护性和 AI 协同能力;通过精细化的规则调整,我们不仅规避了 React Compiler 的陷阱,还利用 Agentic AI 自动修复了大量琐碎的格式问题。记住,最好的配置不是最严格的配置,而是最适合你的团队协作流和工具链的配置。
希望这篇指南能帮助你在 2026 年构建出更加健壮的 React 应用!