快取策略
概觀
Yarn 擁有廣泛的快取設定,讓您能根據偏好的工作流程或 CI 平台進行調整。本文件將介紹一些最有趣的模式。
Yarn 預設會快取您安裝的所有內容,並將它們共用於機器上的所有其他專案;這會改善安裝速度和磁碟空間使用率,就像您使用硬連結一樣。
主要模式
離線鏡像
當首次在機器上安裝時,通常會從 npm 註冊表中擷取套件。雖然通常都能正常運作,但並非總是如此 - 註冊表已知會不時發生問題,這通常會導致安裝失敗。如果您沒有準備,這可能會對您的開發人員造成重大中斷,因為切換分支和執行部署會變得困難或不穩定得多。
有些公司嘗試透過將其註冊表設定為他們控制的鏡像來避免這個問題(例如,讓伺服器執行 Verdaccio,一個 npm 註冊表的開源實作)。然而,它需要特定的設定,而這並不總是容易部署到開發人員和 CI,而且這些系統有時會伴隨著 風險。
Yarn 提供了一個非常簡單但有效的替代方案:透過將 enableGlobalCache
設為 false,它會將套件快取儲存到專案本機資料夾(預設為 .yarn/cache
),然後可以將其新增到 Git。因此,每個提交都保證可以安裝,即使 npm 登錄中斷也不受影響。
零安裝
零安裝是 Yarn 的兩個功能的組合,讓您在切換分支時不必考慮執行 yarn install
,這項需求很容易忘記,直到您看到工具發生故障。
正如我們所見,離線鏡像透過將 Yarn 快取保留在儲存庫中,消除了專案對 npm 登錄的依賴性。但我們是否能更進一步,直接讓這個快取成為實際快取?答案是肯定的!
只要您的專案使用 Yarn PnP 且 離線鏡像,您所要做的就是將載入器檔案新增到 Git,就可以忘記 yarn install
大部分時間。由於 PnP 載入器的內容與產生它們的機器無關,且離線快取將包含載入器引用的所有檔案,因此 git checkout
呼叫實際上會加倍作為 yarn install
的一種。
一個警告:新增或移除具有原生依賴項的套件仍需要執行 yarn install
,因為此類套件依賴於檔案,這些檔案與 Node.js 腳本不同,無法直接從其 zip 檔案中評估。在實務上,這些套件相當罕見,不會頻繁更新,而且如果您忘記執行,Yarn 會顯示一個有用的錯誤訊息,因此這不會顯著影響模式的實用性。
技術上,透過將 node_modules
資料夾加入 Git,即可實現零安裝。然而,node_modules
資料夾包含數千個檔案,而 Git 必須個別比對每個檔案,而提升會導致檔案經常移動,而且人們習慣手動變更 node_modules
資料夾,最後提交變更。
相反地,將快取加入 Git 並使用 Yarn PnP,會提供一個資料夾,其中包含每個套件的單一 zip 檔案,以及 PnP 載入器檔案。如前所述,這對於 Git 追蹤來說容易許多。
特定環境
GitHub Actions
我們仍在調查一組確切的預設值,以提高 GH Action 快取的效率。我們可能會在中期提供官方的 yarn-cache
動作,以達到此目的。