贡献点、桌面入口、网页入口和扩展类型分别干什么?
结论
contributes 是声明式贡献,宿主不执行你的代码也能画出菜单和配置。main 是 Node 扩展宿主的入口,browser 是网页版入口。extensionKind 决定这份代码跑在界面宿主还是工作区宿主。
展开
contributes 常见子项:
commands、menus、keybindings:命令、菜单、快捷键views、viewsContainers:侧边栏和面板configuration:设置项languages、grammars、snippets:语言、语法、代码片段customEditors、debuggers、taskDefinitions:自定义编辑器、调试、任务
这些在插件激活前就生效。所以命令可以先出现在命令面板,等用户点击再激活。
main 指向打包后的 Node 入口,例如 ./dist/extension.js。桌面版、远程工作区宿主都走它,里面可以用 Node API。
browser 指向网页扩展入口。vscode.dev 和浏览器里的 Code Server 没有 Node,不能 require("fs") 或 child_process。只写 main 的插件在网页里不会加载业务代码。
extensionKind:
ui:永远在用户本机的界面扩展宿主。适合密钥、系统通知、必须碰本地 UI 的逻辑。workspace:跟工作区走。远程开发时跑在远端,能看到远端文件和工具链。多数语言、任务类插件用这个。- 写成
["ui", "workspace"]时,远程窗口里可能各激活一次。要用vscode.env.remoteName和当前extensionKind区分自己跑在哪一侧,避免两边一起起服务器、一起弹窗。
engines.vscode 锁最低编辑器版本,用了新 API 却把版本写低,旧宿主会在调用处直接抛错。
容易讲错的点
contributes不会替你执行命令。声明和registerCommand是两件事。browser不是 Webview 页面入口,而是插件在网页版扩展宿主里的 JavaScript 入口。- 默认种类一般是
workspace。远程下一味用 Nodefs读「用户电脑上的工作区」会读错机器。