插件报“Cannot find module”或“Activation failed”主因是peerDependencies未满足,需检查npm ls输出、插件package.json的peerDependencies字段,并验证napi版本是否匹配VSCode内置Node(如v22.4.0对应napi=9)。

调试时插件报“Cannot find module”或“Activation failed”
这基本不是代码写错了,而是插件运行时 require 的某个依赖包(比如 typescript、vue、@vscode/debugprotocol)在当前工作区里根本没装,或者版本不落在插件声明的 peerDependencies 范围内。VSCode 不会帮你自动装 peer 依赖,它只加载你项目里已有的包。
- 先执行
npm ls typescript(或对应包名),看输出里有没有UNMET PEER DEPENDENCY字样 - 查插件的
package.json:进~/.vscode/extensions/作者名.插件名-版本号/package.json,找"peerDependencies"字段 - 常见踩坑点:
typescript@5.4.5和typescript@5.5.0属于不同napi_build_version,即使语义版本匹配,原生模块也可能加载失败
launch.json 中 runtimeExecutable 生效但断点不命中
runtimeExecutable 只控制你启动的调试进程用哪个 Node,完全不影响插件主机(Extension Host)和语言服务器(LSP)——它们强制走 VSCode 内置的 Electron Node(比如 v22.4.0 / napi=9)。所以你配了 node 路径,断点灰掉、require('./binding') 报错,大概率是插件本身编译时没对齐这个 ABI 版本。
- 验证当前插件运行环境:在 VSCode 集成终端执行
node -p "process.versions.napi",必须是 9(VSCode 1.90+) - 重编译原生模块必须显式指定目标:
npm rebuild --napi-build-version=9 --runtime=electron --target=34.0.0 - 务必先删干净缓存:
rm -rf node_modules/.pnpm node_modules/xxx-node-addon/out/,否则旧二进制仍会被优先 require
插件自动更新后 Extension host terminated unexpectedly
这不是配置能救的。新版插件代码可能已适配 napi=10(如 VSCode 1.91 预览版),但你还在用 1.90(napi=9),ABI 层直接拒载。错误日志里通常带 Module version mismatch 或 Invalid ELF header。
- 立刻关掉所有 VSCode 窗口(含托盘进程),Windows 用任务管理器杀光
Code.exe,macOS Dock 右键 → Quit - 手动删插件目录:
~/.vscode/extensions/作者名.插件名-*(Windows 是%USERPROFILE%\.vscode\extensions\...) - 去 Marketplace 页面下载上一稳定版 .vsix(比如
prettier-vscode-14.1.0.vsix),用Extensions: Install from VSIX安装
调试器连上了但语言服务没启动
现象是断点能打、变量能看,但没有类型提示、跳转定义失效、import 补全为空——说明 LSP 进程压根没起来,或者起在了错误的 Node 上。这类问题往往藏在 Developer: Show Running Extensions 里:状态显示 Activation failed 的插件,十有八九是 peer 依赖没对上。
- 打开命令面板,运行
Developer: Toggle Developer Tools,切到 Console,过滤ERR或Activation - 重点看类似
Error: Cannot find module 'vue'或TypeError: xxx is not a function的报错 - 不要依赖图形界面点“Update all”,npm Explorer 的更新逻辑不校验
peerDependencies兼容性,尤其对 Volar、Pylance、ESLint 插件影响巨大
复杂点在于:同一个插件,可能在 A 项目里因 typescript 版本触发激活失败,在 B 项目里又因 vue 版本卡住 LSP 启动;而这些依赖的 ABI、语义版本、peer 声明三者之间还存在隐式耦合。每次调试前,得先确认插件跑在哪套 Node + napi + peer 组合上,而不是只盯着自己的代码。











