前端性能优化:HMR热更新和预获取加载
最近发现项目开发,有点加载快,有点却是卡机式,甚至刷新导致白屏情况。于是,我找开发和性能优化的方法,找到下面几种。
本文将深入探讨 预获取(Prefetch)、动态导入(Dynamic Import) 和 热模块替换(HMR) 这三个关键技术
1. 预获取(Prefetch):加速后续页面加载
1.1 什么是预获取?
预获取(Prefetch)是一种性能优化技术,允许浏览器在空闲时提前加载后续页面或功能所需的资源(如 JavaScript 文件)。通过预获取,可以减少用户后续操作的等待时间,提升用户体验。
1.2 Webpack 中的预获取
在 Webpack 打包的应用中,当父 chunk(即当前页面或功能所需的代码块)加载完成后,Webpack 会自动为子 chunk 添加预获取提示(prefetch hint)。浏览器会根据这些提示,在空闲时提前加载子 chunk。
示例场景
假设有一个页面 A,加载了父 chunk A。页面 A 中有一个按钮,点击后会加载页面 B(对应子 chunk B)。Webpack 会在父 chunk A 加载完成后,自动添加如下代码:
<link rel="prefetch" href="chunkB.js">
rel="prefetch"
:表示这是一个预获取提示。href="chunkB.js"
:指定需要预获取的资源路径。
预获取的优势
- 减少延迟:提前加载资源,用户点击按钮时页面 B 的加载速度更快。
- 提升用户体验:用户感知不到资源加载的等待时间。
2. 动态导入(Dynamic Import):按需加载模块
2.1 什么是动态导入?
动态导入是 ES6 提供的一种语法,允许在运行时异步加载模块。它返回一个 Promise
,当模块加载完成后,Promise
会被解析为模块对象。
2.2 动态导入的两种导出方式
-
默认导出(
export default
):- 模块对象会包含一个
default
属性,指向默认导出的值。 - 访问默认导出值时,需要通过
module.default
。
- 模块对象会包含一个
-
命名导出(
export const foo = 1
):- 模块对象会直接包含命名导出的属性。
示例代码
假设有一个模块 myModule.js
:
// myModule.js
const foo = 'Hello, World!';
export default foo;
在另一个文件中动态导入该模块:
import('./myModule.js').then(module => {// 注意:默认导出值需要通过 module.default 访问console.log(module.default); // 输出: Hello, World!}).catch(error => {console.error('模块加载失败:', error);});
2.3 动态导入的优势
- 按需加载:只在需要时加载模块,减少初始加载时间。
- 代码分割:结合 Webpack 等工具,可以实现代码分割,优化性能。
3. 热模块替换(HMR):提升开发效率
3.1 什么是 HMR?
热模块替换(Hot Module Replacement,HMR)是一种开发工具功能,允许在代码修改后,只替换发生变化的模块,而无需刷新整个页面。这样可以保留应用的状态,提升开发效率。
3.2 HMR 的工作原理
- 监听文件变化:开发工具(如 Webpack)会监听项目文件的变化。
- 推送更新:当文件被修改时,开发工具会将变化的模块推送到浏览器。
- 替换模块:浏览器接收到更新后,用新的模块替换旧的模块。
- 执行回调:如果模块定义了 HMR 相关的回调(如
module.hot.accept
),则会执行这些回调以处理更新逻辑。
3.3 配置 HMR(以 Webpack 为例)
1. 启用 HMR
在 webpack.config.js
中启用 HMR:
const webpack = require('webpack');module.exports = {// 其他配置...devServer: {hot: true, // 启用 HMR},plugins: [new webpack.HotModuleReplacementPlugin(), // 添加 HMR 插件],
};
2. 在代码中处理 HMR
在入口文件中添加 HMR 的逻辑:
if (module.hot) {module.hot.accept('./App', () => {// 当 App 模块更新时,执行此回调render(<App />, document.getElementById('root'));});
}
3.4 HMR 的优势
- 快速反馈:开发者可以立即看到代码修改的效果。
- 保持状态:应用的状态不会丢失,提升调试效率。
- 提高开发效率:减少重复操作(如重新输入表单数据、重新导航到某个页面等)。
4. 立即执行函数表达式(IIFE):异步初始化
4.1 什么是 IIFE?
IIFE(Immediately Invoked Function Expression)是一种定义后立即执行的函数表达式。它通常用于创建一个独立的作用域,避免污染全局作用域。
4.2 IIFE 的语法
(async () => {await server.start();console.log('dev server 正在运行');
})();
async () => { ... }
:定义一个异步函数。()
:立即调用这个函数。
4.3 IIFE 的使用场景
- 启动开发服务器:在开发工具中,启动本地开发服务器时常用这种模式。
- 初始化异步任务:在需要立即执行的异步任务中(如加载配置、初始化数据库连接等),IIFE 是一种常见的选择。
总结
- 预获取(Prefetch):通过提前加载资源,优化后续页面或功能的加载速度。
- 动态导入(Dynamic Import):按需加载模块,减少初始加载时间。
- 热模块替换(HMR):提升开发效率,快速反馈代码修改效果。
- IIFE:适合异步初始化和避免污染全局作用域。
通过合理使用这些技术,可以显著提升前端应用的性能和开发效率。希望本文对你有所帮助!如果有任何问题,欢迎随时讨论。
相关文章:
前端性能优化:HMR热更新和预获取加载
最近发现项目开发,有点加载快,有点却是卡机式,甚至刷新导致白屏情况。于是,我找开发和性能优化的方法,找到下面几种。 本文将深入探讨 预获取(Prefetch)、动态导入(Dynamic Import&…...
【自学笔记】计算机网络的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 计算机网络重点知识点一、计算机网络概述二、网络分类三、网络性能指标四、网络协议与体系结构五、数据交换方式六、物理层与数据链路层七、网络层与运输层八、应用…...

算法基础学习——二分查找(附带Java模板)
有单调性的数列一定可以使用二分,没有单调性的题目也可能可以使用二分; (一)整数二分 二分的本质: 在某个整数区间内,存在某种性质使得区间内左半边的数都不满足该性质;而右半边的数都满足该性…...
【llm对话系统】大模型源码分析之llama模型的long context更长上下文支持
1. 引言 Llama模型的一个重要特性是支持长上下文处理。本文将深入分析Llama源码中实现长上下文的关键技术点,包括位置编码(position embedding)的外推方法、注意力机制的优化等。我们将通过详细的代码解析来理解其实现原理。 2. 位置编码的外推实现 2.1 旋转位置…...

单片机基础模块学习——NE555芯片
一、NE555电路图 NE555也称555定时器,本文主要利用NE555产生方波发生电路。整个电路相当于频率可调的方波发生器。 通过调整电位器的阻值,方波的频率也随之改变。 RB3在开发板的位置如下图 测量方波信号的引脚为SIGHAL,由上面的电路图可知,NE555已经构成完整的方波发生电…...

Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)
struct STRUCT(结构体)是一种复合数据类型,它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据,例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…...

最优化问题 - 内点法
以下是一种循序推理的方式,来帮助你从基础概念出发,理解 内点法(Interior-Point Method, IPM) 是什么、为什么要用它,以及它是如何工作的。 1. 问题起点:带不等式约束的优化 假设你有一个带不等式约束的优…...

vim交换文件的工作原理
在vim中,交换文件是一个临时文件,当我们使用vim打开一个文件进行编辑(一定得是做出了修改才会产生交换文件)时候,vim就会自动创建一个交换文件,而之后我们对于文件的一系列修改都是在交换文件中进行的&…...

CISCO路由基础全集
第一章:交换机的工作原理和基本技能_交换机有操作系统吗-CSDN博客文章浏览阅读1.1k次,点赞24次,收藏24次。交换机可看成是一台特殊的计算机,同样有CPU、存储介质和操作系统,只是与计算机的稍有不同。作为数据交换设备&…...

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索
摘要:随着互联网技术的飞速发展,网络直播作为一种新兴的、极具影响力的媒体形式,正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示,网络直播用户规模已达到3.25亿,占网民总数的45.8…...
2024年终总结——今年是蜕变的一年
2024年终总结 摘要前因转折找工作工作的成长人生的意义 摘要 2024我从国企出来,兜兜转转还是去了北京,一边是工资低、感情受挫,一边是压力大、项目经历少,让我一度找不到自己梦寐以求的工作,我投了一家又一家ÿ…...
AutoDL 云服务器:普通 用户 miniconda 配置
AutoDL 初始状态下只有root用户,miniconda 安装在root用户目录下 /// 增加普通用户 rootautodl-container-1c0641804d-5bb7040c:~/Desktop# apt updaterootautodl-container-1c0641804d-5bb7040c:~/Desktop# apt install sudorootautodl-container-1c0641804d-5…...

渲染流程概述
渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 (给物体一个包围盒,利用包围盒和摄像机的视椎体进行碰撞检测…...
前端力扣刷题 | 4:hot100之 子串
560. 和为K的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例: 输入:nums [1,1,1], k 2 输出:2 法一:暴力法 var subar…...
Julia 之 @btime 精准测量详解
Julia 语言因其高性能和易用性在科学计算、数据分析等领域获得了广泛关注。在性能优化中,精准测量代码执行时间是至关重要的任务,而 Julia 提供了强大的工具 btime 来辅助这一任务。本文将围绕 Julia 的 btime 来展开,帮助读者深入理解并高效…...
【Django教程】用户管理系统
Get Started With Django User Management 开始使用Django用户管理 By the end of this tutorial, you’ll understand that: 在本教程结束时,您将了解: Django’s user authentication is a built-in authentication system that comes with pre-conf…...
【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
一、使用pytorch框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量,方便后续在模型中…...

C语言连接Mysql
目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一…...

Windows上通过Git Bash激活Anaconda
在Windows上配置完Anaconda后,普遍通过Anaconda Prompt激活虚拟环境并执行Python,如下图所示: 有时需要连续执行多个python脚本时,直接在Anaconda Prompt下可以通过在以下方式,即命令间通过&&连接,…...

面试经典150题——图
文章目录 1、岛屿数量1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、被围绕的区域2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、克隆图3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、除法求值4.1 题目链接4.2 题目描述4.3 解题代码4.4 解题思路 5、课…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...