webpack的指纹策略是实现前端增量更新的方案之一。通过给文件加上hash后缀,从而最大程度上使用缓存
webpack提供三种hash生成方式:
hash:和整个项目构建相关,只要一个文件有修改,整个项目的hash值就会改变chunkHash:模块的hash,根据模块的修改才改变对应的hash值contentHash:文章内容修改才会改变的hash值
根据描述,我们已经可以大概区分用法,chunkHash可以用于js打包,contentHash可以用到css文件打包。我们实践一下。
1.Hash
目录
.
├── dist
├── package-lock.json
├── package.json
├── src
│ ├── page0.js
│ └── page1.js
└── webpack.config.js
webpack.config.js
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name]_[hash:8].js'
},
输出
page0.js,再输出一次
可以发现,两个文件的hash值都改变。这在实际开发中肯定是不满足我们的需求的,那么chunkHash这个时候就可上场了。
2.chunkHash
webpack.config.js
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name]_[chunkhash:8].js'
},
page0.js
page0.jshash发生了变化,page1并没有变化,那么意味着page1.js可以使用缓存。
但是在这又延伸出来一个问题,如果我的文件内有css内容呢?可不可以剥离?当js修改的时候,不影响css版本呢?当然是可以的,这就使用到contentHash
3.contentHash
我们在page0.js引入一个.scss文件
import './style.scss'
我们要做的的是剥离css文件,并添加contentHash,这里需要借助一个插件mini-css-extract-plugin,安装之后引入一下:
module: {
rules: [
{
test: /.scss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader'
]
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name]_[contenthash:8].css'
}),
],
};
打包看下
page1.js,再编译一次
page0.js文件的hash值修改了,并没有影响css文件。
over。
链接文章
webpack学习之路(五)loader初识及常用loader介绍
webpack学习之路(四)webpack-hot-middleware实现热更新
webpack学习之路(三)webpack-dev-middleware
webpack学习之路(二)webpack-dev-server实现热更新
I am moving forward.