网页视图
Webview 是扩展控制的一块 HTML 界面,官方把它比作 VS Code 里的 iframe。扩展不能改主界面 DOM,自定义布局就放在这里。Markdown 预览就是这个机制。
它比较吃资源,也容易和编辑器的外观脱节。官方建议先问:这件事是不是必须留在 VS Code 里,树、快速选择、状态栏能不能做完。
三种落点
| 种类 | API 或贡献 | 出现位置 |
|---|---|---|
| 网页面板 | window.createWebviewPanel | 编辑器标签,像一个文档 |
| 侧栏网页视图 | contributes.views 加 registerWebviewViewProvider | 侧栏或面板 |
| 自定义编辑器 | contributes.customEditors 加 registerCustomEditorProvider | 用来打开某种文件,能接保存、撤销 |
createWebviewPanel 的 viewType 用来识别种类。编辑器重启后要恢复面板,清单里声明 onWebviewPanel:viewType,并 registerWebviewPanelSerializer。第一次打开通常仍靠命令把扩展激活。
内容和安全
webview.html 必须是完整 HTML 文档。本地图片、脚本要用 webview.asWebviewUri 转成网页可访问的地址,并把目录列进 localResourceRoots,不能让网页随意读扩展目录以外的文件。
页面和扩展不共享对象。扩展听 webview.onDidReceiveMessage,页面用 acquireVsCodeApi().postMessage。消息应是可结构化克隆的数据,并带上自己的 type 字段,方便区分。
内容安全策略要限制脚本和资源来源。官方强调不要随意 innerHTML 拼不可信内容。脚本标签上的随机数要和策略里的 nonce 一致。
状态
面板销毁后,里面的 JS 状态就没了。需要记住的内容让扩展存起来,或使用 webview 的 getState / setState。
侧栏视图隐藏后默认会清掉网页上下文。retainContextWhenHidden: true 能留下页面,切换回来更快,但隐藏期间仍占内存。