当前位置: 首页 > news >正文

JavaScript 延迟加载的艺术:按需加载的最佳实践

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 延迟加载的概念和背景
    • 为什么需要延迟加载 JavaScript
  • 二、延迟加载的原理和方法
    • 使用`<script>`标签的`defer`属性
    • 使用`<script>`标签的`async`属性
    • 动态创建和插入`<script>`标签
    • 使用 JavaScript 模块加载器
  • 三、延迟加载的优点
  • 四、延迟加载的应用场景
  • 五、延迟加载的注意事项和最佳实践
  • 六、实际案例分析
    • 加载第三方 JavaScript 库
    • 单页应用(SPA)中的模块加载

一、引言

延迟加载的概念和背景

在网页开发中,延迟加载是一种技术,用于优化网页的性能和用户体验。它的基本思想是在网页加载时,只加载当前用户可见或即将可见的内容,而不是一次性加载整个网页的所有内容。

延迟加载的背景是随着网页内容的不断丰富和用户对网页性能的要求不断提高,传统的网页加载方式可能会导致网页加载速度过慢,影响用户体验。因此,延迟加载技术应运而生,它可以有效地减少网页加载时间,提高网页的响应速度

通过延迟加载,网页可以更快地加载,减少用户等待时间,提高用户满意度。同时,延迟加载还可以减少服务器的负载,提高服务器的性能和效率。因此,延迟加载已经成为现代网页开发中常用的技术之一。

为什么需要延迟加载 JavaScript

在网页开发中,需要延迟加载 JavaScript 的主要原因是为了提高网页的加载速度和用户体验

JavaScript 是一种解释型语言,它需要在浏览器中解析和执行。如果在网页加载时一次性加载所有的 JavaScript 文件,可能会导致网页的加载速度变慢,特别是当 JavaScript 文件较大或者包含多个文件时。这会导致用户需要等待更长的时间才能看到网页的内容,从而降低用户体验。

通过延迟加载 JavaScript,可以只加载当前用户可见或即将可见的 JavaScript 文件,从而减少网页的加载时间。这可以通过使用 JavaScript 加载器或动态加载 JavaScript 文件等技术来实现。

此外,延迟加载 JavaScript 还可以减少服务器的负载,因为它只需要加载用户实际需要的 JavaScript 文件,而不是一次性加载所有文件。这可以提高服务器的性能和效率。

因此,延迟加载 JavaScript 是提高网页性能和用户体验的重要技术之一,它可以帮助网页更快地加载,减少用户等待时间,提高用户满意度。

二、延迟加载的原理和方法

使用<script>标签的defer属性

<script> 标签的 defer 属性是一种常用的延迟加载 JavaScript 的方式。它的作用是告诉浏览器在解析 HTML 文档时,先不要执行包含在 <script> 标签中的 JavaScript 代码,而是等到 HTML 文档完全加载完成后再执行。

使用 defer 属性的语法如下:

<script defer src="script.js"></script>

在上面的代码中,defer 属性告诉浏览器延迟执行 script.js 文件中的 JavaScript 代码,直到 HTML 文档完全加载完成后再执行。

使用 defer 属性的优点是它可以在 HTML 文档加载完成后一次性执行所有延迟加载的 JavaScript 文件,从而减少浏览器的请求次数,提高网页的加载速度。此外,使用 defer 属性还可以确保 JavaScript 代码按照它们在 HTML 文档中的顺序执行,避免了代码的顺序问题。

需要注意的是,使用 defer 属性时,浏览器仍然会在解析 HTML 文档时下载包含在 <script> 标签中的 JavaScript 文件,因此它并不能完全避免对网页性能的影响。如果需要进一步优化网页的性能,可以考虑使用其他延迟加载技术,例如动态加载 JavaScript 文件或使用 JavaScript 加载器。

使用<script>标签的async属性

<script> 标签的 async 属性是另一种常用的延迟加载 JavaScript 的方式。它的作用是告诉浏览器在解析 HTML 文档时,异步加载包含在 <script> 标签中的 JavaScript 文件,而不会阻塞 HTML 文档的解析。

使用 async 属性的语法如下:

<script async src="script.js"></script>

在上面的代码中,async 属性告诉浏览器异步加载 script.js 文件中的 JavaScript 代码,不会阻塞 HTML 文档的解析。

使用 async 属性的优点是它可以在不影响 HTML 文档解析的情况下异步加载 JavaScript 文件,从而提高网页的加载速度。此外,使用 async 属性还可以确保 JavaScript 代码按照它们在 HTML 文档中的顺序执行,避免了代码的顺序问题。

需要注意的是,使用 async 属性时,浏览器会在下载和执行 JavaScript 文件时与 HTML 文档的解析同时进行,因此可能会导致网页的内容在 JavaScript 文件加载完成之前显示出来。如果需要确保 JavaScript 代码在网页内容加载完成后再执行,可以考虑使用其他延迟加载技术,例如动态加载 JavaScript 文件或使用 JavaScript 加载器。

总之,<script> 标签的 defer 属性和 async 属性都是常用的延迟加载 JavaScript 的方式,它们可以帮助提高网页的加载速度和用户体验。根据具体的需求和场景,可以选择合适的属性来实现延迟加载。

动态创建和插入<script>标签

动态创建和插入 <script> 标签是一种常见的延迟加载 JavaScript 的方式。它的基本思想是在网页加载完成后,根据需要动态创建 <script> 标签,并将其插入到 HTML 文档中,从而实现延迟加载 JavaScript 文件。

下面是一个使用 JavaScript 动态创建和插入 <script> 标签的示例代码:

// 创建一个新的 <script> 标签
var script = document.createElement('script');// 设置 <script> 标签的属性
script.setAttribute('src', 'script.js');// 将 <script> 标签插入到 HTML 文档的 body 元素中
document.body.appendChild(script);

在上面的代码中,我们首先使用 document.createElement('script') 方法创建一个新的 <script> 标签。然后,我们使用 setAttribute('src', 'script.js') 方法设置 <script> 标签的 src 属性,指定要加载的 JavaScript 文件。最后,我们使用 document.body.appendChild(script) 方法将 <script> 标签插入到 HTML 文档的 body 元素中,从而实现延迟加载 JavaScript 文件。

需要注意的是,在实际应用中,需要根据具体的需求和场景来选择合适的延迟加载技术。动态创建和插入 <script> 标签的方式可以实现更精细的控制和优化,但需要在代码中处理一些细节问题,例如确保 JavaScript 文件加载完成后再执行相关的代码逻辑。

使用 JavaScript 模块加载器

JavaScript 模块加载器是一种用于动态加载 JavaScript 模块的工具。它可以在需要时加载模块,而不是在网页加载时一次性加载所有的 JavaScript 文件。这样可以减少网页的加载时间,提高网页的性能和用户体验。

下面是一个使用 JavaScript 模块加载器的示例代码:

// 定义模块加载器函数
function loadModule(moduleId, callback) {// 创建一个新的 <script> 标签var script = document.createElement('script');// 设置 <script> 标签的属性script.setAttribute('src', moduleId);// 监听 script 标签的加载完成事件script.addEventListener('load', function() {// 执行回调函数callback();});// 将 <script> 标签插入到 HTML 文档的 body 元素中document.body.appendChild(script);
}// 调用模块加载器函数加载模块
loadModule('module.js', function() {// 在模块加载完成后执行的代码逻辑console.log('Module loaded!');
});

在上面的代码中,我们定义了一个名为 loadModule 的函数,它接受两个参数:模块的 ID(moduleId)和加载完成后的回调函数(callback)。在函数内部,我们创建了一个新的 <script> 标签,并设置其 src 属性为指定的模块 ID。然后,我们监听 <script> 标签的 load 事件,当模块加载完成后,执行回调函数。最后,我们将 <script> 标签插入到 HTML 文档的 body 元素中,从而实现模块的动态加载。

在实际应用中,你可以根据需要定义多个模块,并在需要时使用 loadModule 函数加载它们。这样可以实现延迟加载 JavaScript 模块,提高网页的性能和用户体验。

三、延迟加载的优点

  • 提高页面加载速度
  • 减少 JavaScript 对页面渲染的影响
  • 优化用户体验

在这里插入图片描述

四、延迟加载的应用场景

  • 按需加载功能模块
  • 第三方脚本的延迟加载
  • A/B 测试和个性化内容加载

在这里插入图片描述

五、延迟加载的注意事项和最佳实践

  • 处理依赖关系
  • 错误处理
  • 性能优化

六、实际案例分析

加载第三方 JavaScript 库

加载第三方 JavaScript 库是指在网页中引入外部的 JavaScript 文件,以使用其中提供的功能和代码。下面是加载第三方 JavaScript 库的一般步骤:

  1. 获取第三方库的文件:首先,你需要从第三方库的官方网站或其他可靠来源获取 JavaScript 文件。通常,这些库都会提供一个下载链接或 CDN 链接,你可以根据需要选择合适的版本。
  2. 在 HTML 文件中引入库文件:在 HTML 文件的 <script> 标签中引入第三方库文件。可以将 <script> 标签放在 HTML 文件的 <head> 部分或 <body> 部分,具体位置取决于库文件的使用方式。
  3. 设置库文件的路径:在 <script> 标签的 src 属性中指定第三方库文件的路径。可以使用相对路径或绝对路径。如果使用相对路径,它将相对于 HTML 文件的位置。
  4. 等待库文件加载完成:在引入第三方库文件后,你需要等待它加载完成后才能使用其中的功能。这可以通过在库文件的回调函数中进行操作来实现。
  5. 使用库文件:一旦库文件加载完成,你就可以在 JavaScript 代码中使用其中提供的功能和方法。

下面是一个示例,演示如何加载 jQuery 库:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

在上面的代码中,我们使用 <script> 标签引入了 jQuery 库文件,其路径为 “https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js”。你可以根据实际情况替换为你所需要的库文件路径。

需要注意的是,不同的第三方库可能有不同的加载方式和使用方法。在使用特定的库时,建议参考该库的官方文档,以了解正确的加载和使用方式。

单页应用(SPA)中的模块加载

在单页应用(SPA)中,模块加载是指在单个页面中动态加载和渲染不同的模块或组件。这种方式可以提高应用的性能和用户体验,因为它减少了页面的刷新和重新加载。

在 SPA 中,模块通常是通过 JavaScript 加载器或模块系统来加载的。这些加载器或系统可以实现按需加载模块,只在需要时加载它们,而不是在页面加载时一次性加载所有模块。

下面是一些常见的 SPA 模块加载方式:

  1. 异步模块定义(AMD):AMD 是一种异步模块加载方式,其中模块的定义和加载是分开的。AMD 加载器会在需要时异步加载模块,并将其注册到模块系统中。
  2. CommonJS:CommonJS 是一种同步模块加载方式,其中模块的定义和加载是在同一时间进行的。CommonJS 模块系统通常用于服务器端 JavaScript 开发。
  3. ES6 模块:ES6 模块是一种新的模块定义方式,它在 ECMAScript 6 中引入。ES6 模块可以通过 importexport 关键字来定义和加载模块。
  4. 基于 Webpack 的模块加载:Webpack 是一种流行的模块打包工具,它可以将多个模块打包成一个单独的文件,并提供了一种基于配置的模块加载方式。

在这里插入图片描述

无论使用哪种模块加载方式,在 SPA 中,模块通常是在需要时通过 JavaScript 加载器或模块系统来加载的。这可以提高应用的性能和用户体验,因为它减少了页面的刷新和重新加载。

相关文章:

JavaScript 延迟加载的艺术:按需加载的最佳实践

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

HTML之实体和标签

HTML之实体和标签 实体标签meta标签语义化标签列表超链接 实体 如果我们需要在网页中书写一些特殊符号&#xff0c;则需要在html中使用【实体】&#xff08;转义符&#xff09; 实体语法&#xff1a; &实体的名字; <!DOCTYPE html> <html lang"en"> …...

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…...

卷积神经网络-3D医疗影像识别

文章目录 一、前言二、前期工作1. 介绍2. 加载和预处理数据 二、构建训练和验证集三、数据增强四、数据可视化五、构建3D卷积神经网络模型六、训练模型七、可视化模型性能八、对单次 CT 扫描进行预测 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&a…...

C++基础 -33- 单目运算符重载

单目运算符重载格式 a和a通过形参确定 data1 operator() {this->a;return *this; }data1 operator(int) {data1 temp*this;this->a;return temp; }举例使用单目运算符重载 #include "iostream"using namespace std;class data1 {public :int a;data1(int…...

[传智杯 #3 初赛] 课程报名

题目描述 传智播客推出了一款课程&#xff0c;并进行了一次促销活动。具体来说就是&#xff0c;课程的初始定价为 v 元&#xff1b;每报名 m 个学员&#xff0c;课程的定价就要提升 a 元。由于课程能够容纳的学生有限&#xff0c;因此报名到 n 人的时候就停止报名。 现在老师…...

华为OD机试 - 悄悄话(Java JS Python C)

题目描述 给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。 输入描述 给定二叉树 0 9 20 -1 -1 15 7 -1 -1 -1 -1 …...

LeetCode - 965. 单值二叉树(C语言,二叉树,配图)

二叉树每个节点都具有相同的值&#xff0c;我们就可以比较每个树的根节点与左右两个孩子节点的值是否相同&#xff0c;如果不同返回false&#xff0c;否则&#xff0c;返回true。 如果是叶子节点&#xff0c;不存在还孩子节点&#xff0c;则这个叶子节点为根的树是单值二叉树。…...

每日一题(LeetCode)----哈希表--三数之和

每日一题(LeetCode)----哈希表–三数之和 1.题目&#xff08;15. 三数之和&#xff09; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所…...

DL中的GPU使用问题

写在前面 在使用GPU进行深度学习训练经常会遇到下面几个问题&#xff0c;这里做一个解决方法的汇总。 &#x1f415;Q1&#x1f415;&#xff1a;在一个多卡服务器上&#xff0c;指定了cuda:1&#xff0c;但是0号显卡显存还是会被占用一定量的显存。 这个问题很经典的出现场景就…...

Linux命令——watch

watch是周期性的执行下个程序&#xff0c;并全屏显示执行结果 用法&#xff1a; vmfedora:~$ watch --helpUsage:watch [options] commandOptions:-b, --beep beep if command has a non-zero exit-c, --color interpret ANSI color and style sequen…...

力扣题:字符的统计-12.2

力扣题-12.2 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;423. 从英文中重建数字 解题思想&#xff1a;有的单词通过一个字母就可以确定&#xff0c;依次确定即可 class Solution(object):def originalDigits(self, s):""":typ…...

Python----Pandas

目录 Series属性 DataFrame的属性 Pandas的CSV文件 Pandas数据处理 Pandas的主要数据结构是Series&#xff08;一维数据&#xff09;与DataFrame&#xff08;二维数据&#xff09; Series属性 Series的属性如下&#xff1a; 属性描述pandas.Series(data,index,dtype,nam…...

【UE】UEC++获取屏幕颜色GetPixelFromCursorPosition()

目录 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 二、函数的调用 三、运行结果 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 创建一个蓝图方法库方法 GetPixelFromCursorPosition()&#xff0c;并给他指定UF…...

数学建模-基于BL回归模型和决策树模型对早产危险因素的探究和预测

整体求解过程概述(摘要) 近年来&#xff0c;全球早产率总体呈上升趋势&#xff0c;在我国&#xff0c;早产儿以每年 20 万的数目逐年递增&#xff0c;目前早产已经成为重大的公共卫生问题之一。据研究,早产是威胁胎儿及新生儿健康的重要因素&#xff0c;可能会造成死亡或智力体…...

接口测试 —— 接口测试的意义

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…...

一些常见的爬虫库

一些常见的爬虫库&#xff0c;并按功能和用途进行分类&#xff1a; 通用爬虫库&#xff1a; Beautiful Soup&#xff1a;用于解析HTML和XML文档&#xff0c;方便地提取数据。Requests&#xff1a;用于HTTP请求&#xff0c;获取网页内容。Scrapy&#xff1a;一个强大的爬虫框架…...

2023.12.2 做一个后台管理网页(左侧边栏实现手风琴和隐藏/出现效果)

2023.12.2 做一个后台管理网页&#xff08;左侧边栏实现手风琴和隐藏/出现效果&#xff09; 网页源码见附件&#xff0c;比较简单&#xff0c;之前用很多种方法实现过该效果&#xff0c;这次的效果相对更好。 实现功能&#xff1a; &#xff08;1&#xff09;实现左侧边栏的手…...

【EMFace】《EMface: Detecting Hard Faces by Exploring Receptive Field Pyramids》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Study5.3 Comparison with State-of-the-Arts 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivatio…...

详细学习Pyqt5的20种输入控件(Input Widgets)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…...

【原创改进代码】考虑电动汽车移动储能特性的多区域电网功率波动平抑优化调控附python代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子…...

XML 指南

XML 指南 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。自从1998年发布以来,XML因其灵活性和广泛的应用场景而成为数据交换的标准格式。本文旨在为您提供一个全面的XML指南,帮助您了解XML的基本概念、语法规则、应用场景以及相关的最佳实践。 XML的基本…...

电路原理与人生哲学的奇妙对应关系

1. 电路与人生的奇妙映射作为一名在电子行业摸爬滚打十多年的工程师&#xff0c;我常常惊叹于电路原理与人生百态之间的惊人相似。记得刚入行时&#xff0c;我的导师就说过&#xff1a;"读懂电路&#xff0c;就读懂了人生。"当时只觉得是句玩笑话&#xff0c;直到这些…...

Glide框架在Java中的高效集成与动图加载实践

1. 为什么选择Glide处理Java项目中的动图加载 第一次在Android项目里遇到动图加载需求时&#xff0c;我试过用原生ImageView逐帧解析&#xff0c;结果内存直接爆了。后来发现Glide这个宝藏框架&#xff0c;它就像个智能的动图管家&#xff0c;把复杂的解码、内存管理、缓存优化…...

2026届必备的五大AI辅助论文助手实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于大语言模型与自然语言处理技术的 AI 写作软件&#xff0c;是内容生产领域新兴工具&…...

Qwen3.5-9B-AWQ-4bit部署指南:双卡RTX 4090-D镜像免配置快速上手

Qwen3.5-9B-AWQ-4bit部署指南&#xff1a;双卡RTX 4090-D镜像免配置快速上手 1. 模型概述 千问3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型&#xff0c;能够结合上传图片与文字提示词&#xff0c;输出中文分析结果。这个量化版本特别适合处理以下任务&#xff1a; 图片主…...

终极指南:3步打造你的闲鱼AI客服机器人,实现24小时自动化值守

终极指南&#xff1a;3步打造你的闲鱼AI客服机器人&#xff0c;实现24小时自动化值守 【免费下载链接】XianyuAutoAgent 智能闲鱼客服机器人系统&#xff1a;专为闲鱼平台打造的AI值守解决方案&#xff0c;实现闲鱼平台724小时自动化值守&#xff0c;支持多专家协同决策、智能议…...

Java八股文实践篇:从理论到DeOldify项目中的设计模式应用

Java八股文实践篇&#xff1a;从理论到DeOldify项目中的设计模式应用 每次面试被问到设计模式&#xff0c;是不是都只能背出“单例模式确保一个类只有一个实例”这样的标准答案&#xff1f;背得滚瓜烂熟&#xff0c;但一上手写代码&#xff0c;还是觉得这些模式离自己很远&…...

Ostrakon-VL零售AI降本方案:替代人工巡检,单店年省8万元

Ostrakon-VL零售AI降本方案&#xff1a;替代人工巡检&#xff0c;单店年省8万元 1. 零售巡检的痛点与AI解决方案 在传统零售运营中&#xff0c;门店巡检是一项耗时耗力的日常工作。店长或督导人员需要每天检查&#xff1a; 商品陈列是否整齐货架缺货情况价签是否正确店铺环境…...

基于S7-200 PLC和MCGS组态的灌装贴标生产线系统:带解释的梯形图程序、接线图原理图图...

基于S7-200 PLC和MCGS组态的灌装贴标生产线系统 带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面车间里那台老灌装线最近被我折腾得焕然一新&#xff0c;用S7-200 PLC搭配MCGS组态搞了个自动化改造。这活儿干下来发现几个关键点特别有意思&#xff0c;尤…...