详解webpack中的hash、chunkhash、contenthash区别


Posted in Javascript onJanuary 05, 2018

hash、chunkhash、contenthash

hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值。如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CDN服务器从源服务器上拉取对应数据,进而更新本地缓存。但是在实际使用的时候,这几种hash计算还是有一定区别。
我们先建一个测试案例来模拟下:

项目结构

我们的项目结构很简单,入口文件index.js,引用了index.css。然后新建了jquery.js和test.js作为公共库。

//index.js

 require('./index.css')
 module.exports = function(){
  console.log(`I'm jack`)
  var a = 12
 }
//index.css

 .selected : {
   display: flex;
   transition: all .6s;
   user-select: none;
   background: linear-gradient(to bottom, white, black);
 }

接着我们修改webpack.config.js来模拟不同hash计算

hash

hash是跟整个项目的构建相关,只要项目里有文件更改,整个项目构建的hash值都会更改,并且全部文件都共用相同的hash值

var extractTextPlugin = require('extract-text-webpack-plugin'),
  path = require('path')
 
 module.exports = {
  context : path.join(__dirname,'src'),
  entry:{
  main: './index.js',
  vender:['./jquery.js','./test.js']
  },
  module:{
  rules:[{
   test:/\.css$/,
   use: extractTextPlugin.extract({
   fallback:'style-loader',
   use:'css-loader'
   })
  }]
  },
  output:{
  path:path.join(__dirname, '/dist/js'),
  filename: 'bundle.[name].[hash].js',
  },
  plugins:[
  new extractTextPlugin('../css/bundle.[name].[hash].css')
  ]
 }

根据上面的配置,我们执行webpack命令之后,可以得到下面的结果

采用hash计算的执行结果1:

详解webpack中的hash、chunkhash、contenthash区别

执行结果2:

详解webpack中的hash、chunkhash、contenthash区别

我们可以看到构建生成的文件hash值都是一样的,所以hash计算是跟整个项目的构建相关,同一次构建过程中生成的哈希都是一样的

chunkhash

采用hash计算的话,每一次构建后生成的哈希值都不一样,即使文件内容压根没有改变。这样子是没办法实现缓存效果,我们需要换另一种哈希值计算方式,即chunkhash。

chunkhash和hash不一样,它根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。我们在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响。

var extractTextPlugin = require('extract-text-webpack-plugin'),
  path = require('path')
 
 module.exports = {
  ...
  ...
  output:{
  path:path.join(__dirname, '/dist/js'),
  filename: 'bundle.[name].[chunkhash].js',
  },
  plugins:[
  new extractTextPlugin('../css/bundle.[name].[chunkhash].css')
  ]
 }

采用chunkhash计算的执行结果1:

详解webpack中的hash、chunkhash、contenthash区别

执行结果2:

详解webpack中的hash、chunkhash、contenthash区别

我们可以看到,由于采用chunkhash,所以项目主入口文件Index.js及其对应的依赖文件Index.css由于被打包在同一个模块,所以共用相同的chunkhash,但是公共库由于是不同的模块,所以有单独的chunkhash。这样子就保证了在线上构建的时候只要文件内容没有更改就不会重复构建

contenthash

在chunkhash的例子,我们可以看到由于index.css被index.js引用了,所以共用相同的chunkhash值。但是这样子有个问题,如果index.js更改了代码,css文件就算内容没有任何改变,由于是该模块发生了改变,导致css文件会重复构建。
这个时候,我们可以使用extra-text-webpack-plugin里的contenthash值,保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建。

var extractTextPlugin = require('extract-text-webpack-plugin'),
  path = require('path')
 
 module.exports = {
  ...
  ...
  output:{
  path:path.join(__dirname, '/dist/js'),
  filename: 'bundle.[name].[chunkhash].js',
  },
  plugins:[
  new extractTextPlugin('../css/bundle.[name].[contenthash].css')
  ]
 }

采用contenthash计算的执行结果1:

详解webpack中的hash、chunkhash、contenthash区别

执行结果2:

详解webpack中的hash、chunkhash、contenthash区别

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
常用js字符串判断方法整理
Oct 18 Javascript
jquery 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
php is_numberic函数造成的SQL注入漏洞
Mar 10 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
jQuery 实现评论等级好评差评特效
May 06 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
Apr 04 Javascript
js实现复制功能(多种方法集合)
Jan 06 Javascript
React组件中的this的具体使用
Feb 28 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
构建一个JavaScript插件系统
Oct 20 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
浅谈webpack对样式的处理
Jan 05 #Javascript
js实现HTML中Select二级联动的实例
Jan 05 #Javascript
详解tween.js 中文使用指南
Jan 05 #Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 #Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
Jan 05 #Javascript
vue 中directive功能的简单实现
Jan 05 #Javascript
浅谈React前后端同构防止重复渲染
Jan 05 #Javascript
You might like
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
js实现ATM机存取款功能
2020/10/27 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
附答案的Java面试题
2012/11/19 面试题
金士达面试非笔试
2012/03/14 面试题
小学班主任培训方案
2014/06/04 职场文书
排查整治工作方案
2014/06/09 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
搞笑婚前保证书
2015/02/28 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js