必须用根目录打开monorepo项目,否则vscode无法识别完整结构、turbo命令不可用、ctrl+click跳转失败;需确保pnpm-workspace.yaml存在且合法,tsconfig分层配置references和composite:true,并重启ts server。

必须用根目录打开,否则所有功能都失效
VSCode 不会自动识别 monorepo 结构,它只认你实际打开的文件夹路径。如果你在终端里 cd 进 packages/ui 再执行 code .,VSCode 就只会加载这个子包——node_modules 里没有其他本地包的符号链接,tsconfig.json 的 paths 映射找不到目标,跨包 import 全报错。
正确做法是:回到项目最外层目录(含 pnpm-workspace.yaml 或 package.json 中 workspaces 字段的位置),再运行 code .。检查资源管理器顶部是否显示类似 文件夹:/my-monorepo;右下角状态栏应显示 TypeScript SDK: Workspace version,而不是指向某个子包的路径。
- 常见错误现象:
Cannot find module 'my-utils'、Ctrl+Click 跳转失败、自动导入不补全跨包路径 - 别用多根工作区(
.code-workspace)强行添加多个子包——这会绕过 pnpm workspace 协议,TS 服务和 turbo/lerna 都无法正确解析依赖拓扑 - Windows 用户尤其注意:PowerShell 默认不加载
node_modules/.bin,建议在 VSCode 设置中把terminal.integrated.defaultProfile改为bash或zsh
tsconfig 必须分层配 references + composite
TypeScript 默认把每个 tsconfig.json 当独立项目,monorepo 要让它理解“这些包之间有依赖”,就得靠 references 和 composite: true 显式声明。根目录的 tsconfig.base.json(或根级 tsconfig.json)负责统一配置 compilerOptions.paths,所有子包必须 extends 它,并各自设 "composite": true。
例如,根 tsconfig.base.json:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@myorg/utils": ["packages/utils/src"],
"@myorg/ui": ["packages/ui/src"]
}
}
}
子包 packages/utils/tsconfig.json:
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"composite": true,
"outDir": "./dist"
},
"include": ["src/**/*"]
}
- 删掉所有子包下的
node_modules和package-lock.json,再跑pnpm install—— 否则 TS 可能缓存旧的模块解析结果 -
references数组不是可选的:在根配置里显式列出所有子包路径,如[{ "path": "packages/utils" }, { "path": "apps/web" }],能让 TS Server 更快定位依赖源码 - 子包
package.json必须有"types": "dist/index.d.ts"(如果生成了类型文件),否则 TS 会跳过该包的类型检查,只查node_modules里的构建产物
终端命令要用 npx,别信 PATH
VSCode 启动的集成终端默认不把当前项目的 ./node_modules/.bin 加进 PATH,所以直接敲 turbo 或 lerna 会报 command not found。这不是没装,是环境路径没导进去。
最稳妥的方式是统一用 npx:
npx turbo run buildnpx lerna run test --scope=ui-
npx pnpm run dev(如果根package.json里定义了dev脚本)
如果要用 VSCode 的 tasks 功能,.vscode/tasks.json 里必须显式指定 "options": {"cwd": "${workspaceFolder}"},且 "command" 写成 "npx turbo run build",不能写死 turbo 或依赖全局安装。
- 别在 shell 配置文件(如
~/.zshrc)里加export PATH="./node_modules/.bin:$PATH"—— 这只对当前目录生效,且存在安全风险 - Windows PowerShell 用户:
npx比手动改PATH更可靠,避免权限和路径分隔符问题 -
turbo和lerna等工具必须是本地安装(devDependencies),不能只靠-g全局装
重启 TS Server 是硬性步骤,不是可选项
改完 tsconfig 或重装依赖后,VSCode 不会自动刷新 TypeScript 语言服务。你看到的红色波浪线、跳转失败、类型提示缺失,大概率只是 TS Server 还在用旧快照。
必须手动触发:
- 快捷键
Ctrl+Shift+P(macOS 是Cmd+Shift+P)→ 输入Restart TS server→ 回车 - 或者点击右下角 TypeScript 版本号 → 选择
Restart TS Server - 重启后观察状态栏是否出现
TypeScript 5.4(或你实际版本)字样,且不再报Cannot find module
有时候窗口级缓存比进程级更顽固:如果重启 TS Server 没用,关掉 VSCode 再重开一次。别跳过这步——90% 的“配置明明对了但不生效”问题,都卡在这儿。











