详解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 相关文章推荐
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
Nov 13 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
JQuery EasyUI的一些常用组件
Jul 12 jQuery
基于JSONP原理解析(推荐)
Dec 04 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 Javascript
微信小程序实现日历效果
Dec 28 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
vue中使用props传值的方法
May 08 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
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
js 省地市级联选择
2010/02/07 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
jQuery插件扩展操作入门示例
2017/01/16 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
几行js代码实现自适应
2017/02/24 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
建筑系毕业生自我鉴定
2014/01/24 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
bat批处理之字符串操作的实现
2022/03/16 Python