webpack中hash、chunkhash和contenthash

我們知道,webpack可以輸出的文件名有三種,hashchunkhashcontenthash,但是這三者的區別是什麼呢?

在此之前,我們需要先了解緩存的概念。

現代的Web應用的性能其實很大程度上是建立在緩存的基礎上的,而其中最爲常見的一種最大化利用緩存的形式就是爲靜態資源加上hash(一個不會重複的標識符MD5值),如果文件內容發生改變的話,那麼對應文件hash值也會改變,對應的HTML引用的URL地址也會改變,觸發CDN服務器從原服務器上拉取對應數據,否則資源可以永久緩存的目的。

hash的重要性在於它決定了是否更新本地緩存,進一步決定了緩存的利用率。言歸正傳,繼續說hash。

1. hash

hash是項目級別的,它的計算和整個項目的構建有關,固此構建生成的文件hash一樣。即每次修改任何一個文件,所有文件名的hash都將改變。假如修改了任何一個文件,整個項目的文件緩存都將失效。

2. chunkhash

chunkhash是模塊級別的,它根據不同的入口文件(Entry)進行依賴文件解析、構建對應的chunk,生成對應的hash值。

我們在生產環境裏把一些公共庫和程序入口文件區分開,單獨打包構建,接着我們採用chunkhash的方式生成hash值,那麼只要我們不改動公共庫的代碼,就可以保證其hash值不會受影響。

3. contenthash

contenthash是文件內容級別的,只有文件的內容變了,contenthash值才改變。在項目中,通常做法是把項目中css都抽離出對應的css文件來加以引用。因爲假如對css使用chunkhash之後,它與依賴它的共用chunkhash,如果我修改了css文件,也會導致js重新構建,即使js文件沒有被修改。

webpack4.3版本引入了contenthash

參考:
https://github.com/sorrycc/roadhog/issues/510
https://zhuanlan.zhihu.com/p/35093098

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