ESLint
可插拔的 JavaScript/TypeScript 代码检查工具,通过插件化架构支持多语言 Lint,npm 周下载量超 1.34 亿,前端工程化代码质量保障的行业标准。
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 |
| GitHub | eslint/eslint |
| License | MIT |
| 最新版本 | v10.6.0(2026 年 6 月) |
| 首个大版本 | v1.0(2015 年 7 月) |
| 创建者 | Nicholas C. Zakas |
| 主要维护者 | ESLint TSC(技术指导委员会),Nicholas C. Zakas 领导 |
| 开发语言 | JavaScript(99.4%) |
| npm 周下载量 | 1.34 亿+ |
| GitHub Stars | 27.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 起新增 extends、defineConfig() 等便捷 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 | 官方 |
| YAML | eslint-plugin-yml | 社区 |
4. MCP Server(AI 集成)
v9.26 起支持 Model Context Protocol,AI 工具可直接查询 ESLint 规则并自动遵守项目规范:
# 启动 ESLint MCP Server
npx @eslint/mcp5. 多线程 Lint(Multithreaded Linting)
2025 年引入多线程能力,利用多核 CPU 并行检查文件,大幅提升大项目的 lint 速度。
6. 自动修复(Auto-fix)
大量规则支持 --fix 自动修复。v10 进一步扩展了可自动修复的规则范围。
7. 批量抑制(Bulk Suppressions)
支持通过 --suppress-all 一次性抑制现有违规,方便增量采用新规则:
# 抑制所有当前违规,后续新增代码必须遵守规则
npx eslint src/ --suppress-all8. 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/js | ESLint 核心规则预设(recommended 等) |
@eslint/config-helpers | defineConfig、extends 等配置辅助 |
@eslint/css | CSS 语言插件 |
@eslint/json | JSON 语言插件 |
@eslint/markdown | Markdown 语言插件 |
typescript-eslint | TypeScript 解析与规则(含 @typescript-eslint/parser、@typescript-eslint/eslint-plugin) |
@html-eslint | HTML 语言插件 |
eslint-plugin-react | React JSX 规则 |
eslint-plugin-import | 导入/导出规则 |
eslint-plugin-react-hooks | React 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 github6. 增量代码规范迁移
批量抑制(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 githubPre-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 v10 | Oxlint v1.71 | Biome 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 做完整检查安全注意事项
- 插件供应链风险:ESLint 插件作为 npm 包在 Node.js 环境中执行,恶意插件可执行任意代码。选择高星、高维护频率的插件。
--fix安全:自动修复在极少数情况下可能改变代码语义,CI 中建议使用--fix-dry-run检查可修复数量。- 配置注入:Flat Config 使用 JavaScript 文件,
eslint.config.js中的代码在 Node.js 中执行,需注意配置来源的可信度。 - 已知漏洞:通过 Snyk 安全数据库 跟踪已知漏洞。
技术对比
ESLint vs Biome vs Oxlint
| 维度 | ESLint v10 | Biome v2.x | Oxlint v1.x |
|---|---|---|---|
| 实现语言 | JavaScript | Rust | Rust |
| 定位 | 可插拔 Lint 平台 | Lint + Format 一体 | 高性能 Linter |
| 性能 | 基准(1x) | 10-25x | 50-100x |
| 规则数量 | 3000+(含插件) | 200+(内置) | 800+(内置) |
| TypeScript | 需 typescript-eslint | 内置 | 内置 |
| 类型感知 Lint | 支持(需配置) | 有限支持 | 支持(tsgo) |
| 格式化 | 无(需配合 Prettier) | 内置 | 无(需配合 Oxfmt) |
| 插件生态 | 极其丰富 | 增长中 | 支持 ESLint JS 插件 |
| 多语言 | CSS/HTML/JSON/MD(语言插件) | 有限 | 有限 |
| 配置格式 | Flat Config(JS) | biome.json | oxlintrc.json |
| AI 集成 | MCP Server | 无 | 无 |
| 社区成熟度 | 最成熟(13年) | 快速增长 | 快速增长 |
| 适用场景 | 复杂/定制需求 | 一站式替代 | 极致性能 |
ESLint vs Prettier
| 维度 | ESLint | Prettier |
|---|---|---|
| 定位 | 代码质量检查 | 代码格式化 |
| 检查内容 | 逻辑错误、模式问题、最佳实践 | 缩进、引号、换行等格式 |
| 可定制性 | 高(数千条规则) | 低(少量选项) |
| 自动修复 | 部分规则支持 | 完全自动 |
| 协作方式 | 通过 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: { ... } }技术局限与边界
已知限制
- 性能瓶颈:基于 JavaScript 运行时,单线程执行,在大型项目中 lint 时间可达分钟级。虽然 v10 开始探索多线程,但与 Rust 工具链(Oxlint、Biome)仍有数量级差距。
- 配置复杂度:Flat Config 虽然比旧配置更直观,但多插件、多语言场景下的配置仍然繁琐。新手上手成本高于 Oxlint/Biome 的零配置方案。
- 插件依赖链长:完整配置通常需要安装多个包(
eslint+typescript-eslint+eslint-plugin-react+ ...),依赖树庞大。 - 格式化能力缺失:ESLint 不做格式化,必须配合 Prettier 或 Biome formatter。
- 类型感知性能开销:启用
projectService: true后,类型感知规则会显著增加内存和 CPU 消耗。 - 插件生态碎片化:数千个插件质量参差不齐,部分插件长期无人维护,与 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 中
ProgramAST 节点边界变更(包含完整文件文本),可能影响自定义规则。
学习资源
官方资源
- ESLint 官网 — 项目主页
- 官方文档 — 完整使用文档
- Flat Config 迁移指南 — 从
.eslintrc迁移 - v10.0.0 迁移指南 — v10 破坏性变更
- 规则列表 — 所有内置规则
- GitHub 仓库 — 源码与 Issue
官方博客
- ESLint v10.0.0 Released — v10 发布公告
- What's Coming in ESLint v10 — v10 预览
- ESLint 2025 Year in Review — 2025 年度总结
- Flat Config 新特性:extends、defineConfig — 配置增强
- ESLint HTML 语言插件发布 — HTML 支持
教程与指南
- ESLint 10 Flat Config 迁移完整指南(2026) — PkgPulse
- ESLint v10: Flat Config Completion and JSX Tracking — InfoQ
- Modern Linting in 2025: ESLint Flat Config with TypeScript — 实战教程
- ESLint Configs for Modern JavaScript Projects — 社区配置集合
- How to Set Up ESLint in 2026(Beginner's Guide) — 视频教程
技术文章
- Biome vs ESLint vs Oxlint 2026 — 三方对比
- ESLint vs Biome: JavaScript Linting Comparison 2026 — 详细对比
- ESLint is Now Language-Agnostic — 语言无关分析
- Support for CSS and Baseline in ESLint — web.dev 官方
社区与社交
- GitHub Discussions — 官方社区讨论
- ESLint Chat (Discord) — 实时交流
- Twitter/X @geteslint — 官方动态
- Reddit r/javascript — 社区讨论
- npm 包 — 包主页
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 新增 extends、defineConfig;v10.6 发布 |
社区活跃度
- npm 周下载量:1.34 亿+,位居 npm 下载量前列
- GitHub Stars:27.4k
- 贡献者:1,096+
- 财务:年收入约 $204k,支出约 $262k,112 位财务贡献者
- 企业赞助商:Automattic、Airbnb 等每年各赞助 $24,000
发展趋势
- 语言插件持续扩展:CSS、HTML、JSON、Markdown 已可用,更多语言正在探索中。ESLint 正从 JavaScript Linter 转型为语言无关的检查平台。
- AI 生态深度集成:MCP Server 使 AI 工具能感知项目规则,未来可能进一步与 AI 代码审查工具深度整合。
- 多线程性能优化:2025 年引入多线程能力,虽仍无法与 Rust 工具链匹敌,但大幅改善了大项目体验。
- Flat Config 生态成熟:v10.5 的
extends和defineConfig回应了社区对配置易用性的诉求,主流插件已基本完成适配。 - 异步架构重构:团队正在推进异步架构重构,为未来更深层的性能优化奠定基础。
竞争格局
面对 Oxlint 和 Biome 的强势崛起,ESLint 的核心竞争力在于:
- 无可比拟的插件生态(3000+ 规则)
- 语言插件带来的多语言扩展能力
- MCP Server 的 AI 集成先发优势
- 13 年积累的社区信任和工具链集成度
ESLint 不太可能在性能上追上 Rust 工具链,但其定位正从「最快的 Linter」转向「最灵活、最全面的代码检查平台」。在需要深度定制、框架集成和多语言支持的场景中,ESLint 仍是不可替代的选择。
相关资源: