五个提升代码质量的 ESLint 插件
你已经配置好了 ESLint。它能捕获未使用的变量并标记缺失的分号。但你的代码库仍在积累微妙的 bug、不一致的导入以及在代码审查中漏掉的可访问性问题。默认规则还不够。
ESLint 9 引入了扁平配置(flat config,eslint.config.js),取代了传统的 .eslintrc 格式。这一变化简化了插件集成,使配置更加可预测。无论你是已经迁移还是仍在使用旧格式,合适的插件都能将 ESLint 从基础检查器转变为真正的质量关卡。
以下是五个能解决现代前端项目实际问题的插件——而不会让你的工具链臃肿。
核心要点
- typescript-eslint 启用类型感知的代码检查,能捕获不安全的访问模式和被遗忘的
await语句 - eslint-plugin-import 通过验证路径、检测循环依赖和统一组织导入来强制执行模块规范
- eslint-plugin-unicorn 提供超过 100 条规则,推动使用现代 JavaScript 模式并防止微妙的 bug
- eslint-plugin-jsx-a11y 在 JSX 中的常见可访问性问题到达用户之前就将其捕获
- @eslint/css 将代码检查扩展到 JavaScript 之外,在统一的工作流中捕获样式表错误
typescript-eslint:TypeScript 项目的类型感知检查
@typescript-eslint 插件将 TypeScript 的类型系统引入你的代码检查工作流。与基础语法检查不同,类型感知规则能捕获需要理解代码类型才能发现的问题。
考虑一个可能返回 null 的函数。类型感知检查会标记不安全的访问模式,否则这些问题只能在生产环境中通过运行时错误暴露。像 no-floating-promises 这样的规则能捕获被遗忘的 await 语句,而 no-unnecessary-condition 能识别死代码分支。
对于大型代码库,typescript-eslint 提供了 Project Service,通过跨文件重用 TypeScript 的程序实例来提升性能。当在 CI 中检查数千个文件时,这一点很重要。
在扁平配置中,你可以直接导入插件并展开其推荐配置。使用标准的 typescript-eslint 工具链时,这种设置能与 ESLint 9 的扁平配置模型完美集成。
eslint-plugin-import:模块规范和导入组织
eslint-plugin-import 防止在不断增长的代码库中导入语句积累的混乱。
该插件在运行时之前捕获拼写错误的路径,确保命名导入与实际导出匹配,并标记导致微妙 bug 的循环依赖。其 no-extraneous-dependencies 规则防止导入未在 package.json 中列出的包——这是部署失败的常见原因。
import/order 规则强制执行一致的分组:首先是外部包,然后是内部模块,最后是相对导入。这种一致性使文件易于浏览,并在代码审查期间使差异更清晰。
对于团队来说,这个插件消除了关于导入组织的风格争论。配置一次,自动修复处理其余部分。
eslint-plugin-unicorn:固执己见的 Bug 预防
eslint-plugin-unicorn 提供超过 100 条规则,捕获微妙问题并强制执行现代 JavaScript 模式。
它会在 for...of 更清晰时标记 Array.forEach。它会捕获你本意是 Array.from({ length: 5 }) 时写的 new Array(5)。它会防止跳过清理处理程序的 process.exit() 调用。
该插件推动使用现代语法:优先使用 Array.includes() 而不是 indexOf() !== -1,建议使用 String.replaceAll() 而不是带全局标志的正则表达式,并标记过时的 Number 方法。
并非每条规则都适合每个团队。从推荐预设开始,然后禁用与你的代码库约定冲突的规则。
Discover how at OpenReplay.com.
eslint-plugin-jsx-a11y:JSX 可访问性检查
eslint-plugin-jsx-a11y 在可访问性问题到达用户之前就在 JSX 中捕获它们。
该插件标记没有 alt 属性的图片、没有可访问名称的按钮以及缺少标签的表单输入。它捕获破坏键盘导航的 autoFocus 使用,并识别非交互元素上的点击处理程序。
这些规则不能保证 WCAG 合规性——自动化工具大约能捕获 30% 的可访问性问题。但它们能防止最常见的错误,并在日常开发中建立可访问性意识。
对于发布面向用户应用的团队来说,这个插件至关重要。可访问性 bug 会影响真实用户,并在许多司法管辖区带来法律影响。
@eslint/css:超越 JavaScript 的代码检查
ESLint 现在已扩展到 JavaScript 之外。@eslint/css 插件为样式表带来静态分析,捕获语法错误并强制执行约定。
类似地,html-eslint 验证 HTML 结构,标记重复的 ID、缺失的 lang 属性和无效的嵌套。
这些插件对于包含 CSS 模块、HTML 模板或组件库的项目很重要,其中标记质量会影响渲染。它们在单一工具下统一你的代码检查工作流,而不需要单独的验证器。
关注点分离:代码检查 vs. 代码格式化
需要澄清一点:ESLint 处理代码质量,而非格式化。让 Prettier 管理分号、引号和缩进。使用 eslint-config-prettier 禁用与 Prettier 冲突的 ESLint 规则,然后分别运行两个工具。
这种分离使你的 ESLint 配置专注于捕获 bug,而不是强制执行风格偏好。
结论
这五个插件解决不同的问题:类型安全、导入规范、现代模式、可访问性和跨语言检查。逐步添加它们。首先启用推荐预设,然后在团队识别出摩擦点时自定义规则。
目标不是最大程度的严格性——而是在 bug 发布之前捕获真正的问题。
常见问题
ESLint 9 的扁平配置使用 JavaScript 模块而不是 JSON 或 YAML。从 eslint.config.js 导出一个配置对象数组。每个对象可以指定要定位的文件、要使用的插件和要应用的规则。ESLint 文档提供了迁移指南,大多数插件现在在其文档中包含扁平配置示例。
可以。这些插件针对不同的关注点,很少重叠。typescript-eslint 处理类型检查,eslint-plugin-import 管理模块,unicorn 强制执行模式,jsx-a11y 涵盖可访问性,@eslint/css 处理样式表。如果出现规则冲突,请在配置中禁用不太具体的规则。
typescript-eslint 的类型感知规则会增加开销,因为它们需要 TypeScript 的编译器。对于大型项目,启用 Project Service 以提升性能。其他插件增加的开销很小。使用 --cache 标志运行 ESLint 以跳过未更改的文件并加快重复运行速度。
不应该。从每个插件的推荐预设开始,其中包含经过实战检验的规则。监控团队的体验,并禁用那些在不捕获真正 bug 的情况下造成摩擦的规则。目标是实用的 bug 预防,而不是最大程度的严格性。
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.