ESLint logo

ESLint

可插拔的 JavaScript/TypeScript 代码检查工具,通过插件化架构支持多语言 Lint,npm 周下载量超 1.34 亿,前端工程化代码质量保障的行业标准。

精选工具代码质量JavaScriptTypeScriptLinter

ESLint 是可插拔的 JavaScript/TypeScript 代码检查工具,通过插件化架构支持多语言 Lint,npm 周下载量超 1.34 亿,是前端工程化代码质量保障的行业标准。

ESLint

可插拔的 JavaScript/TypeScript 代码检查工具,通过插件化架构支持多语言 Lint,npm 周下载量超 1.34 亿,前端工程化代码质量保障的行业标准。

技术简介说明

ESLint 由 Nicholas C. Zakas 于 2013 年创建,是最早专注于 ECMAScript 标准合规性的可插拔静态代码分析工具。它的核心设计理念是「一切皆插件」——解析器、规则、格式化器都可以通过插件替换和扩展,这使得 ESLint 能够适配从浏览器前端到 Node.js 后端、从 JavaScript 到 TypeScript/JSX/CSS/JSON/Markdown 等几乎所有前端技术栈。

经过十余年发展,ESLint 已从一个单纯的 JavaScript Linter 演化为语言无关的代码检查平台。2024 年引入的语言插件(Language Plugins)机制使其可以 lint CSS、HTML、JSON、Markdown 等非 JavaScript 语言;2025 年发布 MCP Server 接入 AI 生态;2026 年 2 月发布的 v10 大版本彻底移除旧配置系统、全面拥抱 Flat Config,标志着 ESLint 进入全新的架构时代。

截至 2026 年中,ESLint 在 npm 上周下载量超过 1.34 亿,拥有 27.4k GitHub Stars、1,096 位贡献者,是 JavaScript 生态中使用最广泛的代码质量工具。

基本信息

属性说明
官网https://eslint.org
GitHubeslint/eslint
LicenseMIT
最新版本v10.6.0(2026 年 6 月)
首个大版本v1.0(2015 年 7 月)
创建者Nicholas C. Zakas
主要维护者ESLint TSC(技术指导委员会),Nicholas C. Zakas 领导
开发语言JavaScript(99.4%)
npm 周下载量1.34 亿+
GitHub Stars27.4k
贡献者数量1,096+
总发布版本385+
Node.js 要求v20.19.0+(v10 起)
支持语言JavaScript、JSX、TypeScript、CSS、HTML、JSON、Markdown

快速上手

安装

ESLint v10 要求 Node.js >= 20.19.0:

# 使用 npm
npm install -D eslint
 
# 使用 pnpm
pnpm add -D eslint
 
# 使用 yarn
yarn add -D eslint
 
# 初始化配置(交互式向导)
npx eslint --init
# 或
npm init @eslint/config

基础配置

ESLint v10 仅支持 Flat Config 格式(eslint.config.js),旧的 .eslintrc 已被完全移除:

// eslint.config.js
import js from '@eslint/js'
import tseslint from 'typescript-eslint'
import reactPlugin from 'eslint-plugin-react'
 
export default [
  // 全局忽略
  {
    ignores: ['dist/**', 'node_modules/**', 'coverage/**']
  },
 
  // 推荐规则
  js.configs.recommended,
 
  // TypeScript 支持
  ...tseslint.configs.recommended,
 
  // React 支持
  {
    files: ['**/*.{js,jsx,ts,tsx}'],
    plugins: {
      react: reactPlugin
    },
    languageOptions: {
      ecmaVersion: 'latest',
      sourceType: 'module',
      parserOptions: {
        ecmaFeatures: { jsx: true }
      }
    },
    rules: {
      'react/jsx-uses-react': 'error',
      'no-unused-vars': 'warn',
      'no-console': 'warn',
      'eqeqeq': ['error', 'always']
    }
  }
]

最小示例

// eslint.config.js — 最小可运行配置
import js from '@eslint/js'
 
export default [
  js.configs.recommended,
  {
    rules: {
      'no-unused-vars': 'warn',
      'no-undef': 'error'
    }
  }
]
# 运行 ESLint
npx eslint src/
 
# 自动修复
npx eslint src/ --fix
 
# 输出 JSON 格式
npx eslint src/ --format json
// 示例:有问题的代码 (example.js)
var unused = 1       // no-unused-vars → warning
undeclaredVar = 2    // no-undef → error

核心概念与架构

整体架构

┌──────────────────────────────────────────────────────┐
│                    ESLint 架构                         │
├──────────────────────────────────────────────────────┤
│                                                      │
│  ┌────────────┐   ┌────────────┐   ┌─────────────┐ │
│  │  Config    │   │  Language  │   │   Plugin    │ │
│  │  (Flat     │   │  Plugins   │   │   System    │ │
│  │   Config)  │   │  JS/TS/    │   │  Rules/     │ │
│  │            │   │  CSS/HTML/ │   │  Processors │ │
│  │            │   │  JSON/MD   │   │             │ │
│  └──────┬─────┘   └──────┬─────┘   └──────┬──────┘ │
│         │                │                 │        │
│         └────────┬───────┴────────┬────────┘        │
│                  ▼                ▼                  │
│           ┌──────────┐   ┌──────────────┐           │
│           │  Linter  │   │   CLIEngine  │           │
│           │ (核心引擎)│   │  (CLI 入口)  │           │
│           └────┬─────┘   └──────┬───────┘           │
│                │                │                    │
│                ▼                ▼                    │
│           ┌──────────┐   ┌──────────────┐           │
│           │  Parser  │   │  Formatter   │           │
│           │  (AST    │   │  (输出报告)  │           │
│           │   解析)  │   │             │           │
│           └──────────┘   └──────────────┘           │
│                                                      │
│  ┌──────────────────────────────────────────────┐   │
│  │              MCP Server (v9.26+)              │   │
│  │        AI 模型上下文协议集成                    │   │
│  └──────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────┘

关键概念

Flat Config(扁平配置)

v10 中唯一的配置格式,使用 JavaScript 数组替代 .eslintrc 的级联合并。每个配置对象独立作用于匹配的文件,消除了旧配置中复杂的优先级和覆盖规则:

// 扁平配置核心结构
export default [
  { ignores: ['dist/**'] },          // 全局忽略
  { files: ['**/*.js'], rules: {} }, // 针对 JS 文件
  { files: ['**/*.ts'], rules: {} }, // 针对 TS 文件
]

语言插件(Language Plugins)

v9/v10 引入的核心架构变化,将语言解析能力从 ESLint 核心解耦。每种语言由独立的语言插件提供解析能力:

// 多语言配置示例
import js from '@eslint/js'
import css from '@eslint/css'
import json from '@eslint/json'
import markdown from '@eslint/markdown'
 
export default [
  js.configs.recommended,
  {
    files: ['**/*.css'],
    language: 'css/css',
    plugins: { css },
    rules: { 'css/no-empty-blocks': 'error' }
  },
  {
    files: ['**/*.json'],
    language: 'json/json',
    plugins: { json },
    rules: { 'json/no-duplicate-keys': 'error' }
  }
]

规则(Rules)与插件(Plugins)

规则是 ESLint 的基本检查单元,插件是规则的容器。v10 中插件以对象形式注册:

{
  plugins: {
    'my-plugin': {
      rules: {
        'my-rule': {
          create(context) {
            return {
              Identifier(node) {
                if (node.name === 'badName') {
                  context.report({
                    node,
                    message: '禁止使用 badName'
                  })
                }
              }
            }
          }
        }
      }
    }
  }
}

Processor(预处理器)

从非 JavaScript 文件中提取 JavaScript 代码块进行检查,如 Markdown 中的 JS 代码块、Vue SFC 中的 <script> 部分。

核心特性

1. 极致的可插拔架构

一切能力都通过插件提供——解析器、规则、处理器、格式化器均可替换。社区生态提供了数千个插件覆盖几乎所有框架和场景。

2. Flat Config(扁平配置系统)

v10 完全移除旧 .eslintrc,采用 JavaScript 原生的扁平配置格式。v10.5 起新增 extendsdefineConfig() 等便捷 API:

import { defineConfig } from 'eslint/config'
 
export default defineConfig([
  { extends: ['eslint:recommended'] },
  { files: ['**/*.ts'], rules: { 'no-unused-vars': 'warn' } }
])

3. 多语言支持(Language Plugins)

通过语言插件支持 JavaScript 之外的语言,一套工具检查全项目代码:

语言插件包状态
CSS@eslint/css官方
HTML@html-eslint官方(2025 年 5 月发布)
JSON@eslint/json官方
Markdown@eslint/markdown官方
YAMLeslint-plugin-yml社区

4. MCP Server(AI 集成)

v9.26 起支持 Model Context Protocol,AI 工具可直接查询 ESLint 规则并自动遵守项目规范:

# 启动 ESLint MCP Server
npx @eslint/mcp

5. 多线程 Lint(Multithreaded Linting)

2025 年引入多线程能力,利用多核 CPU 并行检查文件,大幅提升大项目的 lint 速度。

6. 自动修复(Auto-fix)

大量规则支持 --fix 自动修复。v10 进一步扩展了可自动修复的规则范围。

7. 批量抑制(Bulk Suppressions)

支持通过 --suppress-all 一次性抑制现有违规,方便增量采用新规则:

# 抑制所有当前违规,后续新增代码必须遵守规则
npx eslint src/ --suppress-all

8. JSX 作用域追踪

v10 新增 JSX 标签作为变量引用进行追踪,修正了之前导入组件作用域评估的缺陷。

9. 配置发现优化

v10 改进了配置文件的查找逻辑——从被 lint 文件所在目录开始向上查找,而非从工作目录开始,改善了 monorepo 场景的体验。

10. 原生 TypeScript 类型定义

v10 在 parser 和 scope 包中内置了 TypeScript 类型定义,无需额外安装 @types/*

生态图

┌──────────────────────────────────────────────────────────────┐
│                     ESLint 生态系统                            │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─── 核心层 ─────────────────────────────────────────────┐ │
│  │  eslint (v10.6.0)                                      │ │
│  │  @eslint/js — 核心规则预设                               │ │
│  │  @eslint/config-helpers — defineConfig / extends       │ │
│  └────────────────────────────────────────────────────────┘ │
│                                                              │
│  ┌─── 语言插件 ───────────────────────────────────────────┐ │
│  │  @eslint/css       @eslint/json      @eslint/markdown  │ │
│  │  @html-eslint      eslint-plugin-yml                   │ │
│  └────────────────────────────────────────────────────────┘ │
│                                                              │
│  ┌─── 框架/库集成 ────────────────────────────────────────┐ │
│  │  typescript-eslint   eslint-plugin-react               │ │
│  │  eslint-plugin-vue   eslint-plugin-next                │ │
│  │  eslint-plugin-svelte eslint-plugin-astro              │ │
│  │  eslint-plugin-node  eslint-plugin-import              │ │
│  │  eslint-plugin-react-hooks  eslint-plugin-jsx-a11y    │ │
│  │  eslint-plugin-testing-library                         │ │
│  └────────────────────────────────────────────────────────┘ │
│                                                              │
│  ┌─── 预设/配置 ──────────────────────────────────────────┐ │
│  │  eslint-config-prettier    @vercel/style-guide         │ │
│  │  eslint-config-airbnb      @typescript-eslint          │ │
│  │  eslint-config-standard    eslint-config-next          │ │
│  │  @antfu/eslint-config      eslint-flat-config (社区)   │ │
│  └────────────────────────────────────────────────────────┘ │
│                                                              │
│  ┌─── AI 与工具链 ────────────────────────────────────────┐ │
│  │  @eslint/mcp (MCP Server)                              │ │
│  │  VS Code ESLint 扩展                                    │ │
│  │  GitHub Actions / CI 集成                               │ │
│  └────────────────────────────────────────────────────────┘ │
│                                                              │
│  ┌─── 格式化配合 ─────────────────────────────────────────┐ │
│  │  eslint-config-prettier — 关闭与 Prettier 冲突的规则    │ │
│  │  eslint-plugin-prettier — 将 Prettier 作为 ESLint 规则  │ │
│  │  prettier — 独立代码格式化工具                           │ │
│  └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘

关键依赖

包名作用
@eslint/jsESLint 核心规则预设(recommended 等)
@eslint/config-helpersdefineConfigextends 等配置辅助
@eslint/cssCSS 语言插件
@eslint/jsonJSON 语言插件
@eslint/markdownMarkdown 语言插件
typescript-eslintTypeScript 解析与规则(含 @typescript-eslint/parser@typescript-eslint/eslint-plugin
@html-eslintHTML 语言插件
eslint-plugin-reactReact JSX 规则
eslint-plugin-import导入/导出规则
eslint-plugin-react-hooksReact Hooks 规则

适用场景

1. 企业级 JavaScript/TypeScript 项目

ESLint 的插件化架构和海量规则是大型项目代码质量保障的首选。配合 typescript-eslint 可实现深度类型感知检查:

import tseslint from 'typescript-eslint'
 
export default [
  ...tseslint.configs.strictTypeChecked,
  {
    languageOptions: {
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname
      }
    }
  }
]

2. 多语言统一检查

通过语言插件,用一套工具同时检查 JS/TS/CSS/JSON/Markdown:

import js from '@eslint/js'
import css from '@eslint/css'
import json from '@eslint/json'
 
export default [
  js.configs.recommended,
  { files: ['**/*.css'], language: 'css/css', plugins: { css } },
  { files: ['**/*.json'], language: 'json/json', plugins: { json } }
]

3. React / Vue / Next.js 框架项目

丰富的框架插件提供针对性的规则支持:

// React + TypeScript + Next.js 配置
import reactPlugin from 'eslint-plugin-react'
import hooksPlugin from 'eslint-plugin-react-hooks'
 
export default [
  {
    files: ['**/*.{js,jsx,ts,tsx}'],
    plugins: { react: reactPlugin, 'react-hooks': hooksPlugin },
    rules: {
      'react-hooks/rules-of-hooks': 'error',
      'react-hooks/exhaustive-deps': 'warn',
      'react/no-unescaped-entities': 'error'
    }
  }
]

4. Monorepo 项目

v10 的配置发现从被 lint 文件所在目录开始查找,天然适配 monorepo:

// packages/app-a/eslint.config.js
import baseConfig from '../../eslint.config.base.js'
 
export default [
  ...baseConfig,
  {
    rules: {
      // app-a 特有规则覆盖
    }
  }
]

5. CI/CD 质量门禁

结合批量抑制和多线程能力,在 CI 中高效执行代码检查:

# GitHub Actions
- name: Lint
  run: npx eslint src/ --max-warnings 0 --format github

6. 增量代码规范迁移

批量抑制(Bulk Suppressions)允许团队对存量代码「冻结」现有违规,只对新增代码执行规则:

npx eslint src/ --suppress-all
# 之后只有新引入的违规会报错

7. AI 辅助开发集成

通过 MCP Server,AI 代码助手可以感知项目规则并自动遵守:

# 在 Claude Code、Cursor 等 AI 工具中配置 ESLint MCP
npx @eslint/mcp

开发与工程化

完整配置示例(生产项目)

// eslint.config.js
import js from '@eslint/js'
import tseslint from 'typescript-eslint'
import reactPlugin from 'eslint-plugin-react'
import hooksPlugin from 'eslint-plugin-react-hooks'
import importPlugin from 'eslint-plugin-import'
import css from '@eslint/css'
import json from '@eslint/json'
import { defineConfig } from 'eslint/config'
 
export default defineConfig([
  // 全局忽略
  { ignores: ['dist/**', 'node_modules/**', 'coverage/**', '*.config.*'] },
 
  // 基础推荐规则
  js.configs.recommended,
 
  // TypeScript 严格检查
  ...tseslint.configs.strictTypeChecked.map(config => ({
    ...config,
    files: ['**/*.{ts,tsx}']
  })),
 
  // React 规则
  {
    files: ['**/*.{js,jsx,ts,tsx}'],
    plugins: {
      react: reactPlugin,
      'react-hooks': hooksPlugin,
      import: importPlugin
    },
    languageOptions: {
      ecmaVersion: 'latest',
      sourceType: 'module',
      parserOptions: {
        ecmaFeatures: { jsx: true },
        projectService: true,
        tsconfigRootDir: import.meta.dirname
      }
    },
    settings: {
      react: { version: 'detect' }
    },
    rules: {
      // 代码质量
      'no-unused-vars': 'off',
      '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
      '@typescript-eslint/consistent-type-imports': 'error',
 
      // React
      'react/jsx-uses-react': 'off', // React 17+ JSX Transform
      'react-hooks/rules-of-hooks': 'error',
      'react-hooks/exhaustive-deps': 'warn',
 
      // 导入
      'import/order': ['error', { 'newlines-between': 'always' }],
    }
  },
 
  // CSS 检查
  {
    files: ['**/*.css'],
    language: 'css/css',
    plugins: { css },
    rules: {
      'css/no-empty-blocks': 'error',
      'css/no-invalid-double-slash-comments': 'error'
    }
  },
 
  // JSON 检查
  {
    files: ['**/*.json'],
    language: 'json/json',
    plugins: { json },
    rules: {
      'json/no-duplicate-keys': 'error'
    }
  },
 
  // 测试文件宽松规则
  {
    files: ['**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'],
    rules: {
      '@typescript-eslint/no-explicit-any': 'off',
      'no-console': 'off'
    }
  }
])

package.json 集成

{
  "scripts": {
    "lint": "eslint src/",
    "lint:fix": "eslint src/ --fix",
    "lint:ci": "eslint src/ --max-warnings 0 --format github",
    "typecheck": "tsc --noEmit",
    "quality": "pnpm typecheck && pnpm lint:ci"
  }
}

CI/CD 集成

# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
 
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - run: npm ci
      - run: npx eslint src/ --max-warnings 0 --format github

Pre-commit Hook

// lint-staged.config.js
export default {
  '*.{js,jsx,ts,tsx}': ['eslint --fix'],
  '*.css': ['eslint --fix'],
  '*.json': ['eslint --fix']
}

Turborepo 集成

// turbo.json
{
  "tasks": {
    "lint": {
      "inputs": ["src/**/*.ts", "src/**/*.tsx", "eslint.config.js"]
    }
  }
}

性能与安全

性能特点

ESLint 基于 JavaScript 运行时,单线程执行,性能是其主要短板:

维度说明
执行模型单线程(v10 开始探索多线程)
解析速度依赖 Espree/SWC 等解析器
大项目表现文件数 > 1000 时明显变慢
增量分析通过缓存(--cache)部分缓解

实际性能对比(社区基准数据):

项目规模ESLint v10Oxlint v1.71Biome v2.x
小型(~100 文件)~3s~0.05s~0.1s
中型(~1000 文件)~30s~0.5s~1s
大型(~10000 文件)~5min+~3s~5s

性能优化建议

# 1. 启用缓存(仅检查变更文件)
npx eslint src/ --cache --cache-location .eslintcache
 
# 2. 使用 --cache-strategy content(基于内容而非时间戳)
npx eslint src/ --cache --cache-strategy content
 
# 3. 利用多线程(v10 新增能力)
# ESLint 2025 年引入多线程 lint 能力,多核 CPU 可获显著加速
 
# 4. 缩小检查范围
# 在配置中精确指定 files 和 ignores
 
# 5. 搭配 Oxlint 做快速扫描
# 日常开发用 Oxlint 快速反馈,CI 用 ESLint 做完整检查

安全注意事项

  1. 插件供应链风险:ESLint 插件作为 npm 包在 Node.js 环境中执行,恶意插件可执行任意代码。选择高星、高维护频率的插件。
  2. --fix 安全:自动修复在极少数情况下可能改变代码语义,CI 中建议使用 --fix-dry-run 检查可修复数量。
  3. 配置注入:Flat Config 使用 JavaScript 文件,eslint.config.js 中的代码在 Node.js 中执行,需注意配置来源的可信度。
  4. 已知漏洞:通过 Snyk 安全数据库 跟踪已知漏洞。

技术对比

ESLint vs Biome vs Oxlint

维度ESLint v10Biome v2.xOxlint v1.x
实现语言JavaScriptRustRust
定位可插拔 Lint 平台Lint + Format 一体高性能 Linter
性能基准(1x)10-25x50-100x
规则数量3000+(含插件)200+(内置)800+(内置)
TypeScripttypescript-eslint内置内置
类型感知 Lint支持(需配置)有限支持支持(tsgo)
格式化无(需配合 Prettier)内置无(需配合 Oxfmt)
插件生态极其丰富增长中支持 ESLint JS 插件
多语言CSS/HTML/JSON/MD(语言插件)有限有限
配置格式Flat Config(JS)biome.jsonoxlintrc.json
AI 集成MCP Server
社区成熟度最成熟(13年)快速增长快速增长
适用场景复杂/定制需求一站式替代极致性能

ESLint vs Prettier

维度ESLintPrettier
定位代码质量检查代码格式化
检查内容逻辑错误、模式问题、最佳实践缩进、引号、换行等格式
可定制性高(数千条规则)低(少量选项)
自动修复部分规则支持完全自动
协作方式通过 eslint-config-prettier 关闭冲突规则独立运行

选型建议

  • 需要深度定制、框架集成、多语言支持 → ESLint
  • 新项目、想要 lint + format 一站式 → Biome
  • 超大仓库、性能优先 → Oxlint(配合 ESLint 做补充检查)
  • ESLint + Oxlint 组合:日常用 Oxlint 快速反馈,CI 用 ESLint 做完整检查,是目前大型项目的最佳实践之一

最佳实践

1. 从 eslint:recommended 起步

不要一开始就启用所有规则,从推荐预设开始逐步增加:

import js from '@eslint/js'
 
export default [
  js.configs.recommended,
  // 逐步添加更多规则
]

2. 配合 Prettier 的正确方式

使用 eslint-config-prettier 关闭 ESLint 中与 Prettier 冲突的规则,不要用 eslint-plugin-prettier(将 Prettier 作为 ESLint 规则运行会降低性能):

import eslintConfigPrettier from 'eslint-config-prettier'
 
export default [
  // ...其他配置
  eslintConfigPrettier // 放在最后,关闭冲突规则
]

3. 严格的 TypeScript 检查

使用 typescript-eslint 的严格预设获得最佳 TypeScript 检查效果:

import tseslint from 'typescript-eslint'
 
export default [
  ...tseslint.configs.strictTypeChecked,
  {
    languageOptions: {
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname
      }
    }
  }
]

4. 增量采用新规则

利用批量抑制避免一次性修复所有违规:

# 1. 启用新规则
# 2. 抑制现有违规
npx eslint src/ --suppress-all
# 3. 后续新代码必须遵守规则

5. 配置复用与 extends

v10.5 起 extends 回到 flat config,方便复用配置:

import { defineConfig } from 'eslint/config'
 
export default defineConfig([
  { extends: ['eslint:recommended'] },
  {
    files: ['**/*.ts'],
    extends: ['plugin:@typescript-eslint/recommended']
  }
])

6. 避免常见陷阱

// ❌ 错误:在 flat config 中使用旧语法
// module.exports = { rules: {} }
 
// ✅ 正确:使用 ESM 导出
export default [{ rules: {} }]
 
// ❌ 错误:忘记在 parserOptions 中启用 jsx
// parserOptions: {}
 
// ✅ 正确
// languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } } }
 
// ❌ 错误:忽略 files 字段导致规则应用于所有文件
// { rules: { 'react/jsx-uses-react': 'error' } }
 
// ✅ 正确:指定文件匹配范围
// { files: ['**/*.{js,jsx,ts,tsx}'], rules: { ... } }

技术局限与边界

已知限制

  1. 性能瓶颈:基于 JavaScript 运行时,单线程执行,在大型项目中 lint 时间可达分钟级。虽然 v10 开始探索多线程,但与 Rust 工具链(Oxlint、Biome)仍有数量级差距。
  2. 配置复杂度:Flat Config 虽然比旧配置更直观,但多插件、多语言场景下的配置仍然繁琐。新手上手成本高于 Oxlint/Biome 的零配置方案。
  3. 插件依赖链长:完整配置通常需要安装多个包(eslint + typescript-eslint + eslint-plugin-react + ...),依赖树庞大。
  4. 格式化能力缺失:ESLint 不做格式化,必须配合 Prettier 或 Biome formatter。
  5. 类型感知性能开销:启用 projectService: true 后,类型感知规则会显著增加内存和 CPU 消耗。
  6. 插件生态碎片化:数千个插件质量参差不齐,部分插件长期无人维护,与 v10 不兼容。

不适合的场景

  • 极致性能要求的超大仓库:应考虑 Oxlint 或 Biome,或将 ESLint 与 Oxlint 组合使用
  • 纯格式化需求:直接用 Prettier 或 Biome
  • 嵌入式/资源受限环境:Node.js 运行时要求不适合嵌入式场景
  • 非 JavaScript 为主的 monorepo:如果主要代码不是 JS/TS,ESLint 的优势不明显

迁移注意事项

  • .eslintrc 迁移到 Flat Config:v10 完全移除了旧配置支持,必须迁移。可使用 @eslint/migrate-config 工具辅助。
  • Node.js 版本要求:v10 要求 Node.js >= 20.19.0,需确认 CI 和本地环境兼容。
  • 插件兼容性:部分旧插件可能尚未适配 Flat Config,迁移前需逐一确认。
  • 解析器变更:v10 中 Program AST 节点边界变更(包含完整文件文本),可能影响自定义规则。

学习资源

官方资源

官方博客

教程与指南

技术文章

社区与社交

2026 年现状

版本状态

截至 2026 年 7 月,ESLint 最新版本为 v10.6.0(2026 年 6 月 26 日发布),保持了稳定的迭代节奏。v10 系列已完成从旧配置系统到 Flat Config 的全面过渡。

里程碑事件

时间事件
2025 年 5 月v9.26 发布 MCP Server,接入 AI 生态
2025 年 5 月HTML 语言插件正式发布
2025 年 6 月v9.29 — 最后一个 v9 minor 版本
2025 年 10 月v10.0.0 预览公布
2025 年多线程 Lint 能力引入
2026 年 1 月2025 年度总结发布
2026 年 2 月v10.0.0 正式发布,移除 .eslintrc
2026 年 3 月v10.0.3 补丁发布
2026 年 6 月v10.5 新增 extendsdefineConfig;v10.6 发布

社区活跃度

  • npm 周下载量:1.34 亿+,位居 npm 下载量前列
  • GitHub Stars:27.4k
  • 贡献者:1,096+
  • 财务:年收入约 $204k,支出约 $262k,112 位财务贡献者
  • 企业赞助商:Automattic、Airbnb 等每年各赞助 $24,000

发展趋势

  1. 语言插件持续扩展:CSS、HTML、JSON、Markdown 已可用,更多语言正在探索中。ESLint 正从 JavaScript Linter 转型为语言无关的检查平台。
  2. AI 生态深度集成:MCP Server 使 AI 工具能感知项目规则,未来可能进一步与 AI 代码审查工具深度整合。
  3. 多线程性能优化:2025 年引入多线程能力,虽仍无法与 Rust 工具链匹敌,但大幅改善了大项目体验。
  4. Flat Config 生态成熟:v10.5 的 extendsdefineConfig 回应了社区对配置易用性的诉求,主流插件已基本完成适配。
  5. 异步架构重构:团队正在推进异步架构重构,为未来更深层的性能优化奠定基础。

竞争格局

面对 Oxlint 和 Biome 的强势崛起,ESLint 的核心竞争力在于:

  • 无可比拟的插件生态(3000+ 规则)
  • 语言插件带来的多语言扩展能力
  • MCP Server 的 AI 集成先发优势
  • 13 年积累的社区信任和工具链集成度

ESLint 不太可能在性能上追上 Rust 工具链,但其定位正从「最快的 Linter」转向「最灵活、最全面的代码检查平台」。在需要深度定制、框架集成和多语言支持的场景中,ESLint 仍是不可替代的选择。


相关资源: