VSCode插件开发不支持热重载,因Extension Host进程启动后一次性加载代码并常驻内存,不监听文件变化或支持模块热替换;修改extension.ts后必须手动执行Developer: Reload Window才能生效。

VSCode 插件开发本身不支持热重载——保存 extension.ts 后,必须手动重载窗口(Ctrl+R 或命令面板执行 Developer: Reload Window)才能生效。这是由 VSCode 插件宿主机制决定的,不是配置问题,也无第三方插件能绕过。
为什么 extension.ts 不能热重载
VSCode 插件运行在独立的 Extension Host 进程中,该进程启动后会一次性加载所有插件代码并长期驻留。它不监听文件变化,也不提供模块热替换(HMR)能力。修改源码后不重启进程,旧代码仍在内存中执行,新逻辑完全不会触发。
- 插件调试会话(
Launch Extension)本质是启动一个干净的 VSCode 窗口 + 新建 Extension Host 进程,和主编辑器无关 - 即使你在调试中改了代码,那个已启动的调试窗口里的 Extension Host 仍运行着旧版本
-
Developer: Restart Extension Host命令只对已安装插件生效,对正在调试的插件无效
launch.json 中的 "restart": true 没用
这个字段只对 attach 模式下的 Node.js 后端服务有效,对插件调试的 launch 模式完全不生效。VSCode 调试插件时用的是 vscode-js-debug 适配器,它不支持进程级自动重启,更不支持“热替换”逻辑。
- 常见误操作:在
launch.json的Launch Extension配置里加"restart": true,保存后依然没反应 - 真正起作用的只有
preLaunchTask:你可以在启动前自动编译 TS,但编译完仍需手动重载窗口 - 如果你依赖
npm run watch自动编译,记得确认out目录是否被正确复制到调试窗口的插件目录下(通常不会)
最接近“热重载”的实操路径
没有真热重载,但可通过组合操作把重载窗口的等待压缩到 2 秒内,避免反复点菜单:
- 绑定快捷键:
Ctrl+Shift+P→ 输入Developer: Reload Window→ 右键“添加快捷键”,设为Ctrl+Alt+R(避开浏览器默认刷新) - 启用自动保存:
files.autoSave设为onFocusChange,确保切出编辑器前已落盘 - 精简插件逻辑:把高频修改的业务代码抽成独立模块(如
commands/handler.ts),在activate()中动态import();重载窗口后只需重新执行这一小段,感知延迟略低 - 慎用
console.log:大量日志会拖慢 Extension Host,掩盖真实重载耗时;改用vscode.window.showInformationMessage()做轻量反馈
插件开发的“热重载”本质是流程压缩,不是技术突破。每次重载窗口都会清空所有状态(比如已打开的 Webview、注册的命令、全局变量),这点无法规避。如果你正在调试状态持久化逻辑,得接受它必然中断——这才是最常被忽略、又最影响判断的点。


















