ESLint flat config 配置实战:五大字段、规则严重级别与 --fix 能力边界详解

ESLint flat config 配置实战:五大字段、规则严重级别与 --fix 能力边界详解

团队里每个人代码风格都不一样------有人单引号有人双引号,有人两空格有人四空格,var 和 let 混用,console.log 满天飞。ESLint 就是来解决这个问题的。本文用 eslint-demo 项目真实配置讲清 flat config 的五大字段、规则严重级别 0/1/2 的含义、--fix 能修什么不能修什么,以及 index.mjs 里的代码到底会触发哪些规则。

技术栈:ESLint 10.8.1 + @eslint/js 10 + typescript-eslint 8.67 + globals 17.11,pnpm 管理。文中代码来自真实项目,运行未验证 (未实际 pnpm lint)。

文章目录

  • [ESLint flat config 配置实战:五大字段、规则严重级别与 --fix 能力边界详解](#ESLint flat config 配置实战:五大字段、规则严重级别与 --fix 能力边界详解)
    • [一、ESLint 解决什么:团队代码风格一致性 + 潜在 bug 检测](#一、ESLint 解决什么:团队代码风格一致性 + 潜在 bug 检测)
    • [二、flat config 五大字段:files / plugins / extends / languageOptions / rules](#二、flat config 五大字段:files / plugins / extends / languageOptions / rules)
    • [三、规则严重级别 0/1/2:error 报错、warn 警告、off 关闭](#三、规则严重级别 0/1/2:error 报错、warn 警告、off 关闭)
    • 四、五条自定义规则逐条解读
    • [五、--fix 能修什么不能修什么](#五、--fix 能修什么不能修什么)
    • [六、index.mjs 会触发哪些规则](#六、index.mjs 会触发哪些规则)
    • 七、收藏资产:排错表与配置速查表
      • [排错表:常见错误 → 原因 → 处理](#排错表:常见错误 → 原因 → 处理)
      • [flat config 五大字段速查表](#flat config 五大字段速查表)
      • 规则严重级别速记
      • [ESLint vs Prettier 分工](#ESLint vs Prettier 分工)
    • 总结与下一步

一、ESLint 解决什么:团队代码风格一致性 + 潜在 bug 检测

ESLint 是 JavaScript/TypeScript 的静态代码分析工具,在代码运行前就检查风格和潜在 bug。它解决两件事:

  1. 强制团队写出一致风格的代码------引号、分号、缩进统一
  2. 严格检查代码找出潜在 bug ------未用变量、var 滥用、console 残留

类比一下:ESLint 像代码的「语文老师」,既管标点格式(格式类规则),也管语法错误(逻辑类规则)。

二、flat config 五大字段:files / plugins / extends / languageOptions / rules

ESLint 9+ 用新的 flat config 格式,配置文件是 eslint.config.mjs,替代旧版 .eslintrc.js。核心结构是一个数组:

js 复制代码
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import { defineConfig } from "eslint/config";

export default defineConfig([
  {
    files: ["**/*.{js,mjs,cjs,ts,mts,cts}"],
    plugins: { js },
    extends: ["js/recommended"],
    languageOptions: { globals: globals.node },
    rules: {
      "no-var": 2,
      "no-console": 1,
      "quotes": ["error", "double"],
      "semi": ["error", "always"],
      "indent": ["error", 2],
    },
  },
  tseslint.configs.recommended,
]);

五大字段速查表:

字段 作用 示例
files 匹配哪些文件 ["**/*.{js,mjs,cjs,ts,mts,cts}"]
plugins 注册插件(对象形式) { js }
extends 继承规则集 ["js/recommended"]
languageOptions.globals 运行环境全局变量 globals.node
rules 自定义规则 {"no-var": 2}

关键点:

  • defineConfig 包裹一个数组,每个对象是一个配置块
  • tseslint.configs.recommended 单独作为数组的一项,给 TS 文件加规则
  • globals.node 让 ESLint 识别 console、process、__dirname 等 Node 全局变量,否则会误报 no-undef

三、规则严重级别 0/1/2:error 报错、warn 警告、off 关闭

这是 ESLint 面试高频考点。每条规则的严重级别有三种:

数字 字符串 含义 行为
2 'error' 报错 阻断,退出码非 0
1 'warn' 警告 提示但不阻断
0 'off' 关闭 不检查

两种写法等价,上面的配置里就混用了:

  • "no-var": 2 ------ 数字写法
  • "quotes": ["error", "double"] ------ 字符串写法

带参数的规则用数组:["error", "double"] 表示「报错 + 必须用双引号」。

记住一句话:2/1/0 对应 error/warn/off,掌握这一行就掌握了所有规则的严重级别设置方式。

四、五条自定义规则逐条解读

规则 值 严重级别 作用
no-var 2 error 禁用 var,强制 let/const
no-console 1 warn 禁用 console,开发时用上线后不用
quotes ["error", "double"] error 引号必须用双引号
semi ["error", "always"] error 必须加分号
indent ["error", 2] error 缩进用 2 个空格

为什么 no-console 只用 warn:开发时调试需要 console,但上线后不应残留。设成 warn 提醒但不阻断开发流程,体现了「严格但不死板」的工程权衡。

五、--fix 能修什么不能修什么

--fix 是 ESLint 的自动修复能力,但它有明确边界:

能自动修(格式类):

  • quotes(引号统一为双引号)
  • semi(补分号)
  • indent(缩进修正为 2 空格)

不能自动修(逻辑类):

  • no-unused-vars(变量声明了没用------要删掉或用上,ESLint 不敢替你决定)
  • no-var(要手动把 var 改成 let/const)
  • prefer-const(要手动把 let 改 const)

命令:pnpm lint:fix(即 eslint . --fix)。

为什么逻辑类修不了?因为「未用变量是该删还是该用上」「let 该不该改 const」需要人判断,ESLint 不敢擅自删你的代码。

六、index.mjs 会触发哪些规则

被 lint 的目标代码 index.mjs:

js 复制代码
let a = 1;
const name = "zhangsan";
function hello() {
  console.log("hello " + name);
}
hello();

基于配置的静态推断(运行未验证):

行 代码 触发规则 严重级别 来源
1 let a = 1; no-unused-vars(声明未用) error js/recommended
1 let a = 1; prefer-const(a 未修改应用 const) error js/recommended
4 console.log(...) no-console warn 自定义 rules

为什么 name、hello 不报?因为它们都被使用了(name 在第 4 行用,hello 在第 6 行调用)。

let a = 1 一行触发两条 error:既声明了没用(no-unused-vars),又该用 const 没用(prefer-const)。这是初学者最容易踩的坑。

七、收藏资产:排错表与配置速查表

排错表:常见错误 → 原因 → 处理

错误现象 原因 处理方法
console 报 no-undef 没设 languageOptions.globals 加 languageOptions: { globals: globals.node }
let a = 1 报 no-unused-vars 声明了没用 删掉或用上;--fix 修不了
let a = 1 报 prefer-const a 没被修改,应用 const 改成 const a = 1
CI/CD 部署被阻断 test 脚本 exit 1 或 lint 有 error 修 lint 错误或实现 test
引号/分号报错 风格规则 用 pnpm lint:fix 自动修

flat config 五大字段速查表

text 复制代码
files              → 匹配哪些文件(glob 模式)
plugins            → 装插件(提供规则能力)
extends            → 继承规则集(装能力 + 开预设规则)
languageOptions    → 运行环境(globals.node 等)
rules              → 自定义规则(覆盖或新增)

规则严重级别速记

text 复制代码
2 / 'error'  → 报错阻断(退出码非 0)
1 / 'warn'   → 警告提示(不阻断)
0 / 'off'    → 关闭不检查

ESLint vs Prettier 分工

工具 管 不管
ESLint 代码质量 + 潜在 bug + 风格一致性 纯格式美化
Prettier 纯格式化(换行、对齐美化) 代码逻辑、潜在 bug

两者有重叠(引号/分号),通常配合用:Prettier 管格式,ESLint 管逻辑。

总结与下一步

ESLint 的价值不在「又一个格式化工具」,而在于用 flat config 的数组式配置把「团队代码风格一致性」和「潜在 bug 检测」工程化。规则的严重级别 0/1/2 决定是阻断、警告还是放行,--fix 只能修格式类问题,逻辑类问题必须人工处理。

可迁移的判断 :写 ESLint 规则时,先问自己「这条规则是格式类还是逻辑类」------格式类可以放心设 error(反正 --fix 能修),逻辑类要谨慎(设 error 可能阻断开发,必要时用 warn 提醒)。

下一步:

  • 运行 pnpm lint 验证本文对 index.mjs 的推断
  • 运行 pnpm lint:fix 看哪些被自动修了
  • 给 eslint.config.mjs 加一条新规则(如 "no-unused-vars": 2)
  • 研究如何用 husky + lint-staged 把 ESLint 集成到 git hook

运行未验证:本文基于配置静态分析,未实际 pnpm lint。生产环境请以 ESLint 官方文档为准。


标签:ESLint, 代码规范, flat config, 前端工程化, Node.js

相关推荐
Circ.1 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
Csvn1 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_1 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt1 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
现任明教教主~2 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
JavaGuide2 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel3 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
Zhou1411363 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅3 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http