webpack学习-6.缓存

webpack学习-6.缓存

  • 1.前言
  • 2.输出文件的文件名
  • 3. 提取引导模板
  • 4.模块标识符
  • 5.总结

1.前言

webpack 会在打包后生成可部署的 /dist 目录,并将打包后的内容放在此目录。一旦 /dist 目录中的内容部署到服务器上,客户端(通常是浏览器)就能够访问此服务器以获取站点及其资源。由于获取服务器资源是比较耗费时间的操作,因此浏览器使用了一种名为 缓存 的技术。命中缓存可以降低网络流量,使网站加载速度更快。然而,如果在部署资源的最新版本时没有更改资源的文件名,浏览器可能会认为它没有被更新,从而使用它的缓存版本。由于缓存的存在,当需要获取新的代码时,就会显得很棘手。

这篇指南的重点在于通过必要配置确保 webpack 编译生成的文件能够被客户端缓存;当文件内容变化后,客户端又能够请求到新的文件。

2.输出文件的文件名

更改 output.filename 中的 substitutions 以定义输出文件的名称。webpack 提供了一种称为 可替换模板字符串(substitution) 的方式,通过带括号字符串来模板化文件名。其中,[contenthash] 将根据资源内容创建唯一哈希值。当资源内容发生变化时,[contenthash] 也会发生变化。
webpack配置文件:

  const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',plugins: [new HtmlWebpackPlugin({title: 'Caching',}),],output: {filename: '[name].[contenthash].js',path: path.resolve(__dirname, 'dist'),clean: true,},};

打包构建:
在这里插入图片描述
感觉官网有点问题,webpack5的话,如果文件未更改的话,再次打包:
在这里插入图片描述
不会有新的bundle生成的。改变原文件内容再打包,
在这里插入图片描述
打包的哈希值改变了。

3. 提取引导模板

正如在 代码分离 中所学到的,SplitChunksPlugin 插件可以用于将模块分离到单独的 bundle 中。webpack 还提供了一个优化功能,可以使用 optimization.runtimeChunk 选项将 runtime 代码拆分为一个单独的 chunk。将其设置为 single 以便为所有 chunk 创建一个 runtime bundle:

 const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',plugins: [new HtmlWebpackPlugin({title: 'Caching',}),],output: {filename: '[name].[contenthash].js',path: path.resolve(__dirname, 'dist'),clean: true,},optimization: {runtimeChunk: 'single',},};

更改配置后再次构建,查看提取出来的 runtime bundle:
在这里插入图片描述
由于像 lodash 或 react 这样的第三方库很少像本地源代码一样频繁修改,因此通常推荐将第三方库提取到单独的 vendor chunk 中。这一步将减少客户端对服务器的请求,同时保证自身代码与服务器一致。可以通过使用 SplitChunksPlugin 示例 2 中演示的 SplitChunksPlugin 插件的 cacheGroups 选项来实现。试试在 optimization.splitChunks 添加如下 cacheGroups 参数并执行构建:

const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',plugins: [new HtmlWebpackPlugin({title: 'Caching',}),],output: {filename: '[name].[contenthash].js',path: path.resolve(__dirname, 'dist'),clean: true,},optimization: {runtimeChunk: 'single',splitChunks: {cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all',},},},},};

再次构建,然后查看新的 vendor bundle:
在这里插入图片描述
现在,可以看到 main 不再含有来自 node_modules 目录的 vendor 代码,并且体积减少到 412 bytes!

4.模块标识符

这一块我本地的和官网的结果也是不同的。
按理说,应该是三个文件的哈希值都发生了变化。这是因为每个 module.id 会默认基于解析顺序增加。换言之,当解析顺序发生变化,ID 也会随之改变。简要概括便是:

main bundle 会随着自身的新增内容的修改而发生变化。
vendor bundle 会随着自身的 module.id 的变化而发生变化。
manifest runtime 会因为现在包含一个新模块的引用而发生变化。
上面的第一点与最后一点都是符合预期的行为,而 vendor 的哈希值发生变化是我们要修复的。试试将 optimization.moduleIds 设置为 ‘deterministic’:
但是我只有main bundle的哈希值有变化的。就和将 optimization.moduleIds 设置为’deterministic’的效果是一样的。

5.总结

1.输出文件的文件名:ebpack 提供了一种称为 可替换模板字符串(substitution) 的方式,通过带括号字符串来模板化文件名。其中,[contenthash] 将根据资源内容创建唯一哈希值。当资源内容发生变化时,[contenthash] 也会发生变化。解决浏览器缓存问题。
2.提取引导模板:webpack 还提供了一个优化功能,可以使用 optimization.runtimeChunk 选项将 runtime 代码拆分为一个单独的 chunk。将其设置为 single 以便为所有 chunk 创建一个 runtime bundle,可以将像 lodash 或 react 这样的第三方库很少像本地源代码一样频繁修改,因此通常推荐将第三方库提取到单独的 vendor chunk 中。
3.模块标识符:暂无学习经验

模块标识符:每个模块在 Webpack 中都有一个唯一的标识符,称为模块标识符。模块标识符用于标识和区分不同的模块。它可以是一个数字、字符串或其他类型的标识符,具体取决于模块的类型和配置。
模块标识符在 Webpack 的模块系统中具有重要的作用,它被用于:
1.模块的依赖关系管理:Webpack 根据模块之间的依赖关系来构建应用。模块标识符用于标识模块之间的依赖关系,使得 Webpack 可以正确地加载和解析模块。
2.模块的引用和访问:当一个模块被其他模块引用时,模块标识符用于唯一地标识和定位模块。通过模块标识符,Webpack 能够正确地将模块的导出内容提供给其他模块。
3.模块的哈希计算:当使用缓存和长期缓存(Long Term Caching)功能时,Webpack 使用模块标识符来计算模块的哈希值。这样,当模块内容发生变化时,它的哈希值会改变,从而触发缓存的更新或生成新的文件名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284847.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文搞懂系列——DBC数据库信号解析规则及案例

背景 最近在项目中,同事遇到了一个dbc数据库解析错误的问题:基于ekuiper 对can报文解析,发现实际输出结果与预期差距较大。当时他第一反应是ekuiper的解析规则有误,因此就没有跟踪下去了。因为之前我用过ekuiper的CAN报文解析功能…

采购oled屏幕,应注意什么

在采购OLED屏幕时,应注意以下几点: 规格和参数:了解OLED屏幕的规格和参数,包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性:选择具有可靠品质和稳定性的OLED屏…

Shell三剑客:sed(命令)二

一、插入命令:i(之前) [rootlocalhost ~]# sed -r 2i aaaaaaa passwd.txt root:x:0:0:root:/root:/bin/bash aaaaaaa bin:x:1:1:bin:/bin:/sbin/nologin[rootlocalhost ~]# sed -r 2i aaaaaaa\ > bbb\ > ccc passwd.txt root:x:0:0:r…

Stable-Diffusion|从图片反推prompt的工具:Tagger(五)

stable-diffusion-webui-wd14-tagger 前面几篇: Stable-Diffusion|window10安装GPU版本的 Stable-Diffusion-WebUI遇到的一些问题(一) 【Stable-Diffusion|入门怎么下载与使用civitai网站的模型(二)】 Stable-Diffusi…

【深度强化学习】确定性策略梯度算法 DDPG

前面讲到如 REINFORCE,Actor-Critic,TRPO,PPO 等算法,它们都是随机性策略梯度算法(Stochastic policy),在广泛的任务上表现良好,因为这类方法鼓励了算法探索,给出的策略是…

档案数字化管理可以提供什么服务?

档案数字化管理提供了便捷、高效和安全的档案管理服务,帮助组织更好地管理和利用自己的档案资源。 具体来说,专久智能档案数字化管理可以提供以下服务: 1. 档案扫描和数字化:将纸质档案通过扫描仪转换为数字格式,包括文…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…

python接口自动化测试-unittest-批量用例管理

我们日常项目中的接口测试案例肯定不止一个,当案例越来越多时我们如何管理这些批量案例?如何保证案例不重复?如果案例非常多(成百上千,甚至更多)时如何保证案例执行的效率?如何做(批…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下: 首先拿到这道题,首先不要慌张,我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的,那么我们也许可以根据这一点先把边界的元素一个一个给…

建行江门市分行致力数字人民币加速融入百姓生活

数字金融是“数字中国”建设的重要组成部分。建行江门市分行主动拥抱数字经济浪潮,全力探索数字金融赋能实体经济和社会民生,不断助力增强人民群众对金融服务的获得感、幸福感和安全感。 缴交住维如此简单! 江门是著名侨乡,有40…

Java小案例-RocketMQ的11种消息类型,你知道几种?(死信消息)

前言 在RocketMQ中,死信消息(Dead-Letter Message)是指那些在正常情况下无法被消费者消费的消息。这些消息会被存储在死信队列(Dead-Letter Queue,简称DLQ)中。 死信消息的特性包括: 不会再被…

RocketMQ EventBridge 核心概念

理解EventBridge中的核心概念,能帮助我们更好的分析和使用EventBridge。本文重点介绍下EventBridge中包含的术语: EventSource:事件源。用于管理发送到EventBridge的事件,所有发送到EventBridge中的事件都必须标注事件源名称信息…