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

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