激活事件有哪些,为什么不该用星号?
结论
激活事件决定插件何时被加载。星号 * 表示宿主一启动就激活,绝大多数插件不该用。激活越晚,启动越轻。
展开
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 太宽,等于几乎每次开文件夹都激活。- 多个事件是「或」的关系,命中任意一个就会激活,不是必须全部满足。