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 加载器或模块系统来加载的。这可以提高应用的性能和用户体验,因为它减少了页面的刷新和重新加载。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cyclictest 交叉编译与使用

目录 使用版本问题编译 numactl编译 cyclictest使用参考 cyclictest 主要是用于测试系统延时&#xff0c;进而判断系统的实时性 使用版本 rt-tests-2.6.tar.gz numactl v2.0.16 问题 编译时&#xff0c;需要先编译 numactl &#xff0c;不然会有以下报错&#xff1a; arm-…

Android 中的权限

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、权限分类3.1 安装时权限3.2 运行时…

Java面试题(每天10题)-------连载(41)

目录 Spring篇 1、什么是Spring框架&#xff1f;Spring框架主要有哪些模块&#xff1f; 2、使用Spring框架能带来哪些好处&#xff1f; 3、什么是控制反转&#xff08;IOC&#xff09;&#xff1f;什么是依赖注入&#xff1f; 4、解释下Spring中的IoC? 5、BeanFactory和…

docker-compose Foxmic dt版

Foxmic dt 版前言 实现企业对资产的基本管理,包含对资产的登记、维修、调拨、转移等基本功能的支持,并提供对资产的耗材、库存进行管理,有完善的组织架构,非常适合中小企业的需求系统整体覆盖了基本的资产管理、合同管理、运维服务、运维服务、数据中心设备管理等多个模块。…

深入理解原码、反码、补码(结合C语言)

一、引出问题 在学习C语言单目操作符中~按位取反的过程中&#xff0c;对这样一段代码的结果产生了疑惑&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 0;int b ~a;//按位取反printf("%d\n", b);return 0; }输出结果…

使用trigger-forward跨流水线传递参数

参考文档&#xff1a;https://docs.gitlab.com/ee/ci/yaml/#triggerforward 今天给大家介绍一个gitlab CI/CD的关键字 - forward&#xff0c;该关键字是一个比较偏的功能&#xff0c;但同时也是一个很实用的功能&#xff0c;我们通过在gitlab的ci文件中使用forward关键字&#…

二叉树遍历及应用

文章目录 前言构建二叉树前序遍历中序遍历后序遍历二叉树的结点个数二叉树的叶节点个数二叉树的高度二叉树第K层结点个数 前言 二叉树的遍历及应用主要是运用了递归、分治的思想。在这一篇文章&#xff0c;小编将介绍二叉树的前序遍历、中序遍历、后序遍历&#xff0c;求二叉树…

renpy-renpy对话内容汉化

文章目录 前言思路实现1,提取对话内容2,汉化对话内容文件3,修改gui文件,使得renpy游戏支持中文显示 前言 最近下载了一些renpy视觉小说内容,发现对话都为英文,因此我在想能否提取出这些对话然后汉化后再封装回原文件,将其汉化 当然汉化过程是机器翻译,汉化其他语言同理,大概5分…

根文件系统构建-对busybox进行配置

一. 简介 本文来学习 根文件系统的制作中&#xff0c;关于 busybox的配置。 本文继上一篇 busybox中文支持的设置&#xff0c;地址如下&#xff1a; 根文件系统构建-busybox中文支持-CSDN博客 二. 根文件系统构建-busybox配置 1. 配置 busybox 与我们编译 Uboot 、 Lin…

阵列信号处理---频率-波数响应和波束方向图

波束延迟求和器 阵列是由一组全向阵元组成&#xff0c;阵元的位置为 p n p_n pn​&#xff0c;如下图所示&#xff1a; 阵元分别在对应的位置对信号进行空域采样&#xff0c;这样就产生了一组信号信号为 f ( t , p ) f(t,p) f(t,p),具体表示如下&#xff1a; f ( t , p ) [ f…

详解递归锁,以及递归锁与其他同步机制的区别

什么是递归锁 递归锁是一种多线程同步机制&#xff0c;用于解决线程在多次获取同一个锁时产生死锁的问题。在递归锁中&#xff0c;同一个线程可以多次获取同一个锁&#xff0c;而不会造成死锁。 递归锁具有两个主要操作&#xff1a;上锁&#xff08;lock&#xff09;和解锁&a…

OpenCV技术应用(5)— 将一幅图像均分成4幅图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何将一幅图像均分成4幅图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果将下图…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(三)

文章目录 第六章 通过认证帧定时实现VulCAN的非once同步6.1 问题陈述6.2 方法概述6.3 动机和缺点6.3.1 认证帧定时隐蔽通信6.3.2 VulCAN 的 vatiCAN后端 Nonce同步的应用【这块是一点没看明白】 6.4 设计与实现6.4.1发送方6.4.2 接收方6.4.3 设计参数配置6.4.4 实现 6.5 安全注…

linux复习笔记06(小滴)

演练企业静态ip地址配置过程 我们有时候会发现&#xff0c;在使用虚拟机的时候&#xff0c;如果使用远程连接工具&#xff0c;我们会发现&#xff0c;有时候连接不上去&#xff0c;但是我们去用ifconfig去查看的时候&#xff0c;我们发现是ip地址换了。所以往往我们也需要去固…

SVN下载使用和说明

一、SVN <1>SVN的简介 1、svn是什么&#xff1f; 2、作用 3、基本操作 <2>服务器端的软件下载和安装 1、下载 2、查看环境变量 3、验证安装是否成功 <3>创建项目版本库 1、创建项目版本库&#xff08;svn reponsitory&#xff09; 2、svn版本控制文件说明…

BUUCTF [GXYCTF2019]SXMgdGhpcyBiYXNlPw== 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 下载附件&#xff0c;解压得到flag.txt文件。 解题思路&#xff1a; 1、打开flag.txt文件&#xff0c;内容如下。 Q2V0dGUgbnVpdCwK SW50ZW5hYmxlIGluc29tbm…

7.C转python

1.对字典的各种操作都是对键来进行的 2.关于字典的遍历操作 例: 还可以这样遍历 所以生成了一个固定模版来遍历字典: 例: 那两个名字可以换 例: 3.合法key的类型: 要求可哈希 在python中,专门提供了一个hash()函数来计算哈希值 例: 有的类型是不能计算哈希的,如:列表,字…

Fabric:创建应用通道

搭建自定义网络可以参考文章&#xff1a; https://blog.csdn.net/yeshang_lady/article/details/134113296 1 创建通道 网络搭建完成之后&#xff0c;就可以开始创建通道了。Fabric V2.5.4中可以在不创建系统通道的情况下直接创建应用通道。 1.1 修改配置文件 先创建配置文…

QProcess 启动 进程 传参数 启动控制台进程 传参

目录 QProcess 启动外部程序的两种方式 依赖式 分离式&#xff1a; 启动进程前的预处理 设置启动路径 设置启动命令参数 设置启动工作目录 设置启动所需环境&#xff1a; 启动的状态 code smple: QProcess 控制台进程 QProcess启动控制台不显示窗口 注意&#xff1a;…

一、服务器准备

本案例使用VMware Workstation Pro虚拟机创建虚拟服务器来搭建Linux服务器集群&#xff0c;所用软件及版本如下&#xff1a; Centos7.7-64bit 1、三台虚拟机创建 第一种方式&#xff1a;通过iso镜像文件来进行安装(不推荐) 第二种方式&#xff1a;直接复制安装好的虚拟机文…