详解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 相关文章推荐
基于jQuery的js分页代码
Jun 10 Javascript
javascript中的作用域和上下文使用简要概述
Dec 05 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
easyui validatebox验证
Apr 29 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
Dec 28 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
VuePress 快速踩坑小结
Feb 14 Javascript
详解微信小程序开发用户授权登陆
Apr 24 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
Vue数据驱动模拟实现2
2017/01/11 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
Python实现类的创建与使用方法示例
2017/07/25 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
浪费资源的建议书
2014/03/12 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
高一学生期末评语
2014/04/25 职场文书
环境科学专业求职信
2014/08/04 职场文书
购房协议书范本
2014/10/02 职场文书
小学班级管理心得体会
2016/01/07 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
小学科学课教学反思
2016/02/23 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python