必须手动开启explorer.filenesting.enabled,否则所有嵌套规则均不生效;该开关默认关闭,且工作区配置会覆盖用户级设置,需确认json中存在"explorer.filenesting.enabled": true并刷新资源管理器。

必须手动开启 explorer.fileNesting.enabled,否则所有 patterns 都不生效——这是 90% 用户配不出来的根本原因。
为什么改了 patterns 却没嵌套效果
最常被忽略的是启用开关本身。VS Code 默认不开启文件嵌套,哪怕你写了完整的 explorer.fileNesting.patterns,只要 explorer.fileNesting.enabled 是 false 或压根没声明,编辑器就完全无视规则。
- 检查方式:打开命令面板(
Ctrl+Shift+P),运行Preferences: Open Settings (JSON),确认当前生效的配置层级(顶部路径显示User还是Workspace) - 工作区配置(
.vscode/settings.json)会完全覆盖用户级设置,别在用户设置里配了一堆,结果项目里又有个空的或"explorer.fileNesting.enabled": false的 workspace 配置 - 改完必须右键资源管理器空白处 →
Refresh Explorer,VS Code 不自动重绘文件树
explorer.fileNesting.patterns 的匹配限制很严格
它不是通配符引擎,也不是正则处理器,只做简单字符串匹配 + 同目录约束。
- 键名(如
"index.ts")必须是项目中真实存在的文件名,不能写"*.ts"—— VS Code 不支持这种泛化父项 - 值列表里的每个文件(如
"index.test.ts")必须和父文件在**同一目录下**,src/a.ts和tests/a.test.ts永远不会被识别为一对 - 文件名区分大小写、点号、空格:写成
"Index.ts"或"index .ts"都无效;".env.local"能被".env": "*.env, .env.*"匹配,但".envlocal"不行
高频实用模式怎么写才靠谱
与其硬背模板,不如按场景选最小可行规则。以下写法经 VS Code 1.86+ 实测有效:
- 测试文件收进源文件下:
"user.service.ts": ["user.service.spec.ts", "user.service.test.ts"] - Vue 组件三件套:
"Button.vue": ["Button.stories.vue", "Button.spec.ts"](注意:不能写"*.vue": [...]) -
配置文件归组:
"package.json": ["package-lock.json", "pnpm-lock.yaml", "yarn.lock"] - TS 编译产物:
"main.ts": ["main.js", "main.d.ts"](前提是同目录下真有这些文件)
别碰 $(capture),除非你真需要它
$(capture) 是高级语法,用于提取公共前缀再拼接子文件,但极易出错且调试困难。
- 例如
"*.component.ts": ["$(capture).component.html", "$(capture).component.css"],要求存在login.component.ts和login.component.html才能触发嵌套 - 一旦命名不一致(比如用了
login-page.component.ts但login.component.html),整条规则失效,且无任何提示 - 对多数团队,直接列明具体配对更稳定、可读、易维护 —— 尤其当文件名约定已统一时
真正难的不是写几行 JSON,而是让整个团队的文件命名和存放位置达成一致。嵌套只是视觉层的补救,底层结构混乱时,再好的 patterns 也只是贴膏药。











