跳到主要内容

编辑器区网页面板和侧边栏网页视图有什么差别?

结论​

WebviewPanel 是编辑器区域里的标签页,由代码创建。WebviewView 是侧边栏或面板里的视图,必须在清单里贡献,并由 WebviewViewProvider 解析。复杂页面两者都能做,差别在生命周期和用户把它们放在哪。

展开​

编辑器区面板:

const panel = vscode.window.createWebviewPanel(
"myext.preview",
"预览",
vscode.ViewColumn.Beside,
{ enableScripts: true, retainContextWhenHidden: true }
);

适合预览、向导、一次性结果。用户关掉标签,面板就销毁。同一个 viewType 可以开多份,所以要自己记住已有面板,第二次执行命令时 reveal 而不是再创建。

侧边栏视图:

{
"contributes": {
"views": {
"myext-container": [{ "type": "webview", "id": "myext.side", "name": "我的视图" }]
}
}
}
vscode.window.registerWebviewViewProvider("myext.side", provider);

resolveWebviewView 在视图第一次可见时调用。用户折叠视图时,网页可能被销毁,再次展开会重新 resolve。它更像一直待在侧边栏的工具,而不是一份文档。

激活事件:侧边栏用 onView:视图id。编辑器区面板如果支持重启后恢复,还要处理 onWebviewPanel 和序列化注册 registerWebviewPanelSerializer。

两边的 webview 对象能力相同:html、postMessage、cspSource、asWebviewUri。

容易讲错的点​

  • 视图 id、registerWebviewViewProvider 的 id、清单里的 id 必须一致。
  • type: webview 的视图不要再做成树视图提供器。
  • 面板放进 subscriptions 时,插件停用会把用户还开着的标签关掉。这通常是对的,但重启恢复要靠序列化器,而不是靠订阅把面板永远留住。