Visual Studio Code 檔案和快取處理
1. 簡介
Visual Studio Code (VSCode) 是整合開發環境 (IDE) 領域的先驅,憑藉其卓越的效能、豐富的內建功能和擴充程序,至今仍位居前列。其簡潔直觀且可擴展的介面提供了查看和編輯所有內容(從基本文字、程式碼到 PDF 和圖像檔案)所需的一切功能。
為了提高載入速度、整體效能和便利性,Visual Studio Code 在多個層級實現了快取和快取控制。
在本教程中,我們將深入探討檔案管理以及如何在 VSCode IDE 中管理各種快取。首先,我們將從載入和快取的角度介紹檔案快取的概念。之後,我們將探索 Visual Studio Code 如何處理檔案和檔案變更。接下來,我們將深入探討 VSCode 快取。之後,我們將了解哪些快取會受到常見的編輯器清除和重新載入操作的影響。最後,我們將設定一個簡單的任務,在每次 VSCode 啟動時執行一次快取清除操作。
在本教學中,我們使用 Visual Studio Code 1.103.2 版本,假設它已正常安裝(例如,非可移植或自訂組態部署)。這表示保存 IDE 資料的目錄位於已知位置,該位置取決於所使用的作業系統 (OS):
- Linux:
~/.config/Code/ - macOS:
~/Library/Application Support/Code/ - Windows:
%APPDATA%\Code\
值得注意的是,我們將上述路徑簡稱為DATA_DIRECTORY 。
2. 文件緩存
優化資料從目前來源到所需位置的傳輸方式可以帶來巨大的速度優勢。
2.1. 加載
本質上,載入意味著將資料從一個記憶體儲存、儲存類型或磁區移動到另一個記憶體儲存、儲存類型或磁區。通常,主要目的是將資料移動到可以更快管理(讀取或寫入)的地方。
通常,載入作業發生在輔助儲存媒體中,例如硬碟 (HDD)、固態硬碟 (SSD) 或類似於主記憶體的揮發性 RAM 。事實上,這也是我們這裡主要討論的情況。然而,我們也可以透過網路將資源載入到主記憶體或輔助記憶體。此外,載入操作可能發生在同一媒體的不同部分之間,甚至檔案系統之間。
載入可能是一項緩慢的任務,特別是在某些情況下:
- 來源儲存僅支援低讀取速率
- 源和目標之間的傳輸速度較慢
- 源和目標位於同一介質上,從而降低了整體性能
- 大量數據
大數據通常以文件的形式出現。因此,檔案快取是軟體處理檔案操作效能不佳的常用方法。
2.2. 快取
具體來說,快取是確保最近取得的資料能夠快速供後續讀取的過程。具體來說,存在一些演算法來決定recency的定義以及它如何影響資料可用性。
快取通常需要專用記憶體。然而,一種快取方法是將已取得的資料保留在目標的單獨部分,以便進一步處理。關鍵在於,清除快取本質上意味著刪除包含快取資訊的條目、整個檔案或類似的物件。
根據設計,快取會建立資料副本,這可能會對來源資料更新造成挑戰,因為來源資料更新不會反映在目標資料中。
3. VSCode 檔案處理
文件資料會發生什麼以及 VSCode 如何快取它取決於使用者操作。
3.1. 新建文件
在 VSCode 中建立新檔案時,資料僅儲存在主記憶體中。它沒有連結到輔助記憶體的檔案句柄。
這意味著快取僅在硬體內部發生。
3.2. 開啟現有文件
開啟檔案時,VSCode 將區塊載入到主記憶體:
- 整個或部分文件
- 文件索引(如果有)
此後,對此類現有文件的任何編輯都會就地進行。
這意味著保存操作直接寫入文件,而未儲存的變更與新文件一樣處理,即它們位於易失性主記憶體中。
3.3. 熱退出
再次強調,任何未儲存的變更都會保留在 RAM 中。無論它們是在未儲存的緩衝區中還是已變更的檔案中,當編輯器進程結束時,變更都可能會遺失。
因此, VSCode 引入了Hot Exit機制,該機制在退出時將任何未儲存的資料保存到非揮發性輔助記憶體中的特定位置:
<DATA_DIRECTORY>/Backups/
上述目錄應保存未儲存的文件,以防 VSCode 終止。刪除該存儲意味著丟失所有此類更改。
3.4. 文件監視
VSCode 使用諸如inotify (Linux)、 FSEvents (macOS)和ReadDirectoryChangesW (Windows)之類的觀察程式。
這種方法可以確保在 VSCode 之外對文件所做的任何更改都能反映在編輯器中。需要注意的是,這種機制並不總是可靠的。
4. VSCode 緩存
為了優化效能並確保流暢的行為,Visual Studio Code 編輯器使用不同的快取類型。
4.1. 文件索引
VSCode 提供了不同的文字和程式碼功能:
- 語法高亮
- 自動完成
- 自動數據獲取
- 智慧感知
- 程式碼瀏覽
- 搜尋
其中許多功能依賴檔案索引。它支援快速操作,而無需在編輯器中刷新給定文件的許多方面。
當然,索引本身存在於檔案系統中:
<DATA_DIRECTORY>/User/workspaceStorage/<WORKSPACE_ID>
至關重要的是,刪除WORKSPACE_ID目錄會導致 VSCode 重新建立它:
- 從頭開始重建搜尋和檔案索引
- 重新產生語言伺服器數據
- 重置擴充狀態(設定同步、快取結果、授權)
雖然實際上並不危險,但考慮刪除workspaceStorage檔案時仍需謹慎,因為可能會遺失已儲存的憑證。
4.2. 效能緩存
幾個目錄包含僅影響 VSCode 本身效能的快取資料:
<DATA_DIRECTORY>/Cache/
<DATA_DIRECTORY>/CachedData/
<DATA_DIRECTORY>/Code Cache/
讓我們逐一解釋:
-
Cache:嵌入式 Chromium(Electron)瀏覽器引擎快取(主要為擴充市場提供資源) -
CachedData:為 VSCode 及其擴充功能轉譯或最佳化的 JavaScript。 -
Code Cache:Chromium(V8)程式碼緩存
同樣,這些目錄不會直接影響文件,並且會在編輯器重新啟動時重建。
5. 編輯器重新載入和清除操作
除了簡單地重新啟動編輯器之外,VSCode 還提供了重新載入介面某些部分或清除某些快取的方法。所有操作都可以透過Command Palette進行。
5.1. 重新載入窗口
本質上,VSCode 中的Reload Window操作會重新啟動整個編輯器,而無需實際退出:
雖然此操作不會重新加載特定的緩存,但它通常能夠正確顯示文件內容和用戶介面元素。此外,它還會刷新擴充功能。
5.2. 清除搜尋紀錄
Search: Clear Search History記錄操作可確保清除搜尋面板中所有快取的輸入。因此,它可以解決搜尋問題:
但是,在這種情況下,文件索引也不會受到影響。
5.3. 清除編輯歷史記錄
與上一個類似, Clear Editor History操作用於清除快取的搜尋字詞。不過,該操作在主搜尋輸入控制項(編輯器視窗頂部)上進行:
因此,這意味著沒有文件歷史記錄或搜尋文字可用於自動完成或選擇。
5.4. 清除最近打開的
最後, Clear Recently Opened會刪除 VSCode 儲存的最近開啟的檔案、目錄和項目清單:
本節中的所有操作都適用於一個特定的資料庫檔案:
<DATA_DIRECTORY>User/globalStorage/state.vscdb
刪除整個檔案可能會導致 VSCode 重置某些介面佈局,但在需要時會重新建立。
6. 快取清除任務
為了完整起見,我們假設我們想要在啟動 VSCode 時清除編輯器歷史記錄,並簡要解釋如何做到這一點。
首先,我們在.vscode專案級目錄中的tasks.json中新增一個任務:
{
"version": "2.0.0",
"tasks": [
{
"label": "clearEditorHistory",
"command": "${command:workbench.action.clearEditorHistory}"
}
[...]
]
}
之後,我們在同一目錄內的launch.json中使用它:
{
"version": "0.2.0",
"configurations": [
{
[...]
"preLaunchTask": "clear-editor-history"
[...]
}
]
}
這樣, clearEditorHistory就變成了preLaunchTask ,這意味著清除發生在初始化期間。
7. 總結
在本文中,我們探討了 VSCode 中的快取、它如何與檔案一起工作、清除編輯器內某些快取的方法以及不同的操作如何影響它們。
總之,了解 VSCode 中的不同快取類型以及如何管理它們對於最佳化或解決問題非常重要。