-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
概述
webpack
的指纹策略是通过给文件加上hash
后缀,做到当代码有修改时打包出来的文件后缀也会修改,从而可以把静态资源开启持久缓存,这样每次有更新的代码打包后生成的都是新的问题件,从而最大程度上使用缓存。
文件指纹类型
webpack
提供了三种hash
类似
Hash
Chunkhash
Contenthash
hash
和整个项目构建相关,只要一个文件有修改,整个项目的hash值就会改变。
例如
// webpack.prod.js
entry: {
index: "./src/index",
search: "./src/search"
},
output: {
path: path.join(__dirname, "dist"),
filename: "[name]_[hash:8].js",
publicPath: "./dist"
}
它的问题是当项目有多入口或者使用code spliting
,只要有一个文件修改打包的生成的js
代码hash
都会改变。不利于缓存。
chunkhash
模块的hash
,根据模块的修改才改变对应的hash
值。
根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk
,生成对应的哈希值。我们在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash
的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name]_[chunkhash:8].js'
},
contenthash
根据文件内容来定义hash
,文件内容不变,则contenthash
不变。
某个页面既有js
资源,又有css
资源。如果css
资源也使用Chunkhash
。如果修改了js
。由于css
资源使用了Chunkhash
,就会导致css
内容没有变化,发布上线的文件却发生了变化。因此,通常对css资源使用Contenthash
。这个时候可以使用mini-css-extract-plugin
里的contenthash
值,保证即使css
文件所处的模块里就算其他文件内容改变,只要css
文件内容不变,那么不会重复构建
module.exports = {
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name][chunkhash:8].js',
path: __dirname + '/dist'
},
plugins: [
new MiniCssExtractPlugin({
filename: `[name][contenthash:8].css`
}),
]
};
图片,字体文件的文件指纹设置
设置file-loader(或url-loader)
的name
,使用[hash]
图片,字体文件的hash
和css/js
资源的hash
概念不一样,图片,字体文件的hash
是由内容决定的
{
test: /\.(png|svg|jpg|gif)$/,
use: [{
loader: 'file-loader',
options: {
// [ext] 资源后缀名
name: 'img/[name][hash:8].[ext] '
}
}]
}