eslint 配置在多项目中互相干扰,本质是 vscode 未按项目隔离加载规则:多根工作区下若子项目缺失 .eslintrc.,会回退至上层或用户级配置,导致规则错配;.vscode/settings.json 控制执行行为,.eslintrc. 定义规则本身,二者缺一不可;正确隔离需用 eslint.workingdirectories 或 profile 实现进程级隔离。

为什么 ESLint 配置在多项目中会互相干扰
不是插件没装对,是 VSCode 加载规则时根本没分清“哪个项目该用哪套配置”。它默认只认当前打开的文件夹根目录下的 .eslintrc.js 或 .eslintignore,但如果你用的是多根工作区(.code-workspace),而某个子项目没放自己的配置文件,VSCode 就会 fallback 到上层或用户级设置——结果就是 A 项目的 no-unused-vars 规则跑到了 B 项目里报错。
常见错误现象:
- 保存一个 TypeScript 文件,ESLint 突然提示 “Unexpected any” —— 可 B 项目压根没开
@typescript-eslint/no-explicit-any - 终端里跑
npx eslint .没问题,但 VSCode 里标红一堆,说明编辑器没读到项目级配置 - 打开两个同语言项目(比如两个 React 项目),一个用 Prettier + ESLint,另一个用 Ruff + Biome,结果格式化全乱套
.eslintrc.* 和 .vscode/settings.json 怎么分工
.eslintrc.* 是规则本身,.vscode/settings.json 是“让谁来执行、怎么执行”。前者必须放在项目根目录,后者也必须在同一级的 .vscode/ 下;两者缺一不可,且不能互相替代。
-
.eslintrc.js决定:启用哪些规则、解析器用什么、是否允许console.log -
.vscode/settings.json决定:eslint.enable是否开启、eslint.validate覆盖哪些语言、editor.defaultFormatter绑定哪个插件 - 如果
.vscode/settings.json里写了"eslint.enable": false,哪怕.eslintrc.js存在,VSCode 也不会启动校验 - 如果
.eslintrc.js里没写env: { "browser": true },但.vscode/settings.json里开了"eslint.validate": ["javascript"],那全局变量window还是会报错
多根工作区下 launch.json 和 ESLint 的 cwd 冲突
调试器和 Linter 共享同一个 cwd 字段语义,但用途完全不同:调试器用它找 node_modules,ESLint 用它找 package.json 和 node_modules/eslint。写错一个路径,两个都崩。
-
.code-workspace必须放在所有子项目的父目录,例如:/projects/my-workspace.code-workspace -
.vscode/launch.json必须和.code-workspace同级,即:/projects/.vscode/launch.json - 每个
configuration中的cwd必须用变量:"${workspaceFolder:frontend}",不能写"./frontend"或"frontend" - ESLint 不支持
workspaceFolder:变量,所以它的cwd靠eslint.workingDirectories控制,得这么写:"eslint.workingDirectories": [ {"mode": "auto"}, {"directory": "./backend", "changeProcessCWD": true}, {"directory": "./frontend", "changeProcessCWD": true} ]
Profile 比 .code-workspace 更适合强隔离场景
当两个项目不仅规则不同,连 Node 版本、ESLint 插件版本、甚至要不要启用 eslint-plugin-react-hooks 都冲突时,.code-workspace 已经扛不住了。这时候 Profile 才是真解法——它不共享 Extension Host 进程,也不共用环境变量快照。
- Profile 创建后,必须手动点击左下角 Profile 名 → Apply Profile to Folder,否则只是空壳
- 应用后,VSCode 会为该文件夹生成独立的
~/.vscode-profiles/xxx/目录,里面存扩展状态和设置快照 - 验证是否生效:打开终端,运行
which node和nvm current,结果应和该项目.nvmrc一致;再看设置编辑器右上角,必须显示 Profile 标签,不是 Workspace - Profile 不同步
.vscode/extensions.json的推荐列表,首次打开仍需手动启用dbaeumer.vscode-eslint等插件
真正容易被忽略的是:VSCode 的 ESLint 插件会在后台持续监听文件系统事件,哪怕你关掉了某个项目文件夹,只要它还在当前窗口的多根工作区里,对应的 eslint.server 进程就可能继续拉起并读取其 package.json。要彻底切断,只能移出工作区,或换用 Profile。











