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

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

团队里每个人代码风格都不一样------有人单引号有人双引号,有人两空格有人四空格,varlet 混用,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 识别 consoleprocess__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(要手动把 letconst

命令: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

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

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

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

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

错误现象 原因 处理方法
consoleno-undef 没设 languageOptions.globals languageOptions: { globals: globals.node }
let a = 1no-unused-vars 声明了没用 删掉或用上;--fix 修不了
let a = 1prefer-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

相关推荐
巴勒个啦1 小时前
ECharts 大屏开发实战:从布局设计到动画优化的完整流程
javascript
书中枫叶1 小时前
做了个「句拾」小程序,最难的不是业务,是字体
前端·javascript·vue.js
weixin_307779131 小时前
PHP 大文件上传:内存占用、超时与最佳实践
linux·服务器·开发语言·nginx·php
m0_527034331 小时前
异步任务审核系统设计:消息队列、超时重试与失败补偿
java·大数据·开发语言
FFF_634560232 小时前
简单的画板小工具,下载即用
前端·javascript·css
一朵好运莲2 小时前
智能体使用 Chrome DevTools MCP 调试浏览器
开发语言·javascript·react.js
秋田君2 小时前
QT_JSON文件操作
开发语言·qt·json
老赵的博客2 小时前
可维护性 可扩展性 可复用性
开发语言·c++
嘟嘟07172 小时前
Next.js 里 SSR、CSR 和水合到底差在哪?从一段待办代码说起
前端·后端·next.js