多根工作区本质是按职责划分独立根目录(如frontend/、backend/、shared/),而非嵌套加载monorepo根;需通过“添加文件夹到工作区”构建.code-workspace文件,各根可独立配置.settings.json和extensions.json,配合files.exclude与search.exclude精准排除干扰路径,并在tsconfig.json中显式声明include与paths以保障ts跳转准确。

多根工作区不是“加文件夹”而是“划边界”
直接把整个 monorepo 根目录拖进 VSCode,等于让所有语言服务、LSP、文件监视器同时盯住 node_modules、dist、.git 和十几个子包——这不是加载项目,是启动压力测试。真正有效的做法是按职责切分根目录:frontend/、backend/、shared/ 各自作为独立根加入工作区,而不是嵌套在同一个文件夹里。
操作上:先打开 frontend/ → 文件 → 将文件夹添加到工作区 → 选中 backend/ → 再选 shared/。最后保存为 myproject.code-workspace。这个文件才是你下次双击启动的“项目入口”,不是某个目录路径。
- 每个根目录下的
.vscode/settings.json会覆盖全局设置,比如editor.tabSize可以前端设 2、后端设 4 -
.code-workspace文件里写的settings是全局生效的,但只影响 UI 行为(如字体大小),不控制语言服务范围 - 别在
.code-workspace里写extensions字段——它只对第一个根生效,其余根完全无视
禁用扩展不能靠“关掉全部”,得按根目录精准关停
ESLint 在 frontend/ 里是刚需,在 backend/ 的 Python 目录里却会疯狂报错并吃光 CPU。VSCode 默认开启 extensions.autoRecommend,一加新根就自动装一堆不兼容插件,这是卡顿最隐蔽的源头。
正确做法是:在每个子目录下新建 .vscode/extensions.json,只列真正需要的扩展:
{
"recommendations": ["esbenp.prettier-vscode", "ms-vscode.vscode-typescript-next"]
}
同时在用户设置里关掉自动推荐:"extensions.autoRecommend": false。这样既保留前端的格式化能力,又避免后端目录被 TypeScript 插件误扫描。
- 右键禁用扩展时,选“在工作区中禁用”,不是“全局禁用”,否则其他小项目会丢功能
- 像
Auto Import、Path Intellisense这类常驻解析型扩展,建议默认禁用,需要时再手动启用 - GitLens 在超大仓库里默认监视所有历史提交,导致内存暴涨,可改用内置 Git 功能或限制
gitlens.views.repositories.enabled
搜索卡死?不是 VSCode 慢,是你没告诉它“别搜哪儿”
按 Ctrl+Shift+F 卡住十几秒,大概率是因为 VSCode 正在递归扫描 node_modules 里的 20 万个文件。它默认不读 .gitignore,也不跳过符号链接,纯靠暴力遍历。
必须同时配置两组排除项:
-
files.exclude:影响资源管理器显示 + 文件监视器监听范围(防止 inotify 耗尽) -
search.exclude:只影响Ctrl+Shift+F的实际扫描路径
在工作区级 .vscode/settings.json 中写死:
{
"files.exclude": {
"**/node_modules": true,
"**/dist": true,
"**/build": true,
"**/.git": true
},
"search.exclude": {
"**/node_modules": true,
"**/dist": true,
"**/coverage": true,
"**/*.log": true
}
}
注意:**/ 是必须的,单写 node_modules 不会递归生效;search.exclude 里加 **/*.log 能避开日志轰炸,而 files.exclude 里加它只是隐藏资源管理器里的文件图标。
TS 跳转失效?问题不在插件,而在 tsconfig.json 的 include 没收口
点击 import { utils } from '@lib/utils' 却跳不到定义,不是插件坏了,是 TypeScript 语言服务根本没索引那个路径。tsserver 默认会尝试加载所有依赖,遇到 node_modules 或未声明的子包就放弃跳转。
解决方案分两步:
- 在
tsconfig.json中显式声明"include": ["src/**/*"],禁止 tsserver 扫描整个工作区 - 配合
"baseUrl": "."和"paths"配置别名,确保@lib/*映射到实际路径,否则路径映射只是摆设
如果项目含多个 tsconfig(如 frontend/tsconfig.json 和 shared/tsconfig.base.json),确保子配置用 "extends": "../shared/tsconfig.base.json",而不是复制粘贴——否则路径映射和类型检查会各自为政。
大型项目里,跳转不准往往不是编辑器问题,而是 TypeScript 自身的索引策略没被约束住。越早收口 include,越少遇到“明明文件存在却找不到定义”的情况。











