👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名

本文没有正经开场白。今天是我第一次正式接触 ESLint,结果刚把代码交上去,就被一个"看不见的保安"当场抓包。它不说话,只报错,每一行都精准得让人头皮发麻。下面是我和这位"代码保安"的完整交锋记录。


先认识一下这位"保安"

先说结论:ESLint 是代码工程质量的重要保证,它强制团队写出一致风格的代码,严格检查代码里的潜在 bug。

arduino 复制代码
读着像是"代码风格检查工具"?
不,它更像一个"强迫症晚期 + 猎犬嗅觉"的纪律委员。

它不跑你的代码,但会用一套规则把你的代码"过一遍筛子"------哪一行不规范,它当场点名。


第一轮交锋:no-var,禁止 var

我的代码(差点写成):

javascript 复制代码
var name = "qxh";   // ❌ 如果这么写,当场被点名

ESLint 规则(eslint.config.mjs):

javascript 复制代码
rules: {
    "no-var": 2,      // 不能用 var!2 = error,直接报错
    ...
}

规则里的数字是什么意思?

数字 级别 含义
0 off 关掉,不管
1 warn 警告,不阻断
2 error 报错,必须改

"no-var": 2 意味着:谁写 var 谁就编译报错。

正确姿势:

javascript 复制代码
let name = "qxh";   // ✅ let 才符合规范

为什么禁 var? 老生常谈:var 没有块级作用域、会挂到 window 上污染全局、还会变量提升搞出各种诡异 bug。团队代码里禁掉它,等于从源头消灭一大类"灵异事件"。


第二轮交锋:quotessemi,双引号 + 分号

javascript 复制代码
rules: {
    "quotes": ["error", "double"],  // 必须用双引号
    "semi": ["error", "always"],    // 必须加分号
    ...
}

被点名现场:

javascript 复制代码
let name = 'qxh'    // ❌ 单引号 + 没分号,双重暴击
hello()             // ❌ 没分号

合规姿势:

javascript 复制代码
let name = "qxh";   // ✅ 双引号
hello();            // ✅ 有分号

为什么这么较真? 因为团队协作里,最消耗精力的往往不是算法难题,而是"为什么你写的代码和我写的不像一个人的"------统一引号、统一分号,代码看起来就像出自一人之手,review 起来毫无心理负担。


第三轮交锋:indent,缩进必须 2 格

javascript 复制代码
rules: {
    "indent": ["error", 2]   // 缩进必须 2 个空格
}

被点名现场:

javascript 复制代码
function hello() {
    console.log(name + "hello");  // ❌ 4 格缩进?报错!
}

合规姿势:

javascript 复制代码
function hello() {
  console.log(name + "hello");  // ✅ 2 格
}

写 4 格和写 2 格有区别吗? 对机器没有,但对团队有------十几个人各自按喜好缩进,代码就会变成"视觉灾难现场"。统一缩进,是维护代码可读性的底线。


第四轮交锋:no-console,警告但不阻断

javascript 复制代码
rules: {
    "no-console": 1   // 1 = warn,警告
}

为什么 console.log 也要管?

  • 开发时:console.log 是好帮手,打日志排查问题。
  • 上线后:一堆 console.log 留在生产环境,既暴露信息又不美观。

所以 ESLint 的态度是:警告(1),不报错(2)------你开发时可以打日志,但上线前要记得清掉。

这就像学校里的"口头警告":不记过,但你心里得有数。


完整配置一览

把我们被点名的所有规则汇总(eslint.config.mjs):

javascript 复制代码
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"],           // JS 官方推荐规则集
    languageOptions: { globals: globals.node },  // Node 环境全局变量
    rules: {
      "no-var": 2,                    // 禁 var(error)
      "no-console": 1,                // 禁 console(warn)
      "quotes": ["error", "double"],  // 双引号
      "semi": ["error", "always"],    // 必须有分号
      "indent": ["error", 2]          // 2 格缩进
    }
  },
  tseslint.configs.recommended,       // TS 官方推荐规则集
]);

配置的四个层次:

部分 作用
extends: ["js/recommended"] 引入 JS 官方推荐规则(白嫖)
tseslint.configs.recommended 引入 TS 官方推荐规则
languageOptions.globals 声明环境(Node 的全局变量不误报)
rules 自定义规则,覆盖团队约定

交锋结束:为什么团队一定要用 ESLint?

被"抓包"一下午,我的真实感受:

  1. 消灭潜在 bugno-var 这类规则直接封掉一类隐患。
  2. 统一代码风格:不管谁写的,看起来都像一个人写的。
  3. review 更轻松:reviewer 不用纠结"你为啥用单引号",只看逻辑。
  4. 新人快速上手:不规范?保存即报错,当场学会规范。

ESLint 不是限制你,是保护整个团队的代码不被"风格混沌"淹没。 它就像体检报告------看着烦,但能救命。


最后划个重点

面试官要是问"ESLint 是干嘛的、规则级别怎么分",记住三句话:

  • ESLint 是代码质量工具,强制团队一致风格 + 检查潜在 bug。
  • 规则级别:0 关闭 / 1 警告 / 2 报错。
  • 常用团队规则:no-varquotessemiindentno-console

本文所有代码示例均来自课堂学习资料,真实可运行。

相关推荐
搞个锤子哟1 小时前
vue项目引入icon的问题
前端
树上有只程序猿1 小时前
当低代码遇上AI,一个开发者的真实感悟
前端
郭邯1 小时前
从零手写一个 UA 解析工具:我用 AI 辅助开发,踩了这些坑
前端
oh,huoyuyan1 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
Heo1 小时前
怎么保证缓存和数据库一致性?
前端·后端·面试
摇曳的精灵2 小时前
前端渲染优化
前端·前端渲染优化
WILLF2 小时前
前端视角:Python requests vs JS axios
前端·python
半个落月2 小时前
在浏览器里运行 DeepSeek-R1:React 对话界面与安全渲染(三)
前端·人工智能·react.js
Synmbrf2 小时前
micro-app 404 问题排查与修复
前端