隐藏时保留上下文有什么作用和代价?
结论
retainContextWhenHidden 让编辑器区网页面板在被别的标签挡住时不销毁页面,滚动位置、输入和脚本状态都还在。代价是这个隐藏页面继续占内存和 CPU。默认应该关掉,只有状态很难重建时才开。
展开
默认行为:面板不可见时,VS Code 可以销毁网页。再次显示要重新设置 HTML,脚本重新执行,页面内存状态丢失。扩展侧如果保存了业务状态,可以在重新打开时推回去。
打开这个选项后:
- 隐藏的 iframe 还活着
- 定时器、网络请求、画布状态都继续
- 切换标签不会闪,光标也不会丢
适合图形编辑器、长表单、终端样式的交互。不适合偶尔打开的帮助页、简单预览。
侧边栏 WebviewView 没有同一个选项来保证永远存活。视图被折叠后,resolveWebviewView 可能再次发生。侧边栏页面要把状态放在 webviewView.webview 的 getState/setState,或交给扩展保存,不要假设脚本变量还在。
如果开了保留上下文,隐藏时仍要暂停动画、轮询和文件监视,否则用户只是切走标签,机器还会一直转。
容易讲错的点
- 这个选项不能让面板在编辑器重启后还活着。重启恢复靠
WebviewPanelSerializer。 - 它也不替代
postMessage。保留的是页面运行时,不是扩展宿主里的对象。 - 多个面板都打开它,隐藏页面会按个数叠加。要限制同时存在的面板数量。