根本原因是未正确配置eslint.config.js:ESLint v9+强制要求该文件名且须用defineConfig包裹、明确files字段和languageOptions.globals,旧版.eslintrc.js默认不识别。

ESLint 装了但不报错,根本原因是没配对 eslint.config.js
VSCode 里装了 ESLint 插件、项目里也 npm install eslint --save-dev 了,但写个 const unused = 1 却没提示“未使用变量”——大概率是配置文件没生效,或者压根没生成正确格式的配置。
ESLint v9+ 强制要求用 eslint.config.js 或 eslint.config.mjs,旧版的 .eslintrc.js 默认不识别。运行 npx eslint --init 生成的往往是旧格式,直接删掉,手动生成新格式:
- 在项目根目录新建
eslint.config.js - 内容必须用
defineConfig包裹,不能直接module.exports = {...} -
files字段要明确写["**/*.js"],否则 Node 环境下require、__dirname这类变量不会被识别为合法全局 -
languageOptions.globals至少得包含globals.node(不是globals.browser)
node -v 能跑,但 VSCode 里 ESLint 报 Cannot find module 'eslint'
这是 VSCode 集成终端和插件加载路径不一致导致的。插件不走你 shell 的 $PATH,它只认当前工作区 node_modules/.bin 下的二进制,或你显式指定的 eslint.runtime。
- 先确认项目里真有
node_modules/eslint:运行npm ls eslint - 如果提示
peer dep missing,说明版本冲突,比如 Node 20+ 装了 ESLint 8.x,得升级:npm install eslint@latest --save-dev - VSCode 设置里搜
eslint.runtime,填绝对路径,例如/Users/you/project/node_modules/.bin/eslint(macOS/Linux)或C:\project\node_modules\.bin\eslint.cmd(Windows) - 别依赖全局安装的 ESLint,VSCode 插件默认不认
npm install -g eslint
console.log 被标红说 no-console,但 Node 项目就是要打日志
这是规则继承搞错了。很多模板(比如 eslint:recommended 或 standard)默认开启 no-console,但在 Node 脚本调试阶段完全没必要禁用。
- 在
eslint.config.js的 rules 里显式关掉:"no-console": "off" - 如果用了
extends: ["plugin:node/recommended"],它本身已处理process、__dirname等,但没动console,仍需手动关 - 别用
/* eslint-disable no-console */注释——那是掩盖问题,不是配置 - 想保留 warn 级别(比如生产环境禁止
console.debug),可用:"no-console": ["warn", { "allow": ["warn", "error"] }]
保存时自动修复失效,editor.codeActionsOnSave 没起作用
VSCode 的自动修复只响应“可安全修复”的规则,比如缩进、分号、引号;像 no-unused-vars 这种涉及语义的,ESLint 不敢自动删变量,必须手动处理。
- 检查设置里是否开了:
"editor.codeActionsOnSave": { "source.fixAll.eslint": true } - 确保该设置没被
[javascript]语言专属设置覆盖(Settings → Text Editor → Formatting → Format On Save) -
eslint.run必须设为"onSave",设成"onType"会导致频繁卡顿 - 如果用了 Prettier,
source.fixAll.eslint和source.fixAll.prettier别同时开,优先让 ESLint 做逻辑修复,Prettier 做格式清洗
真正容易被忽略的是:ESLint 插件只校验打开的文件,且只在校验通过的语法树上运行规则。如果 require('./xxx') 路径错了导致解析失败,整个文件就跳过检查——先让代码能跑,再谈规范。


















