解密webpack的指纹“锁”

527 阅读3分钟

序言

当我们说起webpack 指纹锁,听起来就不知所措啊,都被这些高大上的词唬住了。其实并不是这样的,他到底是什么呢??无非就是hash值。接下来我们一起来探索下,我会结合代码以及实例来进行讲述

实例目录结构

图片.png

  • 我们会在webpack中配置两个入口:mian 以及main1
  • 在入口main中 通过import引入了两个文件brach.js, brach1.js

指纹锁探秘

1. 占位符使用

占位符名称含义
ext资源后缀名
name文件名称
path文件的相对路径
folder文件所在的文件夹
hash每次webpack构建时生成一个唯一的hash值
contenthash根据内容生成hash值,文件内容相同hash值就相同
chunkhash根据chunk生成hash值,来源于同一个chunk,则hash值就一样

2. hash值

  • 修改前打包hash值: 图片.png
  • 修改后打包hash值:

图片.png -- 其实我就修改了一个branch.js的打印值,导致了hash值发生了变化

3. contenthash 值

  • 修改前的hash值

图片.png

  • 修改后的hash值

图片.png

  • 只是将branch.js的进行修改,通过上面的截图我们可以看到,对应文件的hash值发生变化,导入这个文件的主入口的hash也发生了变化,其余的hash值不变的

4. chunkhash 值

  • 修改前的hash值

图片.png

  • 修改后的hash值

图片.png

  • 通过上述代码我们可以到,我只是修改了mian1.js 内容,这个入口的hash值发生了变化

指纹用途

hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值。如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CDN服务器从源服务器上拉取对应数据,进而更新本地缓存

  • 通过上述的描述可以看下,其实hash也是为了配合cdn以及其余的缓存的。

优缺点

  • hash值:如果使用hash的话,每次打包所有的文件共享一个hash值,一旦一个文件发生了变化,hash值重置,所有的文件名字都发生了变化,这样其实起不到缓存的作用
  • contenthash值:顾名思义只有文件内容发生了变化才会生成新的hash值,但是也是有问题存在的,使用chunkhash存在一个问题,就是当在一个JS文件中引入CSS文件,编译后它们的hash是相同的,而且只要js文件发生改变 ,关联的css文件hash也会改变,这个时候可以使用mini-css-extract-plugin里的contenthash值,保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建
  • chunkhash值:- chunkhash和hash不一样,它根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。我们在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响

结束语

以上是我自己对hash指纹锁的理解,如果不对的地方欢迎大家指正啊....