我們知道,webpack可以輸出的文件名有三種,hash
、chunkhash
和contenthash
,但是這三者的區別是什麼呢?
在此之前,我們需要先了解緩存的概念。
現代的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