跳到內容

使用 Webpack Encore 的資源版本控制

編輯此頁

厭倦了部署後瀏覽器仍然快取舊版本的資源嗎?透過呼叫 enableVersioning(),每個檔案名稱現在都會包含一個雜湊值,該雜湊值會在該檔案的內容變更時隨之變更(例如,app.123abc.js 而不是 app.js)。這讓您可以使用積極的快取策略(例如,遠期 Expires),因為每當檔案變更時,其雜湊值也會變更,從而忽略任何現有的快取。

1
2
3
4
5
6
7
// webpack.config.js

  // ...
  Encore
      .setOutputPath('public/build/')
      // ...
+     .enableVersioning()

為了連結到這些資源,Encore 建立了兩個檔案 entrypoints.jsonmanifest.json

entrypoints.json & manifest.json 載入資源

每當您執行 Encore 時,都會在您的輸出資料夾中產生兩個設定檔(預設位置:public/build/):entrypoints.jsonmanifest.json。每個檔案都很相似,並且都包含最終版本化檔案名稱的映射。

第一個檔案 – entrypoints.json – 由 encore_entry_script_tags()encore_entry_link_tags() Twig 助手使用。如果您正在使用這些助手,那麼您的 CSS 和 JavaScript 檔案將會使用新的版本化檔案名稱呈現。如果您未使用 Symfony,您的應用程式將需要以類似的方式讀取此檔案。

manifest.json 檔案僅用於取得其他檔案(例如字型檔案或圖片檔案)的版本化檔案名稱(儘管它也包含有關 CSS 和 JavaScript 檔案的資訊)。

1
2
3
4
5
{
    "build/app.js": "/build/app.123abc.js",
    "build/dashboard.css": "/build/dashboard.a4bf2d.css",
    "build/images/logo.png": "/build/images/logo.3eed42.png"
}

在您的應用程式中,如果您想要能夠連結(例如,透過 img 標籤)到某些資源,則需要讀取此檔案。如果您使用 Symfony,只需啟用 json_manifest_file 版本控制策略即可。

1
2
3
4
5
# this file is added automatically when installing Encore with Symfony Flex
# config/packages/assets.yaml
framework:
    assets:
        json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'

就是這樣!請務必像平常一樣將每個路徑包裝在 Twig asset() 函式中。

1
<img src="{{ asset('build/images/logo.png') }}" alt="ACME logo">

疑難排解

資源版本控制與部署

當部署應用程式的新版本時,版本化資源將包含新的雜湊值,使先前的資源不再可用。當使用滾動更新、藍綠部署或符號連結策略部署應用程式時,這通常不是問題。

但是,即使應用這些技術,也可能有一段時間,某些公開/私下快取的響應請求先前版本的資源。如果您的應用程式無法承擔提供任何損壞的資源,最好的解決方案是使用 CDN(或自訂服務),將所有舊資源快取一段時間。

本作品,包括程式碼範例,根據 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本