【学习笔记】Webpack5(Ⅱ)
Webpack
- 3、高级篇
- 3.1、提升开发体验 —— SourceMap
- 3.2、提升打包速度
- 3.2.1 HotModuleReplacement
- 3.2.2 OneOf
- 3.2.3 Include / Exclude
- 3.2.4 Cache
- 3.2.5 Thread
- 3.3、减少代码体积
- 3.3.1 Tree Shaking
- 3.3.2 Babel
- 3.3.3 Image Minimizer
- 3.4、优化代码运行性能
- 3.4.1 Code Split
- 3.4.2 统一命名
- 3.4.2 Preload / Prefetch
- 3.4.3 Network Cache
- 3.4.4 Core-js
- 3.4.5 PWA
3、高级篇
3.1、提升开发体验 —— SourceMap
当使用开发服务器调试代码的时候,可以在浏览器中看到编译后的代码,开发模式下我们是让 css 并入 js 文件因为在配置开发模式的配置文件时没有让 css 单独提取出来

此时如果代码运行出错,我们点击这些错误的链接

会发现它让我们去观察编译后的代码的错误,不经阿这阿这阿这了出来…谁看得懂你编译后这是哪跟哪啊…

甚至是后续一旦将来开发代码文件很多,就更难去发现该错误对应我们原代码中的哪个地方,因此如果能够让这些错误的链接一点击,就能让我们看到是源码的哪里出了错,而不是编译后的文件哪里出了错,来帮助我们更好的调试、修改代码,因此我们可以使用 SourceMap 来解决这个问题
SourceMap(源代码映射)是一个用来生成源代码与构建后代码一一映射的文件的方案。,它会生成一个 xxx.map 文件,里面包含源代码和构建后代码每一行、每一列的映射关系。当构建后代码出错了,会通过 xxx.map 文件,从构建后代码出错位置找到映射后源代码出错位置,从而让浏览器提示源代码文件出错位置,帮助我们更快的找到错误根源
开发环境配置,修改 webpack.dev.js 文件如下
// 在暴露的对象身上添加一个 devtool 配置
devtool: "cheap-module-source-map",
生产环境配置,修改 webpack.prod.js 文件如下
// 在暴露的对象身上添加一个 devtool 配置
devtool: "source-map",
| 优缺点 | 描述 |
|---|---|
| cheap-module-source-map | ① 优点:打包编译速度快,只包含行映射 ② 缺点:没有列映射 |
| source-map | ① 优点:包含行 / 列映射 ② 缺点:打包编译速度更慢 |
修改完配置后现在重启开发服务器,点击错误这个地方

会发现给我们跳转到源码上出现错误的地方了
再来看一下生产模式下会是什么样的,运行npm run build先进行打包,打包之后可以看到 dist/static/js 下多出了一个 main.js.map 的文件,这个文件是一个源映射文件,将打包后的 JavaScript 代码映射回原始的源代码,以及源代码中的位置信息,因此当编译后的代码出错时,我们点击控制台中的链接,就会按照这个映射,给我们跳转到源码上出错的地方了

观察出错的地方,我们可以发现 source-map 对源码的定位是包括行和列的,如果只是行的话,那么 return 下方也会划有红线
3.2、提升打包速度
3.2.1 HotModuleReplacement
在开发过程中,随着项目的体积越来越大,打包的速度会越来越慢,如果在后续项目一大时进行开发,我们有时只需修改了一点点的代码例如某个变量值变一下,然而 Webpack 默认还是会将所有模块全部重新打包编译,导致每次修改一点代码都需要经历漫长的编译等待,体验很差,此时我们可以使用 HotModuleReplacement 来解决这个问题
Hot Module Replacement (HMR) 是 Webpack 提供的一项功能,它允许在运行时替换、添加或删除模块,能够使得只让修改的模块重新打包编译而其他模块不需要进行重新打包编译,且无需完全重新加载整个页面(即不会刷新页面,从而能保留应用的状态如表单输入、滚动位置等会被保留)。这对开发体验有很大的提升,使得开发过程更加流畅和高效
只需要修改开发模式配置文件的devServer配置即可
// webpack.dev.js
devServer: {host: "localhost", // 启动服务器域名port: "3002", // 启动服务器端口号open: true, // 是否自动打开浏览器hot: true, // 开启HMR功能
},
配置之后更改 css 代码可以发现页面不会重新刷新了,并且在控制台可以看到 [HMR] 开头的提示,这说明其只对修改的 css 模块进行重新编译打包

然而现在修改 js 代码还是会发现页面被刷新,即整个项目重新打包编译,因此还需要做进一步的配置
// 在入口文件 src/main.js 中添加如下代码
if (module.hot) {module.hot.accept("./js/count.js"); // count模块需要实现热模块替换功能module.hot.accept("./js/sum.js"); // sum模块需要实现热模块替换功能
}
当我们运行开发服务器的时候,修改 count.js / sum.js 的代码只会重新打包编译相应的模块而不会导致整个模块重新打包编译,注意不是修改 module.hot.accept 函数中的代码,修改了其中的代码,页面依然会刷新、项目依然会重新打包编译,可见 HRM 是帮助我们在修改模块的时候可以更快速地完成打包编译工作
当运行开发服务器后对模块代码进行更改如下
// sum.js 原来的代码
export default function count(x, y) {return x + y;
}// 尝试修改并观察浏览器
export default function count(x, y) {return x + y +1;
}
会发现浏览器并没有刷新,并且控制台输出了 [HMR] 开头的提示信息,这就说明我们的配置成功了

然而在实际的开发中,需要我们一个个模块都这样声明是很麻烦的,因此我们通常会使用一些 loader 来解决,在开发 vue 时可以使用 vue-loader 、在 开发 react 的时候可以使用 react-hot-loader 来帮我们自动地实现这个功能
最后需要注意的是 HMR 是应用在开发模式下的,是为了提高我们的开发速度,让我们可以更快地看到代码修改后的成果,而不是应用在生产模式下的,当代码结束了开发阶段后,还是需要老老实实地从将整个项目重新打包
3.2.2 OneOf
由于每个文件都只会使用一个 rule 中指明地 loader 去进行处理,然而当我们什么都不配置的时候,每个文件都会与配置中间中出现的所有 loader 进行对比,即使已经匹配到了相应的 rule,然是还是不会停下来,会对比完所有的 rule 才结束,这显然是大可不必的,因此处理方法是将所有的 rule 都放在 oneOf 指明的数组里
// webpack.dev.js webpack.prod.js配置同理
// 修改rules配置
rules: [{oneOf: [{test: /\.css$/i,use: ["style-loader", "css-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader"],},{test: /\.s[ac]ss$/,use: ["style-loader", "css-loader", "sass-loader"],},{test: /\.styl$/,use: ["style-loader", "css-loader", "stylus-loader"],},{test: /\.(png|jpe?g|gif|webp)$/,type: "asset",parser: {dataUrlCondition: {maxSize: 50 * 1024}}, //解析generator: {filename: "static/imgs/[hash:8][ext][query]"},},{test: /\.(ttf|woff2?)$/,type: "asset/resource",generator: {filename: "static/media/[hash:8][ext][query]",},},{test: /\.js$/相关文章:
【学习笔记】Webpack5(Ⅱ)
Webpack 3、高级篇 3.1、提升开发体验 —— SourceMap 3.2、提升打包速度 3.2.1 HotModuleReplacement 3.2.2 OneOf 3.2.3 Include / Exclude 3.2.4 Cache 3.2.5 Thread 3.3、减少代码体积 …...
oracle碎片整理
1、move碎片整理 1) DECLARE tmp_val VARCHAR2 (500); BEGIN FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES ) LOOP tmp_val:=ALTER TABLE || REC.TABLE_NAME || MOVE; BEGIN EXECUTE IMMEDIATE tmp_val; DBMS_OUTPUT.ENABLE(buffer_size => null); DBMS_OUTPUT.put_l…...
民国漫画杂志《时代漫画》第15期.PDF
时代漫画15.PDF: https://url03.ctfile.com/f/1779803-1247458444-8befd8?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!...
Alamofire常见GET/POST等请求方式的使用,响应直接为json
Alamofire 官方仓库地址:https://github.com/Alamofire/Alamofire xcode中安装和使用:swift网络库Alamofire的安装及简单使用,苹果开发必备-CSDN博客 Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作&…...
三分钟一条AI小和尚视频 ,日引300+创业粉。单日变现四位数 全套工具
经过六个月的不懈努力和无数次的尝试错误,我终于找到了一个高效引流和积累粉丝的新策略,并愿意与大家无私分享。这一次,我将详尽地介绍这个方法,建议朋友们多次观看以彻底掌握其精髓。 简而言之,该策略主要依托于AI绘…...
vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示
vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示 一、前言1.代码案例2.效果展示 一、前言 当使用 Vue 3 和 Element UI 的 el-table 组件时,你可以通过判断字段的值来设置对应的 el-button 的 disabled 属性和消息提示。下面是一个简单的示例…...
产品经理-交互说明撰写(八)
1. 交互说明 交互说明可以看做是交互设计师或者产品经理输出的最核心的”产品“交互说明面向的”用户“是下游的同事 ⇒ UI设计师、开发工程师、测试工程师 2. 基本交互形式 2.1 页面交互 2.2 元素控件交互 3. 交互说明主要包括以下3个维度 3.1 页面流程(页面之…...
Rust:struct 与字节序列的相互转换
在 Rust 中,将结构体(struct)与字节序列(Vec<u8>)相互转换的常见方法是使用序列化和反序列化库。Rust 有一个流行的序列化库叫做 serde,它支持多种数据格式。为了将结构体转换为字节序列,…...
在https的系统中挂载其他http系统的画面的解决方案
目录 1.问题及说明 2.解决方案及示例 3.总结 1.问题及说明 A系统使用了https,在A系统中挂载B系统的http的画面,会报错如下: Mixed Content: The page at https://beef.zz.com/front/#/biz/cultivationList/cultivationDetails/5dbf836751…...
mysql存储比特位
一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…...
Lua中table.sort()使用方式
table.sort(tab,compare) 参数如下: tab:表名 compare:比较规则函数名 简略写法: a {1,2,3} table.sort(a,function(a,b) return a>b end) compare这个参数是一个函数,它有两个参数,你可以理解为表中的两个不同元素&…...
数组与指针声明小问题
1、int *p &a; 是 C 语言中的一条语句,它涉及指针的声明和初始化。让我们逐步解释这一行代码的含义: int *p:这是一个指针声明。它声明了一个名为 p 的变量,该变量是一个指向 int 类型数据的指针。 &a:这是取…...
【Java】手把手学会数组的使用
数组的基本用法 创建数组 基本语法: // 动态初始化 数据类型 [] 数组名称 new 数据类型 [] { 初始化数据 }; // 静态初始化 数据类型 [] 数组名称 { 初始化数据 }; 代码示例: int[] array1 {1,2,3,4,5};int[] array2 new int[]…...
音视频开发9 FFmpeg 解复用框架--如何将一个影音文件(mp4文件/wav文件) 最终播放起来
一,播放器框架 二 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件, 比如mp4、flv、mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据࿰…...
vue实现页面渲染时候执行某需求
1. 前言 在之前的项目中,需要实现一个监控token是否过期从而动态刷新token的功能,然而在登录成功后创建的监控器会在浏览器刷新点击或者是通过导航栏输入网址时销毁... 2. 试错 前前后后始过很多方法,在这里就记录一下也许也能为各位读者排…...
Python小游戏——俄罗斯方块
文章目录 项目介绍环境配置代码设计思路1.初始化和导入库:2.定义颜色和屏幕尺寸:3.定义游戏逻辑:4.游戏循环: 源代码效果图 项目介绍 俄罗斯方块游戏是一款经典的益智游戏,玩家通过旋转和移动各种形状的方块ÿ…...
Moto和Inter字节序
inter: 低地址按照start_bit位放低字节依次往高字节填充 MotoLsb: 低地址按照start_bit位放高字节,依次往低字节填充MotoMsb:高字节按照start_bit位放低地址,依次往高字节填充...
外汇天眼:野村证券和Laser Digital与GMO互联网集团合作发行日元和美元稳定币
野村控股和Laser Digital将与GMO互联网集团合作,在日本探索发行日元和美元稳定币。GMO互联网集团的美国子公司GMO-Z.com Trust Company, Inc. 在纽约州金融服务部的监管框架下,在以太坊、恒星币和Solana等主要区块链上发行稳定币。GMO-Z.com Trust Compa…...
Python怎么使用getattr?
getattr() 是 Python 的内置函数,用于获取对象的属性值。它接受三个参数:对象、属性名称以及一个可选的默认值。如果对象具有指定的属性,getattr() 会返回该属性的值;如果对象没有该属性,并且提供了默认值,…...
[算法] 优先算法(三):滑动窗口(上)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
