根本原因是abi不兼容:vscode 1.90+内置node.js 22.4.0(napi_build_version=9),而本地nvm安装的插件原生模块为napi=8,加载时被静默拒绝;需用vscode内置node执行npm rebuild --napi-build-version=9 --runtime=electron --target=34.0.0并清空缓存。

插件报“Extension host terminated unexpectedly”根本不是配置问题
这是 ABI 不兼容的硬性失败,VSCode 1.90+ 内置 Electron 34 → Node.js v22.4.0 → napi_build_version=9,而你本地用 nvm use v20.15.0 装的插件原生模块是 napi=8,加载时被静默拒绝,控制台只显示进程崩溃,不报具体错误。
验证方式:打开 VSCode 开发者工具(Help → Toggle Developer Tools),在 Console 中执行 process.versions.napi。若输出 "9",但插件仍崩溃,基本可锁定 ABI 错配。
- 别信终端里
node -v的输出——插件主机进程完全不走系统 Node - Windows 用户需杀光所有
Code.exe进程(含后台托盘),macOS 需 Dock 右键 Quit,否则旧环境残留 - 手动删插件目录:
%USERPROFILE%\.vscode\extensions\esbenp.prettier-vscode-*(Windows)或$HOME/.vscode/extensions/esbenp.prettier-vscode-*(macOS) - 从 Marketplace 下载上一稳定版
.vsix(如prettier-vscode-14.1.0.vsix),用 Extensions: Install from VSIX 安装
插件里 require('./binding.node') 报错“Cannot find module”
不是路径写错、文件丢失或权限问题,而是 VSCode 插件主机加载原生模块时强制校验 ABI 版本,.node 文件必须由 VSCode 自带的 Node 运行时编译生成。
典型错误日志里没有堆栈,只有 Cannot find module './build/Release/binding.node' —— 这是 Electron 沙箱层拦截的结果,和 fs.existsSync 返回 true 并不矛盾。
- 重编译必须调用 VSCode 自带的 Helper 进程:macOS 示例为
~/.vscode/Code.app/Contents/Frameworks/Code\ Helper\ \(Renderer\).app/Contents/MacOS/Code\ Helper\ \(Renderer\) --type=extensionHost node /usr/bin/npm rebuild --napi-build-version=9 --runtime=electron --target=34.0.0 - Windows/Linux 路径需对应调整,关键是前缀必须是 VSCode 安装目录下的
Code Helper (Renderer)可执行文件 - 编译前务必清空:
rm -rf ./out ./node_modules/.pnpm/node_modules/,避免缓存干扰 -
.vsix安装后仍失败?检查插件package.json中engines.vscode字段是否匹配当前版本(如"^1.90.0"),且签名未被 1.85+ 的严格校验拦截
插件状态栏卡在 “Activating…” 或补全失效
大概率是插件声明的 peerDependencies 和你项目实际安装的版本无交集,比如 Volar v2.x 要求 vue@^3.3.0,而你项目是 vue@2.7.16,插件运行时 require('vue') 直接失败,语言服务无法启动。
VSCode 不运行 npm install,它只加载已打包好的插件;冲突发生在插件尝试加载宿主包的那一刻,而非安装阶段。
- 执行
npm ls vue或npm ls typescript,重点看输出中是否有UNMET PEER DEPENDENCY - 查插件官方文档或
~/.vscode/extensions/xxx/package.json,确认其peerDependencies声明范围 - 用
npm view @volar/vue3 peerDependencies直接获取官方要求的版本约束 - 修复路径优先选升级宿主:如
npm install vue@^3.4.0;降级插件次之;慎用--legacy-peer-deps,它绕过校验但可能引发运行时类型错乱
调试器断点灰掉、launch.json 的 runtimeExecutable 像没生效
runtimeExecutable 只控制调试主进程,不影响插件主机(Extension Host)和语言服务器(LSP)。断点灰掉、require('./binding') 报错,说明问题出在插件自身运行环境,跟你配置的调试器完全无关。
真正起作用的是 VSCode 内置的 Electron Node 环境,它独立于你的 launch.json 设置,也不读取 terminal.integrated.env.* 中的 PATH。
- 确保
"terminal.integrated.inheritEnv": true已设为true,且改完后彻底重启 VSCode(非重载窗口) - 调试器是否继承终端环境,取决于该设置是否生效,而不是
runtimeExecutable是否存在 - 插件开发时,
require失败但node -e "require('./index')"正常,是因为插件主机进程不复用项目node_modules,也不自动加载插件自身的dependencies - 插件依赖必须显式打包进
.vsix,或通过engines.node声明并由用户手动安装到全局,不能靠项目node_modules透传
runtimeExecutable 能统一所有 Node 上下文——它只管调试器那一层,插件、LSP、终端,各自有各自的 Node 运行时,互不共享。











