缓存的概念:
现代的Web应用的性能其实很大程度上是建立在缓存的基础上的,而其中最为常见的一种最大化利用缓存的形式就是为静态资源加上hash(一个不会重复的标识符MD5值),如果文件内容发生改变的话,那么对应文件hash值也会改变,对应的HTML引用的URL地址也会改变,触发CDN服务器从原服务器上拉取对应数据,否则资源可以永久缓存的目的。
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文件没有被修改。