桌面入口和网页入口有什么差别?
结论
main 是 Node 扩展宿主的入口,可以用 Node API。browser 是网页扩展宿主的入口,没有 Node,不能起子进程,也不能用只有 Node 才有的模块。vscode.dev 只加载 browser。
展开
{
"main": "./dist/extension.js",
"browser": "./dist/browser.js"
}
桌面和远程工作区宿主执行 main。代码里可以 import fs from "fs"、用 child_process 拉起语言服务器。
网页宿主执行 browser。打包时不能把 Node 内置模块打进去。文件用 workspace.fs,密钥用 secrets,能用编辑器命令完成的交互就不要碰操作系统。
只写 main 的插件在网页里不会运行业务代码,贡献点也许还在,命令点下去没有实现。
两个入口可以共享大部分源码,打包成两份。差异收口到一层平台适配里,例如「如何启动语言服务器」:桌面走子进程,网页走远程 WebSocket,或者网页直接不提供这块能力。
extensionKind 在网页里通常是界面侧。不要假设 process、__dirname 存在。路径用 context.extensionUri。
容易讲错的点
browser不是 Webview 的前端包。Webview 还有自己的 HTML 和脚本。一个插件可以同时有扩展入口和网页视图资源。- 网页入口里检查
typeof process === "undefined"可以,但更好的是打包期就分开,避免把 Node 模块引进浏览器包。 - 远程 SSH 仍然走
main,不要和 vscode.dev 搞混。SSH 有 Node,只是 Node 在远端。