面试题答案
一键面试缓存策略设计
- 开发环境
- 目标:快速更新,不依赖缓存,方便调试。
- 策略:禁用缓存或设置较短的缓存时间。在Webpack配置中,可以通过设置
devServer
的headers
来控制缓存。例如:
devServer: {
headers: {
'Cache - Control': 'no - cache, no - store, must - revalidate',
'Pragma': 'no - cache',
'Expires': '0'
}
}
- 测试环境
- 目标:模拟生产环境缓存,同时能在必要时快速更新。
- 策略:使用较长的缓存时间,但通过版本控制或查询参数来强制更新。可以利用Webpack的
file-loader
或url-loader
为图片和字体资源添加版本哈希。例如:
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif|woff|woff2|eot|ttf|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash:8].[ext]'
}
}
]
}
]
}
}
这样当资源内容改变时,哈希值改变,浏览器会重新请求资源。 3. 生产环境 - 目标:最大化缓存命中率,提高性能,同时能及时更新资源。 - 策略: - 长期缓存:对于不常改变的图片和字体,设置较长的缓存时间,如一年。通过给资源文件名添加哈希值,确保内容不变时浏览器使用缓存。 - 缓存更新:当资源内容改变时,新的哈希值会导致浏览器重新下载资源。例如,可以结合CDN,在CDN上配置合适的缓存策略,对于带有哈希值的资源设置长期缓存。
涉及的Webpack插件及配置选项
- file-loader
- 原理:将文件输出到指定目录,并返回文件的URL。它可以通过
name
选项来设置输出文件名的格式,如添加哈希值。 - 配置:
- 原理:将文件输出到指定目录,并返回文件的URL。它可以通过
{
test: /\.(png|jpg|gif|woff|woff2|eot|ttf|otf)$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash:8].[ext]',
outputPath: 'assets/'
}
}
]
}
- url-loader
- 原理:类似
file-loader
,但当文件较小时,可以将文件转换为Data URL嵌入到代码中,减少请求数量。 - 配置:
- 原理:类似
{
test: /\.(png|jpg|gif|woff|woff2|eot|ttf|otf)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192, // 文件小于8kb时转为Data URL
name: '[name].[hash:8].[ext]',
outputPath: 'assets/'
}
}
]
}
- html - webpack - plugin
- 原理:自动生成HTML文件,并将打包后的资源注入到HTML中。在处理图片和字体资源时,确保它们正确引入到HTML中,结合上述
file-loader
或url-loader
生成的带哈希值的文件名,实现缓存控制。 - 配置:
- 原理:自动生成HTML文件,并将打包后的资源注入到HTML中。在处理图片和字体资源时,确保它们正确引入到HTML中,结合上述
const HtmlWebpackPlugin = require('html - webpack - plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
]
}