ESLint 开发问题总结
ESLint 配置不生效问题
捣乱的插件
现象: 无论怎么在 rules 里写 "error",终端和编辑器死活只显示 Warning(黄色),不报错(红色)。 原因:eslint-plugin-only-warn真相:
- 你的共享配置(
packages/eslint-config)里偷偷装了这个插件。 - 它的作用: 强制把所有 Error 降级为 Warning。
- 教训: 排查规则不生效时,先看看
package.json里有没有这种“全局修改型”的插件。
三大“隐形干扰源”
A. Next.js 的“溺爱”模式
- 现象: 终端运行
pnpm lint是 Warning,但你觉得应该是 Error。 - 原因:
next lint命令为了不阻断开发(Build),会自动把no-unused-vars等非致命错误降级为 Warning。 - 对策: 想要看真实的 ESLint 结果,请用原生命令:
npx eslint app/page.tsx。
B. VS Code 的“老旧记忆” (缓存)
- 现象: 终端 (
pnpm lint) 已经变红了(Error),但 VS Code 编辑器里还是黄的(Warning)。 - 原因: VS Code 的 ESLint 服务启动后会把配置加载到内存,你改了配置文件它不知道。
- 对策: 改完配置,必须
F1 -> Restart ESLint Server,甚至Reload Window。
C. Flat Config 的“权重游戏”
- 现象: 你的规则写了,但被别人的规则覆盖了。
- 原因: ESLint 9 (Flat Config) 严格遵循 “数组后发优势” 和 “文件范围优先级”。
- 对策:
- 想要覆盖规则?把你的对象放在数组的 最后面。
- 想要绝对霸权?加上
files: ["**/*.ts"]明确指定生效范围,权重更高。
Monorepo 的运作机制
问题: 为什么 App 能读到 Packages 里的配置?编辑器怎么知道要去哪里找?
- 物理连接 (Symlink): 包管理器 (pnpm) 会在
node_modules里创建软链接,指向packages/eslint-config。所以import ... from "@repo/..."实际上读的是你硬盘上的源码。 - 逻辑导航 (VS Code):
.vscode/settings.json里的"eslint.workingDirectories": [{ "mode": "auto" }]告诉编辑器:“别只看根目录,进到apps/web里去工作”。
终极调试口诀 (Cheatsheet)
下次再遇到 “配置了没生效” 的情况,按这个顺序查:
- 查插件: VS Code 装 ESLint 插件了吗?开启了吗?
- 查死活: 运行
npx eslint app/page.tsx。- 如果终端没报错:说明配置没写对,或者被
only-warn这种插件劫持了。 - 如果终端报错了:说明配置是对的,问题在编辑器。
- 如果终端没报错:说明配置没写对,或者被
- 查缓存:
F1 -> Restart ESLint Server。 - **查忽略:**是不是被
.next或dist目录挡住了?(检查ignores配置)。 - 查位置: 配置文件必须在项目根目录,不要为了整洁把它藏到子文件夹里。
**总结一句话:**代码配置 (config) 决定“判刑结果”,VS Code 插件决定“是否显示”,而命令行 (npx eslint) 才是永远不说谎的法官。