详解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 相关文章推荐
驱动事件的addEvent.js代码
Mar 27 Javascript
javascript 函数式编程
Aug 16 Javascript
javascript 动态设置已知select的option的value值的代码
Dec 16 Javascript
Javascript new关键字的玄机 以及其它
Aug 25 Javascript
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
JavaScript中去掉数组中的重复值的实现方法
Aug 03 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
js一维数组、多维数组和对象的混合使用方法
Apr 03 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
AngularJS入门教程之路由与多视图详解
Aug 19 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
JavaScript 面向对象基础简单示例
Oct 02 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数据库中的所有表名的代码
2011/04/23 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
php文件上传的两种实现方法
2016/04/04 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
Element PageHeader页头的使用方法
2020/07/26 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python编程求质数实例代码
2018/01/31 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
详解flask表单提交的两种方式
2018/07/21 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
阿波罗盒子:Apollo Box
2017/08/14 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
安全标语大全
2014/06/10 职场文书
超级礼物观后感
2015/06/15 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
python文件与路径操作神器 pathlib
2022/04/01 Python