輸出文件名Hash substitutions
一般部署前端的資源文件時,都會啓用服務器的靜態資源緩存。
這樣用戶的客戶端就可以緩存應用的靜態資源,後續就不再需要重複請求服務器獲取靜態資源文件。
從而整體提上了應用的響應速度。
不過開啓服務器的靜態資源緩存也有一些需要注意的地方:
如果在緩存策略中設置的失效時間過短,效果就不會特別明顯。
如果設置的比較長,一旦這個應用發生了更新,重新部署過後,就沒有辦法及時更新到客戶端。
爲了解決這個問題,建議在生產環境中,在輸出的文件名中添加哈希值(Hash)。
一旦資源文件發生改變,文件名稱也會隨之變化。
對於客戶端而言,新的文件名就會發生新的請求,也就沒有緩存,從而實現客戶端及時更新。
這樣就可以將緩存策略中的過期時間設置的非常長,而不用擔心文件更新的問題。
webpack的filename
屬性,和絕大多數插件的filename
屬性,都支持通過佔位符的方式爲文件名設置hash。
不過它們支持3中hash,效果各不相同:
[hash]
:項目級別的hash- 一旦項目中有任何改動,當前打包的hash就會發生變化
[chunhash]
:chunk級別的hash- 打包時,只要是同一路的chunk,使用的hash就是一樣的
- 動態導入的模塊都會形成一個單獨的chunk。這個chunk最終生成一個bundle(JS文件),如果配置了提取css文件,模塊中引用的css也會被提取到css文件中。但它名義上仍然屬於這個chunk。
- 例如:
- 通過動態導入方式會生成多個bundle,而這些JS模塊中引入的css,如果被提取爲css文件,使用的名稱與JS模塊一致,同樣,它們使用的chunkhash也一樣。
- 而生成的這些bundle使用的chunkhash就不一樣。
- 修改一個模塊的內容,只會更新這些文件的chunkhash
- 同一個chunk下的文件(js css)
- 使用了這個模塊的文件(因爲模塊名稱變化,所以這個文件中引入這個模塊的路徑也發生了變化,相當於被動改變)
- 相比
[hash]
,[chunkhash]
更精確一些
[contenthash]
:文件級別- 根據輸出文件的內容生成的hash
- 即不同的文件擁有不同的hash
- 它影響到的只有:
- 當前模塊生成的文件
- 使用這個模塊的文件
- 注意:
- 如果配置了提取CSS文件,css實際上沒有被包裹模塊的bundle中,而是在主bundle文件的執行方法中,通過link方式注入到html中。
- 所以此時修改css文件,只會更新自己和主bundle的hash,而不會影響引入它的子模塊。
[contenthash]
精確的定位到了文件級別的hash,只有當文件更新,纔會更新它的文件名或路徑。它最適合解決緩存問題。
hash長度默認20位,webpack允許通過在佔位符用添加冒號+一個數字的方式指定hash的長度。
建議使用8位就夠了:[contenthash:8]