详解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 使用手册(四)
Sep 23 Javascript
js拦截alert对话框另类应用
Jan 16 Javascript
JS图片切换的具体方法(带缩略图版)
Nov 12 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
Mar 24 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
js弹出对话框方式小结
Nov 17 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
Apr 25 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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实现从上传文件创建缩略图的方法
2015/04/02 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
javascript求日期差的方法
2016/03/02 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
如何快速上手Vuex
2017/02/14 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
python基于http下载视频或音频
2018/06/20 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
Python上下文管理器Content Manager
2021/06/26 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang