首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第5章 样式处理
5.1 分离样式文件
5.1.1 extract-text-webpack-plugin
5.1.2 多样式文件的处理
5.1.3 mini-css-extract-plugin
5.2 样式预处理
5.2.1 Sass与SCSS
5.2.2 Less
5.3 PostCSS
5.3.1 PostCSS与Webpack
5.3.2 自动前缀
5.3.3 stylelint
5.3.4 CSSNext
5.4 CSS Modules
第6章 代码分片
6.1 通过入口划分代码
6.2 CommonsChunkPlugin
6.2.1 提取vendor
6.2.2 设置提取范围
6.2.3 设置提取规则
6.2.4 hash与长效缓存
6.2.5 CommonsChunkPlugin的不足
6.3 optimization.SplitChunks
6.3.1 从命令式到声明式
6.3.2 默认的异步提取
6.3.3 配置
6.4 资源异步加载
6.4.1 import()
6.4.2 异步chunk的配置
第7章 生产环境配置
7.1 环境配置的封装
7.2 开启production模式
7.3 环境变量
7.4 source-map
7.4.1 source-map原理
7.4.2 source-map配置
7.4.3 source-map安全
7.5 资源压缩
7.5.1 压缩JavaScript
7.5.2 压缩CSS
7.6 缓存
7.6.1 资源hash
7.6.2 输出动态HTML
7.6.3 使chunk id更稳定
7.7 bundle体积监控和分析
第8章 打包优化
8.1 HappyPack
8.1.1 工作原理
8.1.2 单个loader的优化
8.1.3 多个loader的优化
8.2 缩小打包作用域
8.2.1 exclude和include
8.2.2 noParse
8.2.3 IgnorePlugin
8.2.4 缓存
8.3 动态链接库与DllPlugin
8.3.1 vendor配置
8.3.2 vendor打包
8.3.3 链接到业务代码
8.3.4 潜在问题
8.4 去除死代码
8.4.1 ES6 Module
8.4.2 使用Webpack进行依赖关系构建
8.4.3 使用压缩工具去除死代码
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(中)
小册名称:Webpack实战:入门、进阶与调优(中)
### 7.6 缓存 在Web开发的广阔领域中,缓存是一项至关重要的技术,它直接关系到网页的加载速度、用户体验以及服务器的负载压力。对于使用Webpack这类现代前端构建工具的项目而言,合理应用缓存策略不仅能够显著提升开发效率,还能在生产环境中大幅减少资源加载时间,提升应用的性能。本章将深入探讨Webpack中的缓存机制,包括其工作原理、配置策略以及优化实践,帮助读者从入门到进阶,最终实现高效的缓存调优。 #### 7.6.1 理解缓存的意义 在Web开发中,缓存是指将网页请求的资源(如HTML、CSS、JavaScript、图片等)存储在用户本地或网络上的某个位置,以便在后续请求时能够直接从缓存中快速获取,而无需再次从服务器下载。这种机制可以显著减少网络延迟和数据传输量,提升页面加载速度。对于Webpack而言,缓存的应用不仅限于最终产物(bundle文件)的缓存,还涉及到构建过程中的缓存,以减少重复构建的时间。 #### 7.6.2 Webpack中的缓存类型 Webpack中的缓存主要分为两类:构建缓存(Build Cache)和输出缓存(Output Caching)。 - **构建缓存**:指的是Webpack在构建过程中,将解析、编译、打包等中间环节的结果缓存起来,以便在下次构建时复用,从而减少重复工作。构建缓存极大地提升了开发构建的速度,尤其是在大型项目中效果尤为明显。 - **输出缓存**:则是指对Webpack打包生成的最终产物(如bundle文件)进行缓存,这些文件通常会被浏览器缓存,以减少用户的加载时间。输出缓存不仅依赖于Webpack的配置,还受到HTTP缓存头部(如Cache-Control、ETag、Last-Modified等)的影响。 #### 7.6.3 构建缓存的配置与优化 ##### 7.6.3.1 开启构建缓存 Webpack 4及以上版本默认开启了构建缓存功能,但你可以通过配置`cache`选项来更细致地控制它。例如,你可以指定缓存的类型(如`filesystem`、`memory`)、缓存的位置以及缓存的清理策略等。 ```javascript module.exports = { // ... cache: { type: 'filesystem', // 使用文件系统缓存 buildDependencies: { config: [__filename] // 指定哪些文件变更时需要重新构建 }, cacheDirectory: path.resolve(__dirname, '.cache'), // 缓存目录 cacheIdentifier: 'some-unique-string' // 缓存标识符,用于控制缓存的失效 } }; ``` ##### 7.6.3.2 优化构建缓存 - **合理设置缓存标识符**:通过`cacheIdentifier`可以确保在配置文件或相关依赖更改时,缓存能够失效并重新构建。 - **定期清理缓存**:根据项目实际情况,定期清理旧的缓存数据,避免占用过多磁盘空间。 - **使用稳定的依赖版本**:避免频繁更改项目依赖,以减少缓存失效的频率。 #### 7.6.4 输出缓存的配置与优化 ##### 7.6.4.1 Webpack生成的资源缓存 Webpack本身并不直接控制浏览器对资源的缓存,但它可以通过生成包含缓存控制指令的文件名或Hash值来辅助浏览器缓存。 - **ContentHash**:为文件内容生成一个唯一的Hash值,只有当文件内容发生变化时,Hash值才会改变。这有助于浏览器区分文件是否已更新,从而决定是否从缓存中加载。 ```javascript output: { filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].js' } ``` - **Manifest Hash**:Webpack还可以生成一个包含所有文件及其Hash的manifest文件,这样即使文件名发生变化,也可以通过manifest快速找到对应的资源。 ##### 7.6.4.2 HTTP缓存头部 在服务器层面,通过配置适当的HTTP缓存头部(如Cache-Control、ETag、Last-Modified)来控制资源的缓存行为。这些头部信息会随资源一起发送给浏览器,指示浏览器如何缓存和验证资源。 - **Cache-Control**:最强大的HTTP缓存控制头部,可以指定缓存的有效期、是否允许缓存协商等。 - **ETag**:实体标签,用于资源的唯一标识。浏览器在发起请求时会带上这个ETag值,服务器通过比较ETag值来判断资源是否发生变化。 - **Last-Modified**:资源的最后修改时间。浏览器在请求资源时会带上这个时间戳,服务器通过比较时间戳来判断资源是否更新。 #### 7.6.5 缓存策略与实践 ##### 7.6.5.1 缓存策略选择 - **强缓存策略**:通过Cache-Control的max-age指令设置较长的缓存时间,适用于不常变化的资源,如库文件、静态图片等。 - **协商缓存策略**:结合ETag或Last-Modified头部,实现资源的条件请求,适用于经常更新但更新内容不大的资源。 ##### 7.6.5.2 实践案例 假设你正在开发一个大型Web应用,其中包含大量的静态资源和动态数据。你可以采用以下策略来优化缓存: - **对静态资源使用强缓存**:如CSS、JS库文件、图片等,通过Webpack配置生成带有ContentHash的文件名,并在服务器配置中设置较长的Cache-Control max-age值。 - **对动态资源使用协商缓存**:如API接口返回的数据,可以在HTTP响应中包含ETag或Last-Modified头部,客户端在请求时带上这些值,服务器根据值的变化决定是否返回新数据。 - **利用CDN加速**:将静态资源部署到CDN上,利用CDN的边缘节点缓存减少用户到服务器的请求距离,同时CDN也支持复杂的缓存策略配置。 #### 7.6.6 总结 缓存是提升Web应用性能的关键技术之一,对于使用Webpack构建的项目而言,合理利用构建缓存和输出缓存能够显著提升开发效率和用户体验。通过合理配置Webpack的缓存选项,以及结合HTTP缓存头部和CDN服务,我们可以实现高效的缓存策略,为应用带来更快的加载速度和更好的用户体验。然而,缓存策略并非一成不变,它需要根据项目的实际情况和用户需求进行调整和优化,以达到最佳效果。
上一篇:
7.5.2 压缩CSS
下一篇:
7.6.1 资源hash
该分类下的相关小册推荐:
Webpack零基础入门
全解webpack前端开发环境定制
Webpack实战:入门、进阶与调优(上)
webpack指南
Webpack实战:入门、进阶与调优(下)