跳到主要内容

激活事件有哪些,为什么不该用星号?

结论​

激活事件决定插件何时被加载。星号 * 表示宿主一启动就激活,绝大多数插件不该用。激活越晚,启动越轻。

展开​

package.json 的 activationEvents 常见值:

事件何时激活
onCommand:扩展.命令执行该命令。现在贡献了命令时往往可以省略,见下一题
onLanguage:typescript打开该语言的文档
onView:视图id视图被展开
workspaceContains:**/tsconfig.json打开工作区时发现匹配文件
onFileSystem:ssh出现该文件系统 scheme
onStartupFinished启动流程结束之后
onUri外部用插件的 URI 唤起
onWebviewPanel:viewType恢复对应 Webview
*启动立刻激活

选择原则是「谁用我,谁再把我叫起来」:

  • 只提供命令:靠命令激活。
  • 语言功能:onLanguage。
  • 侧边栏:onView。
  • 发现项目里有特征文件才需要工作:workspaceContains。

* 的问题是:用户没碰你的功能,扩展宿主也要加载你的模块、执行 activate。所有这样的插件串在一起,启动时间会明显变差。官方性能检查会把过早激活当成问题。

如果确实要在启动后做一次后台准备(例如预热索引),用 onStartupFinished,让它发生在核心启动完成之后,而不是和窗口抢第一帧。即便如此,activate 里仍然不能做重活。

容易讲错的点​

  • 写了激活事件但没写 contributes,命令面板里仍然看不到命令。两边都要有。
  • workspaceContains 的 glob 太宽,等于几乎每次开文件夹都激活。
  • 多个事件是「或」的关系,命中任意一个就会激活,不是必须全部满足。