webpack二刷之五、生產環境優化(6.輸出文件名Hash substitutions)

輸出文件名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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章