不要再傻傻分不清 hash、 chunkhash 和 contenthash 啦
hash、contenthash 和 chunkhash 是通过散列函数处理之后,生成的一串字符,可用于区分文件。
文件名不带哈希值
webpack.config.js 文件中,output 中定义输出 js 文件命名,plugins 中定义的抽取 css 文件命名
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
// 部分配置省略
entry: {
index: './src/index.js',
main: './src/main.js',
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, "./dist"),
},
plugins: [
new MiniCssExtractPlugin({
filename: './[name].css',
}),
],
};
在 index.js 中使用 axios 发送请求,main.js 中引入 index.css资源
src
├─ index.css
├─ index.js
└─ main.js
编译后,虽然我们自己定义的 css 文件名为 index.css,但是由于它被 main.js引入了,所以打包出来的文件名变成了 main.css。
559.js 是单独打包的第三方库 axios。

每一次编译后,生成的文件名都一样,这样会存在一个问题,通过 webpack 编译生成的静态文件会被我们放置到服务器中,当编译后的文件更新时,由于浏览器或者服务器设置的缓存策略,同名文件可能不会立刻被更新,导致用户访问到的仍然是上一次的版本。
hash
为了解决这个问题,我们通常会在文件名上加一些哈希值,保证当更新文件时,浏览器会重新下载资源。这里使用 hash 这个占位符
module.exports = {
// 部分配置省略
output: {
filename: '[name]_[hash].js',
path: path.resolve(__dirname, "./dist"),
},
plugins: [
new MiniCssExtractPlugin({
filename: './[name]_[hash].css',
}),
],
};
此时 js 和 css 文件都加上了一串相同的哈希值。

当项目里没有文件发生改变时,无论如何重新编译,文件哈希值都不会变。但此时,改变了 index.js 文件,增加一句输出,所有文件的哈希值都会同时改变。

所有文件的哈希值都发生了变化,导致即使只更新了一个文件都需要重新加载所有资源,还是有些浪费性能的。
chunkhash
这里是多入口的项目,只改变了 index.js 这个入口,不希望 main.js 入口的文件也被修改,就可以使用占位符 chunkhash 来解决,另外哈希值比较长,截取八位显示。
module.exports = {
// 部分配置省略
output: {
filename: '[name]_[chunkhash:8].js',
path: path.resolve(__dirname, "./dist"),
},
plugins: [
new MiniCssExtractPlugin({
filename: './[name]_[chunkhash:8].css',
}),
],
};
可以看到同一个 chunk 打包出来的哈希值是一样的

当修改了 css 文件时,只有同 chunk 的 main.js 和 main.css 文件的哈希值发生了改变

css 文件是在 main.js 这个 chunk 的,但其实 main.js 本身没有发生任何修改,可以不用重新加载。
contenthash
同一个 chunk 中,部分文件修改导致所有文件的哈希值发生变化的问题,可以使用 contenthash 来解决,contenthash 只和每一个文件的内容有关,内容发生变化,则重新生成哈希值。
module.exports = {
// 部分配置省略
output: {
filename: '[name]_[contenthash:8].js',
path: path.resolve(__dirname, "./dist"),
},
plugins: [
new MiniCssExtractPlugin({
filename: './[name]_[contenthash:8].css',
}),
],
};
每一个文件生成的哈希值都不一样

在 main.js 中增加一行输出,引入的 css 内容没有发生变化,css 文件也不会更改哈希值。

总结
在 webpack 中有三种生成哈希值规则的方式,可以用来区分文件是否修改。
- hash 与整个项目有关,项目里有文件修改,所有文件的哈希值都会变化。
- chunkhash 与入口有关,同一入口的文件被视为一个整体,当其中一个文件修改时,同入口的所有文件哈希值发生改变。
- contenthash 只与文件内容有关,文件内容发生改变,才会更改该文件的哈希值。
善用文件的哈希值,解决浏览器缓存导致的资源未及时更新的问题。
以上就是 webpack 中 hash、 chunkhash 和 contenthash 的介绍,更多有关 webpack 的内容可以参考我其它的博文,持续更新中~
不要再傻傻分不清 hash、 chunkhash 和 contenthash 啦的更多相关文章
- cookie、session,、token,还在傻傻分不清?
摘要:session 和 token 本质上是没有区别的,都是对用户身份的认证机制,只是他们实现的校验机制不一样而已. 本文分享自华为云社区<Session/Cookie/Token 还傻傻分不 ...
- 【jvm】08-垃圾回收器那么多傻傻分不清?
[jvm]08-垃圾回收器那么多傻傻分不清? 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点 ...
- MVP MVC MVVM 傻傻分不清
最近MVC (Model-View-Controller) 和MVVM (Model-View-ViewModel) 在微软圈成为显学,ASP.NET MVC 和WPF 的Prism (MVVM Fr ...
- [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!
十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...
- OCA,OCP,OCM傻傻分不清?
可能大家知道OCA.OCP.OCM的关系是一个比一个难考,一个比一个含金量高,但是你知道具体的考试科目.考试方式.就业形势区别吗?不知道的话这篇通俗易懂的文章会让你一目了然. 区别一:含金量 ■OCA ...
- 学点经济学:M0、M1、M2、M3,傻傻分不清?(转载)
来源:http://t.10jqka.com.cn/pid_97006727.shtml 学点经济学:M0.M1.M2.M3,傻傻分不清? 25,508人浏览 2018-08-03 11:06 常听人 ...
- ASCII、Unicode、UTF-8、UTF-8(without BOM)、UTF-16、UTF-32傻傻分不清
ASCII.Unicode.UTF-8.UTF-8(without BOM).UTF-16.UTF-32傻傻分不清 目录 ASCII.Unicode.UTF-8.UTF-8(without BOM). ...
- session cookie傻傻分不清
做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说会简单很多. 下面这篇文章希望能够帮助大家分 ...
- 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...
- 傻傻分不清之 Cookie、Session、Token、JWT
傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打 ...
随机推荐
- Prism Sample 5 View Injection
这里稍微复杂了点,定义视图A的过程是一样的: <UserControl x:Class="ViewInjection.Views.ViewA" xmlns="htt ...
- Prism Sample 3 自定义Region
在例2中,我们使用了一个Region <ContentControl prism:RegionManager.RegionName="ContentRegion" /> ...
- 2022-11-02:以下go语言代码输出什么?A:编译错误;B:apple;C:ant;D:panic。 package main import “fmt“ func main() {
2022-11-02:以下go语言代码输出什么?A:编译错误:B:apple:C:ant:D:panic. package main import "fmt" func main( ...
- 2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。 实现 MajorityChecker 类
2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 . 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素. 实现 MajorityChecker 类 ...
- 2020-09-29:介绍volatile功能。
福哥答案2020-09-29:#福大大架构师每日一题# 功能如下:1.内存可见.2.禁止指令重排序. 实现如下:1.字节码层面 ACC_VOLATILE 2.JVM层面volatile内存区的读写 都 ...
- 2022-06-04:给定一个数字n,表示一开始有编号1~n的树木,列成一条直线, 给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围, 给定一个数字m,表示你可以补种多
2022-06-04:给定一个数字n,表示一开始有编号1~n的树木,列成一条直线, 给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围, 给定一个数字m,表示你可以补种多 ...
- 500行代码手写docker-以新命名空间运行程序
(2)500行代码手写docker-以新命名空间运行程序 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似do ...
- JSPModel
JSPModel what JSP开发模型就是JSP Model,是用JSP语言写的 why 为了更好地使用jsp技术开发 How JSPModel1 Why 因为在jsp开发中,包含了数据处理/业务 ...
- jq如何将获取到的css属性值变为int类型
情况 小王:诶诶诶?我用js中css方法获取到的属性值怎么判断错误了呀?怎么办怎么办? Allen:害,小王,你是不是没有注意左右两边的类型,会不会是数据类型不一致导致的? 事故现场: if($(&q ...
- 代码随想录算法训练营Day31 贪心算法| 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录算法训练营 理论基础 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优. 每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优. 贪心的套路(什么时候用贪心) 贪心 ...