跳到主要内容

贡献点、桌面入口、网页入口和扩展类型分别干什么?

结论​

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。远程下一味用 Node fs 读「用户电脑上的工作区」会读错机器。