详解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 相关文章推荐
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
基于jquery点击自以外任意处,关闭自身的代码
Feb 10 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
Mar 21 Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 Javascript
javascript确认框的三种使用方法
Dec 17 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
JQuery事件委托原理与用法实例分析
May 13 jQuery
详解nvm管理多版本node踩坑
Jul 26 Javascript
如何理解Vue简单状态管理之store模式
May 15 Vue.js
浅谈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
php array_walk() 数组函数
2011/07/12 PHP
PHP new static 和 new self详解
2017/02/19 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
javascript几个易错点记录
2014/11/26 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
python pyheatmap包绘制热力图
2018/11/09 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
Python新手学习装饰器
2020/06/04 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
10张动图学会python循环与递归问题
2021/02/06 Python
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
上课说话检讨书大全
2014/01/22 职场文书
党课培训主持词
2014/04/01 职场文书
个人贷款收入证明
2014/10/26 职场文书
会计工作总结范文2014
2014/12/23 职场文书
保洁员岗位职责
2015/02/04 职场文书
小学元宵节活动总结
2015/02/06 职场文书
信用卡工作证明范本
2015/06/19 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
一条 SQL 语句执行过程
2022/03/17 MySQL