详解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游戏之优化篇
Nov 08 Javascript
JavaScript截取字符串的2个函数介绍
Aug 27 Javascript
一个jquery实现的不错的多行文字图片滚动效果
Sep 28 Javascript
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
jQuery无缝轮播图代码
Dec 22 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
Dec 22 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
Dec 31 Javascript
angular使用post、get向后台传参的问题实例
May 27 Javascript
小程序日历控件使用方法详解
Dec 29 Javascript
使用JavaScript实现贪吃蛇游戏
Sep 29 Javascript
vue中watch的用法汇总
Dec 28 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
再说下636单管机
2021/03/02 无线电
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
three.js 入门案例详解
2018/01/23 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
Django内容增加富文本功能的实例
2017/10/17 Python
深入理解Django的中间件middleware
2018/03/14 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
Java面试题汇总
2015/12/06 面试题
大学生实习感言
2014/01/16 职场文书
人事助理自荐信
2014/02/02 职场文书
招股说明书范本
2014/05/06 职场文书
火灾现场处置方案
2014/05/28 职场文书
婚宴主持词
2015/06/30 职场文书
《观察物体》教学反思
2016/02/17 职场文书
门面租赁合同范文
2019/08/06 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书