Released 2023-07-13

Modified 2023-07-13

Tech

2278Words (12min read)

深入理解 Webpack:main.[contenthash].js 與 SPA

Title Image

Photo by Kama on Webpack

前言 - Prologue

在 Webpack 5 中,已經棄用 [hash],改為只使用 [contenthash]

本文將探討 [contenthash] 的作用、如何確保瀏覽器下載最新版本的應用程式,以及 main.[contenthash].js 在單頁應用程式(SPA)中的關聯性。

正文 - Main text

重點整理:

  • Webpack 5 已經棄用 [hash],改為只使用 [contenthash]
  • main.[contenthash].jsWebpack 打包後生成的最終輸出檔案的命名格式
  • main 表示檔案的名稱,通常是根據入口點(Entry)的名稱來命名,但也可以根據自己的需求進行配置。
  • [contenthash] 是根據檔案內容計算的唯一編譯標識符,用於確保瀏覽器下載最新版本的應用程式。
  • [contenthash] 的值會根據檔案內容的更改而改變,使得每次應用程式更新時都能生成新的 [contenthash]
  • main.[contenthash].js 在瀏覽器中具有唯一性,每次生成的 [contenthash] 值都是不同的。
  • 使用 [contenthash] 可以解決瀏覽器快取問題,確保用戶下載最新版本的應用程式。
  • 在單頁應用程式(SPA)中,main.[contenthash].js 是應用程式的主要 JavaScript 檔案,包含了應用程式運行所需的所有程式碼和資源。
  • 在 SPA 架構中,main.[contenthash].js 可能包含應用程式的主要邏輯,而其他模組則根據需要以獨立的 chunks 加載。
  • 使用熱模組替換(HMR)時,main.[contenthash].js 可以實現僅更新變更的模組而不影響其他部分。
  • 在生產環境中,main.[contenthash].js 經過優化並最小化,以提供更好的效能。
  • 確保在每次部署應用程式時都生成新的 [contenthash] 值,以便瀏覽器請求最新版本。
  • Webpack 配置中可以使用 [contenthash] 變數來定義輸出檔名。

main.[contenthash].js 的作用是作為應用程式的主要 JavaScript 檔案,包含了應用程式運行所需的所有程式碼和資源。它是由 Webpack 根據應用程式的入口點(Entry)和模組(Module)相依關係打包而成的。

這個檔案通常是在 HTML 檔案中引入的,以開始運行應用程式。

透過使用 [contenthash],當對應用程式進行更新時,Webpack 會生成一個不同的 [contenthash],從而改變輸出檔案的檔名,這樣瀏覽器就會重新請求並下載最新的檔案,確保用戶使用的是最新版本的應用程式。

使用 [contenthash] 的主要好處是解決瀏覽器的快取問題,確保用戶在每次更新應用程式時都能夠載入最新的版本。這對於網站的更新和部署非常有用,同時也能提供更好的緩存控制,避免用戶瀏覽器緩存舊的應用程式檔案而產生問題。

生成方式

[contenthash] 的生成方式:

  • Webpack 使用一種 Hash (哈希) 算法(預設是 MD5)根據檔案內容生成 [contenthash] 的值。
  • [contenthash] 的生成是根據整個檔案的內容,即使僅有一個字符發生更改,也會產生完全不同的 [contenthash] 值。

[contenthash] 可以是不同的 Hash 算法,例如 MD5、SHA-1、SHA-256 等,具體的 Hash 算法取決於 Webpack 的配置。

可以通過 Webpack 配置中的 output.filename 選項來自定義檔案名稱的格式,包括是否包含 [contenthash]

快取

瀏覽器快取問題:

  • 瀏覽器會將檔案暫存在快取中,以提高再次訪問時的載入速度。
  • 由於瀏覽器快取,用戶可能會在應用程式有更新時仍然載入舊版本的 JavaScript 檔案。
  • [contenthash] 的使用可以確保用戶下載最新版本的應用程式,而不受瀏覽器快取的影響。
應用程式部署

main.[contenthash].js 的應用程式部署:

  • 在每次部署應用程式時,Webpack 會生成一個新的 [contenthash] 值,並將其包含在 main.[contenthash].js 的檔名中。
  • 這樣瀏覽器在請求 main.[contenthash].js 時,會注意到檔名的變化,並重新下載最新版本的應用程式。
注意事項與實踐

注意事項與最佳實踐:

  • 使用 [contenthash] 時,需要確保在每次部署應用程式時都生成新的 [contenthash] 值,以便瀏覽器請求最新版本。
  • 在 Webpack 配置中,可以使用 [contenthash] 變數來定義輸出檔名,具體取決於需求。

⚠️ 注意:[contenthash] 的使用會增加打包時間,因為每次打包都需要重新計算 Hash 值。


而對於 Vue、React 等單頁應用程式(SPA)架構來說,main.[contenthash].js 在打包過程中具有重要的關聯性。

以下將詳細探討其相關性:

SPA 架構和打包入口點

在 SPA 架構中,應用程式基於單一 HTML 頁面運行,使用 JavaScript 驅動不同的部分。

Webpack 中的打包入口點通常對應於 SPA 的根組件(如 Vue 的根組件、React 的根元素 (root) )。

因此,main.[contenthash].js 代表了這個根組件所在的主要 JavaScript 檔案。

動態加載和程式碼拆分

在 SPA 架構中,我們經常希望按需加載適當的 module(模組),以提高頁面載入速度和資源利用。

Webpack 具有程式碼拆分功能,可以將應用程式拆分為不同的 chunks(程式碼塊),這些 chunks 可以在需要時動態加載。

在這種情況下,main.[contenthash].js 可能包含應用程式的主要邏輯,而其他 module 則根據需要以獨立的 chunks 加載。

例子:

假設使用 Vue 開發了一個 SPA,並將 main.js 設置為 Webpack 的打包入口點。

在打包過程中,Webpack 會根據 main.js 和其他相依 module 生成 main.[contenthash].js

這個 main.[contenthash].js 檔案將包含 Vue 的主要邏輯以及自己的應用程式的程式碼。

如果使用了 Vue Router,它可能會被拆分為另一個 chunks,以實現按需加載路由組件。

熱模組替換(HMR)

在開發過程中,我們通常希望實現熱模組替換,即在不重整整個頁面的情況下實時更新程式碼。

Webpack 提供了熱模組替換(HMR)的功能,讓開發者能夠在修改程式碼時立即查看變更的效果。

main.[contenthash].js 可以利用 HMR 技術,實現僅更新變更的模組而不影響其他部分。

生產環境和程式碼優化

在生產環境中,SPA 架構需要最小化輸出檔案的大小,以提高頁面載入速度。

Webpack 提供了多種優化功能,如程式碼壓縮、提取公共模組、刪除未使用的程式碼等。

main.[contenthash].js 是經過優化的最終輸出檔案,它將只包含應用程式運行所需的最小化程式碼。

例子:

在 Vue 或 React 的生產環境中,main.[contenthash].js 經過優化並最小化,以提供更好的效能。

這意味著只包含必要的程式碼,並且可能使用壓縮算法減少檔案大小。


SPA 與原生 JS 結構有什麼差異

在單頁應用程式(SPA)和原生 JavaScript 結構之間,Webpack 的運作原理和功能是相同的,它們的差異在於結構和專案配置上的不同。

SPA 是一個以 JavaScript 驅動的單一 HTML 頁面應用程式,通常具有多個模組和路由,並使用 Ajax 或 API 進行資料交互。

原生 JavaScript 結構則可能是傳統的多頁面應用程式,每個頁面都有獨立的 HTML 和 JavaScript 文件。

Webpack 可以適應不同的結構和配置,並提供打包和優化前端資源的能力,無論是 SPA 還是原生 JavaScript 結構。

後記 - Epilogue

在本文中,我們深入瞭解了 main.[contenthash].js 的意義和作用,以及 Webpack 5 中使用 [contenthash] 取代 [hash] 的重要性。

通過本文的探討,我們了解到 [contenthash] 的生成方式和如何解決瀏覽器快取問題。

確保瀏覽器下載最新版本的應用程式對於提供最佳的用戶體驗至關重要。

同時我們探討了 main.[contenthash].js 在網頁應用程式中的重要性,尤其是在單頁應用程式(SPA)架構中的關聯性。

從動態加載、程式碼拆分、熱模組替換到生產環境優化,main.[contenthash].js 在這些方面扮演著重要角色。

總結,適當地配置 [contenthash] 可以確保瀏覽器始終載入最新版本的應用程式,提供穩定性、效能和最佳用戶體驗。

謹記使用 Webpack 5 中的 [contenthash],以確保正確且可靠的應用程式部署。

希望本文整理能在開發過程中獲得更好的控制和優化。

結尾老話,想了解更多或是資訊版本錯誤,一切以官方檔案為主YO

這只是筆記!筆記!筆記!因為很重要所以說三次

參考資料 - Reference

[1] webpack

https://webpack.js.org/

[2] Caching | webpack

https://webpack.js.org/guides/caching/

[1] 頁面緩存設定 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

https://ithelp.ithome.com.tw/articles/10200454

[2] Webpack 4: hash and contenthash and chunkhash, when to use which? - Stack Overflow

https://stackoverflow.com/questions/59194365/webpack-4-hash-and-contenthash-and-chunkhash-when-to-use-which

深入理解 Webpack:main.[contenthash].js 與 SPA

https:///en/blog/76

Author

Kama

Read more from Tech
lightbox-image
Toggle Button - Red Pandas Icons by svgrepo.com

Copyrights © 2023 Kama, All Rights Reserved.