【Webpack】实现持久化缓存

回答重点

在 Webpack 中实现持久化缓存有几个关键策略,最核心的就是利用文件内容哈希,使得文件名发生变化,这样浏览器就会识别为新的资源而不是使用缓存的旧资源。具体步骤如下:

1)使用 output.filename 和 output.chunkFilename 配置项来添加哈希:

javascript 复制代码
output: {
  filename: '[name].[contenthash].js',
  chunkFilename: '[name].[contenthash].js',
}

2)使用合适的插件来优化缓存,例如 HtmlWebpackPlugin 生成带有哈希的文件引用,以及 MiniCssExtractPlugin 用于 CSS 文件名哈希:

javascript 复制代码
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

plugins: [
  new HtmlWebpackPlugin({
    template: './src/index.html',
  }),
  new MiniCssExtractPlugin({
    filename: '[name].[contenthash].css',
  }),
]

3)开启长效缓存管理:使用 webpack.NamedModulesPlugin 和 webpack.HashedModuleIdsPlugin,确保模块id在内容不变的情况下保持一致:

javascript 复制代码
optimization: {
  moduleIds: 'hashed',
}
plugins: [
  new webpack.HashedModuleIdsPlugin(),
]

4)分离供应商代码(第三方库)和应用代码,利用 SplitChunksPlugin:

javascript 复制代码
optimization: {
  splitChunks: {
    chunks: 'all',
  },
}

扩展知识

在实现持久化缓存方面,我们可以进一步优化和理解一些概念和工具:

1)Contenthash 与 Chunkhash :了解 contenthash 和 chunkhash 的区别至关重要。contenthash 是基于文件内容生成的哈希,任何内容改变都会导致哈希变化。而 chunkhash 则是基于整个 chunk 的内容进行哈希计算。

2)缓存优化策略:

  • 浏览器缓存 :配置 HTTP 头,如 Cache-Control 和 ETag,使得浏览器缓存策略与文件名哈希结合,进一步提升缓存效率。
  • Service Worker :利用 Service Worker 缓存策略,通过 Workbox 等工具实现更细粒度的缓存控制。

3)Tree Shaking 和 Dead Code Elimination:

  • 使用 mode: 'production' 和 TerserWebpackPlugin 来启用 Tree Shaking 和去除无用代码,减少最终产出文件体积。

4)Differential Loading :针对不同的浏览器特性生成不同的构建版本 (现代浏览器和旧版浏览器),利用 @babel/preset-env 的 targets 选项和 Webpack 的 environment 目标进行指导。

5)Monitor Cache Performance:使用工具如 Lighthouse 来分析和评估缓存性能,从具体的报告中找出改进点。

相关推荐
梦曦i9 分钟前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app x
Amos_Web14 分钟前
Rspack 源码解析(三十四):rspack_hook 与宏系统如何用过程宏生成异步 Hook 与插件
前端
恋猫de小郭17 分钟前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
wordbaby22 分钟前
为什么 Apifox 能调通,浏览器却报跨域?一次“CORS Error + 403”联调排坑实录
前端
2603_9658966229 分钟前
JavaScript 原型与原型链
开发语言·前端·javascript
Amos_Web29 分钟前
通过 Rspack 源码学 Rust(四):用 `Option<T>` 表达“查询可能没有结果”
前端
朋友圈自动点赞工具35 分钟前
Ruby方法查找:对象不存方法
开发语言·前端·ruby·科技资讯
晓得迷路了39 分钟前
栗子前端技术周刊第 152 期 - Rspack 2.3、TypeScript 7.1 Beta、Bun 1.4.4...
前端·javascript·css
普通人61 小时前
CSS-box-sizing-使用指南
开发语言·前端·css·1024程序员节
风骏时光牛马1 小时前
AI开源工具一站式尝鲜体验
前端