首页
技术小册
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实战:入门、进阶与调优(中)
### 6.2.4 hash与长效缓存 在前端开发中,缓存是一个极其重要的概念,它不仅能够提升用户体验,减少页面加载时间,还能有效降低服务器的负载。Webpack作为一个现代JavaScript应用程序的静态模块打包器,自然提供了强大的缓存优化机制。其中,利用hash策略来实现资源的长效缓存,是Webpack优化策略中的一个核心环节。本章节将深入探讨Webpack中的hash机制,包括不同类型的hash及其应用场景,以及如何通过合理配置Webpack来实现资源的长效缓存。 #### 6.2.4.1 理解缓存与hash ##### 缓存的基本概念 缓存是指将数据(如网页、图片、文件等)存储在用户设备(如浏览器、CDN节点等)上,以便后续快速访问的过程。对于Web应用而言,缓存可以极大地减少数据的重复传输,加快页面加载速度。然而,缓存也带来了一个问题:如何确保当用户端缓存的数据是最新的? ##### hash的作用 在Webpack中,hash机制被用来生成文件内容的唯一标识符。每当文件内容发生变化时,其对应的hash值也会相应改变。这样,通过在URL中嵌入hash值,我们可以实现一种简单的缓存失效机制:当文件内容更新时,由于hash值的变化,浏览器将不会使用旧的缓存文件,而是请求服务器上的新版本。 #### 6.2.4.2 Webpack中的hash类型 Webpack提供了多种hash策略,以满足不同场景下的缓存优化需求。主要包括以下几种: ##### 1. `[hash]` 这是Webpack中最基本的hash类型,它基于整个构建过程的全部内容生成一个hash值。这意味着,即使项目中只有一个文件发生了变化,所有文件的hash值都会改变,从而导致所有文件都被重新下载。这种策略虽然简单,但在大型项目中并不高效,因为它无法利用缓存的优势来减少不必要的文件传输。 ##### 2. `[chunkhash]` 与`[hash]`不同,`[chunkhash]`是基于每个代码块(chunk)的内容生成的hash值。这意味着,只有当某个特定的代码块发生变化时,该代码块对应的文件hash值才会改变,而其他未变的代码块则可以继续使用缓存。这种策略更适合于代码拆分(code splitting)的场景,可以有效提升缓存效率。 ##### 3. `[contenthash]` `[contenthash]`是Webpack 4中引入的一种更精细的hash策略,它直接基于文件内容生成hash值。这种策略与`[chunkhash]`类似,但更加精确,因为它不考虑代码块之间的依赖关系,仅根据文件本身的内容来计算hash值。这使得即使两个代码块之间存在依赖关系,但只要它们的内容没有变化,它们的hash值就不会改变,进一步提高了缓存的利用率。 ##### 4. `[name]`、`[ext]`等其他占位符 除了上述基于内容的hash策略外,Webpack还允许在输出文件名中使用如`[name]`(文件名)、`[ext]`(文件扩展名)等占位符,以便在生成文件名时包含更多有用的信息。 #### 6.2.4.3 配置Webpack以实现长效缓存 为了利用hash策略实现资源的长效缓存,我们需要在Webpack配置文件中进行相应的设置。以下是一个基于Webpack 4/5的配置示例,展示了如何通过配置`output`字段来利用`[contenthash]`实现缓存优化: ```javascript module.exports = { // ... 其他配置 ... output: { // 指定输出目录 path: path.resolve(__dirname, 'dist'), // 使用[contenthash]来确保每次构建后,只有内容发生变化的文件hash值会改变 filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].chunk.js', // 如果你的项目还包含CSS等静态资源,也可以对它们进行hash处理 // 注意:对于CSS,可能需要额外的loader(如MiniCssExtractPlugin)来支持 // assetModuleFilename: 'assets/[name].[hash][ext]', // Webpack 5 新增 }, // 使用缓存组(caching groups)和分割代码(code splitting)等技术进一步优化缓存 optimization: { splitChunks: { chunks: 'all', }, // 其他优化配置... }, // 使用合适的插件来支持CSS等资源的hash处理 // 例如:MiniCssExtractPlugin、TerserPlugin等 plugins: [ // 插件配置... ], }; ``` 在上述配置中,我们使用了`[contenthash]`来确保每次构建后,只有内容发生变化的文件hash值会改变。这样,即使项目的其他部分发生了更改,只要某个文件的内容没有变化,用户就可以继续从缓存中加载该文件,从而减少了不必要的网络请求和数据传输。 #### 6.2.4.4 注意事项与最佳实践 1. **选择合适的hash策略**:根据项目的具体需求选择合适的hash策略。对于大多数项目而言,`[contenthash]`是一个很好的选择,因为它能够最大程度地利用缓存优势。 2. **缓存验证**:在部署新版本的应用时,务必进行缓存验证,确保新版本的资源能够正确覆盖旧版本的缓存。 3. **版本控制**:在项目中引入版本控制机制(如使用npm版本号),可以帮助跟踪和管理项目的变更历史,进一步辅助缓存策略的制定。 4. **利用CDN**:将静态资源部署到CDN上,可以进一步提升缓存效率和用户体验。CDN通常具有更广泛的网络覆盖和更快的响应速度,能够更快地为用户提供缓存资源。 5. **持续监控与优化**:通过持续监控应用的性能数据(如页面加载时间、缓存命中率等),及时调整和优化缓存策略,以确保应用始终保持良好的性能和用户体验。 总之,hash与长效缓存是Webpack中一项非常重要的优化技术。通过合理配置Webpack的hash策略,我们可以有效地利用缓存机制来减少不必要的网络请求和数据传输,从而提升应用的性能和用户体验。希望本章节的内容能够帮助你更好地理解和应用Webpack的缓存优化技术。
上一篇:
6.2.3 设置提取规则
下一篇:
6.2.5 CommonsChunkPlugin的不足
该分类下的相关小册推荐:
webpack指南
Webpack零基础入门
Webpack实战:入门、进阶与调优(上)
Webpack实战:入门、进阶与调优(下)
全解webpack前端开发环境定制