跳到主要内容

激活与销毁

扩展默认不加载。某个激活事件发生后,VS Code 加载入口模块,并调用导出的 activate。这次调用在扩展的一生里只发生一次。关闭窗口或扩展被重载时,如果导出了 deactivate,会再调用它做清理。

activate 里适合做什么​

适合做注册:命令、提供器、事件监听、树、状态栏。这些注册返回的 Disposable 放进 context.subscriptions,扩展停用时会自动释放。

不适合做重活:扫整个工作区、连远程服务、启动语言服务器并一直等到就绪。激活函数卡住时,会拖住扩展宿主这条单线程,同宿主里的其他扩展也会受影响。重活放到命令真正执行时,或激活后异步去做,并允许取消。

activate 可以返回 Promise。在它完成之前,VS Code 会认为扩展还在激活。

deactivate 里适合做什么​

关掉语言服务器、停掉定时器、退订没有放进 subscriptions 的监听。清理是异步的,必须返回 Promise;同步清理可以返回 undefined,也可以不导出这个函数。

不要假设 deactivate 一定有机会把大文件写完。进程可以被直接杀掉。

激活慢时先看什么​

  • 是不是用了 *,一启动就加载。
  • activate 里有没有同步读大量文件、require 很重的库。
  • 语言服务器是不是在激活路径上同步等待进程起来。

官方建议用更窄的激活事件,让扩展在用户真正需要时才加载。

参考​