延伸模組主機
擴充功能主機 (Extension Host) 負責執行擴充功能。
擴充功能主機設定
根據 VS Code 的設定,可能會同時執行多個擴充功能主機,它們各自具有不同的執行環境,且位於不同的位置。
- 本機 (local) – 在本機(與使用者介面同一台機器)上執行的 Node.js 擴充功能主機。
- 網頁 (web) – 在瀏覽器或本機(與使用者介面同一台機器)上執行的網頁擴充功能主機。
- 遠端 (remote) – 在容器或遠端位置執行的 Node.js 擴充功能主機。
下表顯示在各種 VS Code 設定中可用的擴充功能主機:
| 設定 | 本機擴充功能主機 | 網頁擴充功能主機 | 遠端擴充功能主機 |
|---|---|---|---|
| 桌機版 VS Code | ✔️ | ✔️ | |
| 具備遠端功能的 VS Code (Container, SSH, WSL, GitHub Codespace, Tunnel) | ✔️ | ✔️ | ✔️ |
| 網頁版 VS Code (vscode.dev, github.dev) | ✔️ | ||
| 具備 Codespaces 的網頁版 VS Code | ✔️ | ✔️ |
擴充功能主機執行環境
- Node.js - 擴充功能在 Node.js 執行環境中執行。由本機和遠端擴充功能主機使用。擴充功能需要一個
main入口檔案才能在其中執行。 - 瀏覽器 (Browser) - 擴充功能在 Browser WebWorker 執行環境中執行。由網頁擴充功能主機使用。擴充功能需要一個
browser入口檔案才能在其中執行。詳細資訊請參閱網頁擴充功能指南。
偏好的擴充功能位置
擴充功能載入的擴充功能主機取決於以下因素:
- 由 VS Code 設定所提供的可用擴充功能主機。
- 擴充功能的能力:它是否能在 Node.js 和/或網頁中執行?如果未指明,它提供了哪些貢獻?
- 擴充功能的安裝位置:是在本機機器、遠端機器,還是兩者皆有。
- 擴充功能偏好的位置:即
extensionKind屬性。
extensionKind 是擴充功能清單 (extension manifest) 中的一個屬性。它允許擴充功能指定偏好的執行位置。可以是擁有工作區的機器 (workspace) 或使用者介面 (ui)。如果擴充功能兩者皆可執行,則可以指定優先順序。
"extensionKind": ["workspace"]— 表示擴充功能需要存取工作區內容,因此需要在工作區所在的位置執行。這可以是本機機器、遠端機器或 Codespace。大多數擴充功能屬於此類。"extensionKind": ["ui", "workspace"]— 表示擴充功能偏好作為 UI 擴充功能執行,但對本機資產、裝置或功能沒有嚴格要求。使用 VS Code 時,如果本機存在擴充功能,它將在 VS Code 的本機擴充功能主機中執行,這意味著使用者不必在遠端安裝該擴充功能。否則,該擴充功能將在 VS Code 的工作區擴充功能主機中執行(如果該處存在)。在使用具備 Codespaces 的網頁版 VS Code 時,它將始終在遠端擴充功能主機中執行(因為沒有本機擴充功能主機可用)。"extensionKind": ["workspace", "ui"]— 表示擴充功能偏好作為工作區擴充功能執行,但對存取工作區內容沒有嚴格要求。使用 VS Code 時,如果遠端工作區存在該擴充功能,它將在 VS Code 的工作區擴充功能主機中執行;否則,如果本機存在,則在 VS Code 的本機擴充功能主機中執行。在使用具備 Codespaces 的網頁版 VS Code 時,它將始終在遠端擴充功能主機中執行(因為沒有本機擴充功能主機可用)。"extensionKind": ["ui"]— 表示擴充功能必須在靠近 UI 的地方執行,因為它需要存取本機資產、裝置或功能,或是因為需要低延遲。在使用具備 Codespaces 的網頁版 VS Code(沒有本機擴充功能主機)的情況下,除非它是網頁擴充功能,否則此類擴充功能無法載入。如果是網頁擴充功能,它將在網頁擴充功能主機中載入,並具有無法實例化 Web Worker 的限制。
注意:舊版的 VS Code(<1.40)允許擴充功能將單一位置指定為字串,但此做法已被棄用,建議改用陣列形式指定多個位置。
如果擴充功能可以在 Node.js 和瀏覽器中執行,系統將優先選擇 Node.js 擴充功能主機(如果可用)。有一個例外:當設定為「具備 Codespaces 的網頁版 VS Code」且 extensionKind 設定為 ui 時,網頁擴充功能主機的優先級高於遠端擴充功能主機。
如果擴充功能僅限於網頁使用,則無論 extensionKind 設定為何,它都將始終在網頁擴充功能主機上執行。我們建議在這種情況下不要定義 extensionKind。
穩定性與效能
VS Code 致力於為使用者提供穩定且高效能的編輯器,行為異常的擴充功能不應影響使用者體驗。VS Code 中的擴充功能主機防止擴充功能執行以下行為:
- 影響啟動效能
- 拖慢 UI 操作
- 修改 UI
此外,VS Code 允許擴充功能宣告其啟用事件 (Activation Events) 並進行延遲載入。例如,Markdown 擴充功能應該只在使用者開啟 Markdown 檔案時才載入。這確保了擴充功能不會消耗不必要的 CPU 和記憶體資源。