详解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代码
Dec 09 Javascript
修改file按钮的默认样式实现代码
Apr 23 Javascript
JavaScript限定复选框的选择个数示例代码
Aug 25 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
js运动动画的八个知识点
Mar 12 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
AngularJS入门教程之表格实例详解
Jul 27 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
跨域请求两种方法 jsonp和cors的实现
Nov 11 Javascript
JavaScript中AOP的实现与应用
May 06 Javascript
JS实现可视化音频效果的实例代码
Jan 16 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中其他类型转化为Bool类型
2016/03/28 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
python基础教程之Hello World!
2014/08/29 Python
python实现的文件夹清理程序分享
2014/11/22 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
入党申请自荐书范文
2014/02/11 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android