前端优化:首屏加载速度的实践

目录

目录

前言

多图片的懒加载

避免用户多次点击请求

骨架屏原理

结束语


前言

随着互联网技术的飞速发展,前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道,但是网页也有常见的弊端,比如网页首屏加载速度的快慢直接影响着用户体验,那么如何提升网页的首屏加载速度,成为了前端开发者必须面对的问题。本文将从多图片懒加载、避免用户多次点击请求以及骨架屏原理等方面,简单分享一下前端优化首屏加载速度的策略优化。欢迎大家在评论区留言交流。

多图片的懒加载

用户对网页体验要求越来越高的时候,再加上网页设计的丰富和多媒体内容的增加,图片成为了网页中不可或缺的元素。实际开发中可以看到过多的图片会导致网页加载速度变慢,影响用户体验,为了解决这个问题,前端开发者可以采用懒加载。

其实懒加载是一种只在需要时才加载图片,它通过在用户滚动到图片位置之前,不加载图片或只加载低分辨率的图片占位符,来减少首屏加载时的网络请求和带宽占用。当用户滚动到图片位置时,再加载实际的高清图片。这样可以在保证用户体验的前提下,有效减少首屏加载时间。

还有就是实现懒加载的方式有多种,比如使用JavaScript监听滚动事件,判断图片是否进入视口;或者使用Intersection Observer API,更加精确地判断图片与视口的交集情况,这些方式都可以根据实际需求进行选择和调整。那么接下来就分享一个简单的示例,以使用JavaScript和Intersection Observer API实现图片懒加载的简单示例,具体的示例代码如下所示:

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>图片懒加载示例</title>  
<style>  .lazy-image {  /* 初始状态下使用低分辨率图片或占位符 */  background: url('placeholder.jpg') no-repeat center center;  background-size: cover;  width: 300px;  height: 200px;  }  
</style>  
</head>  
<body>  <img src="placeholder.jpg" data-src="real-image1.jpg" class="lazy-image" alt="Image 1">  
<img src="placeholder.jpg" data-src="real-image2.jpg" class="lazy-image" alt="Image 2">  
<!-- 更多图片... -->  <script>  
// 监听图片与视口的交集情况  
const observer = new IntersectionObserver((entries, observer) => {  entries.forEach(entry => {  if (entry.isIntersecting) {  // 当图片进入视口时,加载真实图片  const lazyImage = entry.target;  const realSrc = lazyImage.dataset.src;  lazyImage.src = realSrc;  // 停止观察当前图片  observer.unobserve(lazyImage);  }  });  
});  // 获取所有需要懒加载的图片  
const lazyImages = document.querySelectorAll('.lazy-image');  // 对每张图片应用观察器  
lazyImages.forEach(image => {  observer.observe(image);  
});  
</script>  </body>  
</html>

在上面的示例代码中,把需要懒加载的图片的src属性替换为data-src属性,并使用一个占位符作为背景图,然后使用Intersection Observer API来监听图片是否进入视口,一旦进入视口,就将data-src的值赋给src属性,从而触发图片的加载。

避免用户多次点击请求

还有一种情况在前端开发中经常遇到,那就是在网页中有些功能可能需要用户进行多次点击或输入操作才能触发,但是如果这些操作会导致额外的网络请求或数据处理,那么就会增加首屏加载的时间,为了避免这种情况,我们前端开发者可以采取以下措施:

  • 使用防抖和节流:防抖是在一定时间内只触发一次函数,节流是在一定时间内只触发有限次数的函数,这两种技术都可以有效减少用户连续点击或输入导致的额外请求。
  • 合并请求:将多个相关的网络请求合并成一个请求发送,可以减少网络传输的时间和带宽占用,比如可以将多个图片的URL合并成一个数组,一次性发送给后端进行处理。
  • 缓存数据:对于不需要实时更新的数据,可以将其缓存在前端或后端,避免重复请求,也可以通过设置合理的缓存策略来减少不必要的网络请求。

这里也来分享一个简单的使用示例,以使用防抖技术实现避免用户多次点击请求的示例,具体代码如下所示:

function debounce(func, wait) {  let timeout;  return function executedFunction(...args) {  const context = this;  clearTimeout(timeout);  timeout = setTimeout(() => func.apply(context, args), wait);  };  
}  // 假设有一个需要防抖的函数  
function fetchData() {  // 发送网络请求...  console.log('Fetching data...');  
}  // 使用防抖技术包装函数  
const debouncedFetchData = debounce(fetchData, 500);  // 用户点击事件绑定防抖后的函数  
document.getElementById('myButton').addEventListener('click', debouncedFetchData);

在上面的示例代码中,定义了一个debounce函数,它接受一个需要防抖的函数和一个等待时间作为参数。在防抖函数内部,使用setTimeout来延迟执行原函数,并在每次调用防抖函数时清除上一次的定时器,然后只有在最后一次调用防抖函数后等待指定的时间,才会执行原函数。

骨架屏原理

作为前端开发者,在日常开发中对于骨架屏的使用应该非常熟悉,骨架屏是一种在内容加载期间展示给用户的一种视觉占位符,尤其是在用户等待数据加载时,展示一个大致的页面框架和关键元素,让用户提前感知到页面的结构,从而减少用户等待的焦虑感,它可以让用户在等待过程中感知到页面的加载进度,提升用户体验。

实现骨架屏的方式有多种,比如使用CSS动画和SVG等技术绘制一个简单的页面框架;或者使用专门的骨架屏库来快速生成,但是无论使用哪种方式,我们都需要注意以下几点:

  1. 保持与真实页面的结构和布局一致,让用户能够快速识别和理解;
  2. 加载完成后要及时隐藏骨架屏,避免影响用户体验;
  3. 根据不同的页面和场景选择合适的骨架屏样式和动画效果。

所以这里也来分享一个简单的使用示例,以一个简单的CSS实现骨架屏的示例,具体代码如下所示:


<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>骨架屏示例</title>  
<style>  .skeleton {  /* 骨架屏样式 */  background: #f3f3f3;  border-radius: 4px;  height: 200px; /* 根据实际内容调整高度 */  width: 100%; /* 根据实际内容调整宽度 */  margin-bottom: 20px; /* 根据需要添加 */  }  /* 加载完成后隐藏骨架屏 */
.loaded .skeleton {
display: none;
}
</style>
</head> 
<body><!-- 骨架屏容器 --><div class="skeleton" id="skeleton"></div><!-- 真实内容容器 --> 
<div class="content" id="content" style="display: none;"> 
<!-- 这里放置真实的内容,如图片、文本等 --> 
<h1>欢迎来到我的网站</h1> <p>这是一些示例内容...</p><!-- 更多内容... --> </div> 
<script>// 假设这是一个模拟异步加载真实内容的函数 
function loadContent() { 
// 模拟异步加载过程(使用setTimeout)setTimeout(() => { 
// 隐藏骨架屏document.getElementById('skeleton').classList.add('loaded'); 
// 显示真实内容 
document.getElementById('content').style.display = 'block';}, 2000);// 假设加载需要2秒 
} 
// 页面加载完成后立即执行window.onload = loadContent; 
</script> 
</body> 
</html> 

在上面的示例代码中,创建了一个骨架屏容器和一个真实内容容器,然后在页面加载完成后,通过loadContent函数模拟异步加载真实内容的过程,在这个加载过程中,骨架屏容器可见,真实内容容器隐藏,当真实内容加载完成后,通过修改CSS类名来隐藏骨架屏并显示真实内容。通过这种方式,我们可以在用户等待真实内容加载时,展示一个与页面结构相似的骨架屏,提升用户体验,而且我们也可以根据实际需求调整骨架屏的样式和动画效果,使其更加符合页面的整体风格。

结束语

通过本文的分享介绍,尤其是作为前端开发者来看,上述几个问题都是很有代表性的,也是日常开发中经常会遇到的,尤其是现在前端技术的不断发展和用户对网页加载速度的要求日益提高,骨架屏作为一种有效的用户体验优化手段,正逐渐受到开发者的青睐,通过为页面加载过程提供视觉反馈,骨架屏能够有效缓解用户的等待焦虑,提高用户的满意度。但是在设计和实现骨架屏时,我们需要注意保持其简洁明了,与页面整体风格相协调,因为合理的动画效果和过渡效果也能进一步提升用户体验。我个人觉得前端优化首屏加载速度需要从多个方面入手,借助通过采用多图片的懒加载、避免用户多次点击请求以及使用骨架屏等技术手段,可以有效提升网页的首屏加载速度提升用户体验,但是也需要注意在优化过程中保持代码的清晰和可维护性,为后续的维护和升级打下基础。

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

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

相关文章

vant 图片放大预览(vue3)

最近在写移动端的时候要实现图片放大预览的功能&#xff0c;当时用的是vant&#xff0c;原本想的是直接用vant里面的组件来实现放大预览&#xff0c;后面仔细找了一下发现没有找到这个功能&#xff08;可能是我没找到&#xff09;&#xff0c;后面想到了用遮罩层来实现放大预览…

捕获野生的登录页,暴改Vue3

1.实现效果 2.Vue组件 <script setup> import {onMounted} from "vue";onMounted(()>{// getAllData() }) </script><template><div class"login"><div class"form-cont"><div class"form-top"&…

全面解析自然语言处理(NLP):基础、挑战及应用前景

自然语言处理 (NLP) 简介与应用前景 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算语言学的一个分支&#xff0c;致力于使计算机能够理解、解释和生成人类语言。这篇博文将深入探讨自然语言处理的基础知识、挑战、典型任务及其广泛的应用前景。 一、自然语言处理的…

Linux服务器上安装CUDA11.2和对应的cuDNN 8.4.0

一、检查 检查本机是否有CUDA工具包&#xff0c;输入nvcc -V: 如图所示&#xff0c;服务器上有CUDA&#xff0c;但版本为9.1.85&#xff0c;版本过低&#xff0c;因此博主要重装一个新的。 二、安装CUDA 1.查看服务器最高支持的CUDA版本 在命令行输入nvidia-smi查看显卡驱动…

秋招季的策略与行动指南:提前布局,高效备战,精准出击

6月即将进入尾声&#xff0c;一年一度的秋季招聘季正在热火进行中。对于即将毕业的学生和寻求职业发展的职场人士来说&#xff0c;秋招是一个不容错过的黄金时期。 秋招的序幕通常在6月至9月间拉开&#xff0c;名企们纷纷开启网申的大门。在此期间&#xff0c;求职备战是一个系…

【ai】 梳理一下yolov4及 trition部署的心路历程

yolov4是darknetv5开始逐渐采用pytorchjetson上部署darknet比较直接因此这里采用的是yolov4 版本。isarsoft/yolov4-triton-tensorrt1. 2024-06-20 : 2.17.0 在jetson4.6 上可以跑 2.17版本server 在 jetson 运行 ./tritonserver --model-repository=…/docs/examples/model_r…

2.linux操作系统CPU使用率和平均负载区别

目录 概述cpu使用率区别 结束 概述 linux操作系统CPU 使用率 和 平均负载 区别 负载高并不一定使用率高&#xff0c;有可能 cpu 被占用&#xff0c;但不干活。 cpu使用率 cpu使用率&#xff1a;cpu非空闲态运行的时间占比&#xff0c;反映cpu的繁忙程度&#xff0c;和平均负载…

如何使用VScode创建和上传Arduino项目

Visual Studio Code &#xff08;VS Code&#xff09; 是一种非常流行的通用集成开发环境 &#xff08;IDE&#xff09;。IDE 是一种将文本编辑器、编程界面、调试视图和项目管理集成在一个地方的软件。这个开源项目由微软领导&#xff0c;可以在所有操作系统上运行。使 VS Cod…

介绍两个压测工具pgbench\sysbench,可视化监控工具NMON

性能评估做不好&#xff0c;开会又领导点名叼了。/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~ 挨叼了&#xff0c;也要写文章&#xff0c;记录下我的笔记。 写篇文章 对数据库、OS性能的性能评估&#xff0c;需要选择合适的压测工具&#xff0c;给找出数据库的运行瓶颈 pgbench 这是…

AI音乐的何去何从

引言 在过去的一个月里&#xff0c;多个先进的音乐生成大模型相继上线。这些AI模型不仅降低了普通人创作音乐的门槛&#xff0c;还在音乐圈内引发了关于AI是否会彻底颠覆传统音乐创作的广泛讨论。在短暂的兴奋过后&#xff0c;人们开始理性地审视这些AI产品的版权归属问题&…

【图像超分辨率】一个简单的总结

文章目录 图像超分辨率(Image Super-Resolution, ISR)1 什么是图像超分辨率&#xff1f;2 图像超分辨率通常有哪些方法&#xff1f;&#xff08;1&#xff09;基于插值的方法&#xff08;2&#xff09;基于重建的方法&#xff08;3&#xff09;基于学习的方法&#xff08;LR im…

Leetcode 78 数组子集

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-46语义分割和数据集

46语义分割和数据集 # 图像分割和实例分割 """ 图像分割将图像划分为若干组成区域&#xff0c;这类问题的方法通常利用图像中像素之间的相关性。 它在训练时不需要有关图像像素的标签信息&#xff0c;在预测时也无法保证分割出的区域具有我们希望得到的语义。 图…

企业im(即时通讯)作为安全专属的移动数字化平台的重要工具

企业IM即时通讯作为安全专属的移动数字化平台的重要工具&#xff0c;正在越来越多的企业中发挥着重要的作用。随着移动技术和数字化转型的发展&#xff0c;企业对于安全、高效的内部沟通和协作工具的需求也越来越迫切。本文将探讨企业IM即时通讯作为安全专属的移动数字化平台的…

JAVA学习笔记-JAVA基础语法-DAY19-File类、递归

第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) &#xff1a;通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(St…

【Science重磅】以纳米级分辨率重建的人类大脑皮层颗粒片段

翻查五月的Science发现一个有意思的项目《A petavoxel fragment of human cerebral cortex reconstructed at nanoscale resolution》由美国哈佛大学Jeff W. Lichtman 和美国谷歌研究中心 Viren Jain 共同合作 据介绍&#xff0c;充分了解人类大脑是如何工作的机理&#xff0c…

[Redis]主从模式

启动主从复制 由于我们只有一台机器&#xff0c;所以我们只能在机器上开多个redis程序来演示不同的机器 因为一个端口号只能被一个进程绑定&#xff0c;所以我们需要修改配置&#xff0c;绑定不同的端口号&#xff0c;并且还要修改工作目录&#xff08;数据持久化的位置&#…

七天速通javaSE:第六天 对象:类与对象

文章目录 前言一、认识对象1. 编程思想1.1 面向过程1.2 面向对象 2. 面向对象编程&#xff08;oop&#xff09; 二、再识方法1. 修饰符2. 参数的传递与赋值2.1 值传递2.2 引用传递 总结&#xff1a; 三、创建与初始化对象1. 类与对象的关系2. 创建与初始化对象 四、构造函数1. …

Debugging using Visual Studio Code

One of the key features of Visual Studio Code is its great debugging support. VS Code’s built-in debugger helps accelerate your edit, compile, and debug loop. Debugger extensions VS Code 内置了对 Node.js 运行时的调试支持,可以调试 JavaScript、TypeScript…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手&#xff0c;该工具基于GPT-4-200k设计并实现其功能&#xff0c;可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …