vscode插件不支持真正热更新,因extension host使用commonjs模块系统且require.cache硬绑定,修改后需重启进程;官方仅支持developer: restart extension host,第三方工具实为自动重启而非hmr。

VSCode 插件本身不支持运行时热更新,改完代码必须重启整个 Extension Host 才能生效;所谓“调试中动态加载”只是 VSCode 调试器在断点暂停时读取当前内存状态,并非真正热替换模块。
为什么插件不能像前端那样 HMR
VSCode 插件运行在单独的 Extension Host 进程(node.js 环境),但它的模块系统是 CommonJS + require.cache 硬绑定的。一旦 require('./extension') 执行完成,模块就被缓存进 require.cache,后续 require 都返回同一份引用——没有机制触发重新加载或 patch 函数体。
- 你改了
extension.ts,调试器里看到的仍是旧函数闭包,除非手动清空require.cache并require重载(这会破坏状态、断开监听器、丢失已注册命令) - VSCode 官方明确不支持插件热重载,
Developer: Restart Extension Host是唯一可靠方式 - 第三方工具如
vscode-extension-hot-reload实际只是帮你自动执行重启,不是真 HMR
调试时如何快速验证修改
靠频繁重启 Extension Host 效率太低,真实开发中靠三招压缩反馈周期:
- 把核心逻辑抽离成独立 npm 包(比如
@myorg/core),在插件里require它;改这个包时用npm link+require.cache清理脚本,可局部刷新 - 调试配置
launch.json加上"restart": true,断点退出后自动重启调试会话,省去手动点「重新启动」 - 关键路径加
console.log或debugger,配合Developer: Toggle Developer Tools看控制台输出,比等重启快得多
常见错误:误以为 Live Server 或 nodemon 能起作用
Live Server 只服务静态资源,nodemon 监听的是你本地源码文件,但它们完全不干预 Extension Host 进程——VSCode 不会因为你改了 src/ 下的 ts 文件就自动 reload 插件。
- 你在终端跑
nodemon --watch src -x npm run compile,只编译 TS,不会触发 VSCode 重载插件 - 你右键
package.json点「Open with Live Server」,打开的是一个 HTTP 页面,和插件运行环境毫无关系 - 调试器里点「继续」(F5)≠ 重载插件,它只是恢复 Extension Host 运行;必须点「重新启动」或按
Ctrl+Shift+P→Developer: Restart Extension Host
最易被忽略的一点:插件激活逻辑(activate())里的副作用(比如全局事件监听、定时器、WebSocket 连接)在每次重启时都会重复注册,不清理就会堆积。别依赖「反正要重启」,该 deactivate() 的资源,必须写清楚。











