eslint/prettier规则“越界”生效是因为vscode默认从工作区根目录加载配置,若打开子目录文件却未正确设置eslint.workingdirectories或配置文件未加root:true,eslint会向上查找并应用父级规则;prettier则依赖逐级向上查找配置,需在目标目录放含"root":true的.prettierrc才能限定作用域;且必须以项目根目录方式启动vscode(code .),否则.vscode/settings.json等配置不生效。

为什么 ESLint / Prettier 规则会“越界”生效
VSCode 本身不执行纠错,它只是把 eslint、prettier 等工具的输出结果展示出来。规则是否生效,取决于这些工具在哪个路径下被调用、读取了哪些配置文件。常见错误是:项目根目录有 .eslintrc.cjs,但你打开的是子目录(比如 ./packages/ui),VSCode 却仍从根目录加载规则——导致本不该检查的文件也被标红。
让 ESLint 只作用于指定目录的实操方式
核心思路是:让 ESLint 启动时只扫描目标目录,并且只读取该目录下的配置(或显式禁用父级配置)。关键靠两个机制:
-
eslint --cwd <target-dir></target-dir>:强制 ESLint 把<target-dir></target-dir>当作工作目录,只在此目录及其子目录下查找配置和源码 -
root: true放在目标目录的.eslintrc.cjs中:阻止 ESLint 继续向上查找父级配置 - VSCode 的
eslint.workingDirectories设置必须显式列出目标目录,否则插件默认只用工作区根目录
例如,只想让 src/client/ 下的 TS 文件受 ESLint 约束:
{
"eslint.workingDirectories": [
"./src/client"
]
}
注意:这个设置要写在项目根目录的 .vscode/settings.json 里,不是用户级设置。
Prettier 规则隔离更依赖 .prettierrc 位置与 glob 匹配
Prettier 没有内置“作用域目录”概念,它靠两层过滤:
- 配置文件查找:Prettier 会从当前文件路径逐级向上找
.prettierrc,直到遇到含root: true的配置才停止;所以把.prettierrc放进src/client/并加"root": true,就能锁死作用范围 - VSCode 插件的格式化触发逻辑:即使配置在子目录,只要文件被打开,插件默认仍会尝试格式化;需配合
editor.defaultFormatter的语言级覆盖 +files.associations控制哪些后缀走哪个 formatter - 若想彻底禁用某目录下所有文件的 Prettier,可在
.vscode/settings.json中用prettier.disableLanguages或直接设"prettier.enable": false,再用files.exclude配合 glob 排除该目录(但这是粗粒度屏蔽)
容易忽略的坑:VSCode 打开方式决定一切
哪怕 .eslintrc.cjs 和 .prettierrc 都放对了位置,如果 VSCode 不是以项目根目录打开的(比如双击打开了 src/client/App.tsx),编辑器根本不会加载 .vscode/settings.json,也不会识别根目录下的配置文件。此时所有“目录限定”都失效。
- 必须通过终端进入项目根目录,运行
code . - 窗口左下角应显示完整路径(如
/my-project),而不是Empty Workspace或/my-project/src/client - Project Manager 插件切换项目后,务必右键选中文件夹 →
Reopen with Code,否则.vscode/下的任何配置都不加载
真正起效的从来不是“配置写了没”,而是“VSCode 是否认出了这个目录是工作区根”。











