跳至內容

依賴預先打包

當您第一次執行 vite 時,Vite 會在本地載入您的網站之前,預先打包您的專案依賴。預設情況下,此操作會自動且透明地完成。

原因

這是 Vite 執行我們稱之為「依賴預先打包」的過程。此過程有兩個目的:

  1. CommonJS 和 UMD 相容性:在開發期間,Vite 的開發伺服器會將所有程式碼作為原生 ESM 提供。因此,Vite 必須先將以 CommonJS 或 UMD 形式提供的依賴轉換為 ESM。

    轉換 CommonJS 依賴時,Vite 會執行智慧型匯入分析,以便對 CommonJS 模組的具名匯入也能如預期般運作,即使匯出是動態指派的(例如 React)。

    js
    // works as expected
    import React, { useState } from 'react'
  2. 效能:Vite 會將具有許多內部模組的 ESM 依賴轉換為單一模組,以改善後續的頁面載入效能。

    某些套件會將其 ES 模組建置發佈為許多獨立檔案,彼此互相匯入。例如,lodash-es 擁有超過 600 個內部模組!當我們執行 import { debounce } from 'lodash-es' 時,瀏覽器會同時觸發 600 多個 HTTP 請求!即使伺服器處理它們沒有問題,大量請求也會在瀏覽器端造成網路壅塞,導致頁面載入速度明顯變慢。

    lodash-es 預先打包成單一模組後,我們現在只需要一個 HTTP 請求!

注意

依賴預先打包僅適用於開發模式,並使用 esbuild 將依賴轉換為 ESM。在生產建置中,則改用 @rollup/plugin-commonjs

自動依賴探索

如果找不到現有的快取,Vite 會爬梳您的原始碼並自動探索依賴匯入(即預期從 node_modules 解析的「裸匯入」),並使用這些找到的匯入作為預先打包的進入點。預先打包是使用 esbuild 執行的,因此通常非常快速。

伺服器啟動後,如果遇到快取中尚未存在的新依賴匯入,Vite 會重新執行依賴打包程序,並在需要時重新載入頁面。

Monorepos 和連結的依賴

在 Monorepo 設定中,依賴可能是來自相同儲存庫的連結套件。Vite 會自動偵測未從 node_modules 解析的依賴,並將連結的依賴視為原始碼。它不會嘗試打包連結的依賴,而是會分析連結的依賴的依賴清單。

但是,這需要將連結的依賴匯出為 ESM。如果不是,您可以在設定中將依賴新增至 optimizeDeps.includebuild.commonjsOptions.include

vite.config.js
js
export default 
defineConfig
({
optimizeDeps
: {
include
: ['linked-dep'],
},
build
: {
commonjsOptions
: {
include
: [/linked-dep/, /node_modules/],
}, }, })

當對連結的依賴進行變更時,請使用 --force 命令列選項重新啟動開發伺服器,以使變更生效。

自訂行為

預設的依賴探索啟發式可能並不總是理想的。如果您想要從清單中明確包含/排除依賴,請使用 optimizeDeps 設定選項

optimizeDeps.includeoptimizeDeps.exclude 的常見使用案例是當您有無法直接在原始碼中探索到的匯入時。例如,匯入可能是由外掛轉換產生的結果。這表示 Vite 無法在初始掃描時探索到匯入,它只能在瀏覽器請求檔案並轉換後才能探索到。這將導致伺服器在啟動後立即重新打包。

includeexclude 都可以用來處理這種情況。如果依賴很大(具有許多內部模組)或為 CommonJS,則您應該包含它;如果依賴很小且已經是有效的 ESM,您可以排除它並讓瀏覽器直接載入它。

您也可以使用 optimizeDeps.esbuildOptions 選項進一步自訂 esbuild。例如,新增 esbuild 外掛來處理依賴中的特殊檔案,或變更 建置 target

快取

檔案系統快取

Vite 會將預先打包的依賴快取在 node_modules/.vite 中。它會根據以下幾個來源判斷是否需要重新執行預先打包步驟:

  • 套件管理器鎖定檔內容,例如 package-lock.jsonyarn.lockpnpm-lock.yamlbun.lockb
  • 修補程式資料夾修改時間。
  • 您的 vite.config.js 中的相關欄位(如果存在)。
  • NODE_ENV 值。

只有在上述其中一項發生變更時,才需要重新執行預先打包步驟。

如果由於某些原因您想要強制 Vite 重新打包依賴,您可以透過 --force 命令列選項啟動開發伺服器,或是手動刪除 node_modules/.vite 快取目錄。

瀏覽器快取

解析的依賴請求會透過 HTTP 標頭 max-age=31536000,immutable 強烈快取,以改善開發期間的頁面重新載入效能。一旦快取,這些請求將永遠不會再次命中開發伺服器。如果安裝了不同的版本(如您的套件管理器鎖定檔中反映的),它們會由附加的版本查詢自動失效。如果您想透過進行本地編輯來偵錯您的依賴,您可以:

  1. 透過瀏覽器開發人員工具的網路標籤暫時停用快取;
  2. 使用 --force 標記重新啟動 Vite 開發伺服器,以重新打包依賴;
  3. 重新載入頁面。

在 MIT 授權下發佈。(ccee3d7c)