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

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

目录

  • 前言
  • 多图片的懒加载
  • 避免用户多次点击请求
  • 骨架屏原理
  • 结束语

前言

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

多图片的懒加载

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

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

还有就是实现懒加载的方式有多种,比如使用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属性,从而触发图片的加载。

image.png

避免用户多次点击请求

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

  • 使用防抖和节流:防抖是在一定时间内只触发一次函数,节流是在一定时间内只触发有限次数的函数,这两种技术都可以有效减少用户连续点击或输入导致的额外请求。
  • 合并请求:将多个相关的网络请求合并成一个请求发送,可以减少网络传输的时间和带宽占用,比如可以将多个图片的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来延迟执行原函数,并在每次调用防抖函数时清除上一次的定时器,然后只有在最后一次调用防抖函数后等待指定的时间,才会执行原函数。

image.png

骨架屏原理

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

实现骨架屏的方式有多种,比如使用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类名来隐藏骨架屏并显示真实内容。通过这种方式,我们可以在用户等待真实内容加载时,展示一个与页面结构相似的骨架屏,提升用户体验,而且我们也可以根据实际需求调整骨架屏的样式和动画效果,使其更加符合页面的整体风格。

image.png

结束语

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

相关文章
|
2天前
|
前端开发 UED 开发者
现代前端开发中的响应式设计原理与实践
本文探讨了现代前端开发中响应式设计的重要性及其实现原理。通过分析媒体查询、弹性网格布局以及视口单位等技术手段,揭示了如何通过这些工具实现页面在不同设备上的优雅适配。最后,结合实际案例展示了响应式设计在提升用户体验和网站性能方面的应用。
|
6天前
|
前端开发 JavaScript 数据管理
引领潮流:React框架在前端开发中的革新与实践
React,始于2013年,由Facebook驱动,以其组件化、Virtual DOM、单向数据流和Hooks改革前端。组件化拆分UI,提升代码复用;Virtual DOM优化渲染性能;Hooks简化无类组件的状态管理。庞大的生态系统,包括Redux、React Router等库,支持各种需求。例如,`useState` Hook在计数器应用中实现状态更新,展示React的实用性。React现已成为现代Web开发的首选框架。【6月更文挑战第24天】
30 2
|
14天前
|
前端开发 JavaScript 开发工具
Web前端开发学习资料:深度探索与开发实践
Web前端开发学习资料:深度探索与开发实践
19 3
|
2月前
|
缓存 资源调度 Rust
前端效率提升实践之路
在一个B端前端项目中,开发团队面临开发效率低、交付质量和可维护性差的问题。为了解决这些问题,他们以“提效”为主题,展开了项目治理。首先,他们优化了发布和编译过程,通过更换包管理工具、减少不必要的包、使用缓存策略等方法,显著缩短了发布和编译时间。其次,团队致力于沉淀可复用物料,创建了高度配置化的组件,通过VSCode插件助手自动化配置,提高了代码复用性和开发效率。此外,他们还改进了研发流程,制定了前端、后端和产品的规范,以减少沟通成本和提高接口质量。通过这些措施,团队成功提升了开发效率,并降低了代码维护成本。
60 3
前端效率提升实践之路
|
14天前
|
缓存 前端开发 JavaScript
前端性能优化实践与工程化
前端性能优化实践与工程化
|
8天前
|
缓存 监控 前端开发
前端性能优化:从系统分析到实践策略
**前端性能优化概述** 本文探讨了前端性能优化的重要性,强调了从整体角度而非仅关注局部优化手段的必要性。作者指出,建立性能评价系统是关键,通过**性能指标**(如FP、FCP、LCP、CLS等)来量化页面性能,然后使用**性能监控**工具收集数据。文章列举了9个关键性能指标,并介绍了如何通过SDK或工具进行数据收集。 在实际操作中,文章提到了**性能优化方法论**,包括了解何时何地出现性能问题,以及如何根据性能指标采取相应优化措施。作者推荐使用Chrome的Lighthouse工具进行性能测试,并讨论了**CDN**、**缓存策略**和**懒加载**作为常见的优化手段。
36 0
|
17天前
|
资源调度 前端开发 JavaScript
前端工程化实践:Monorepo与Lerna管理
**前端工程化中,Monorepo和Lerna用于大型项目管理。Monorepo集纳所有项目,便于代码共享、版本控制和CI/CD。Lerna是Monorepo工具,管理多npm包,支持独立或共享版本。安装Lerna用`npm install --save-dev lerna`,初始化后可创建、管理包,通过`lerna bootstrap`、`lerna add`、`lerna publish`等命令协同工作。Lerna配置可在`lerna.json`,与CI/CD工具集成实现自动化。
17 0
|
2月前
|
Dart 前端开发 安全
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
【4月更文挑战第30天】本文探讨了Flutter中线程管理和并发编程的关键性,强调其对应用性能和用户体验的影响。Dart语言提供了`async`、`await`、`Stream`和`Future`等原生异步支持。Flutter采用事件驱动的单线程模型,通过`Isolate`实现线程隔离。实践中,可利用`async/await`、`StreamBuilder`和`Isolate`处理异步任务,同时注意线程安全和性能调优。参考文献包括Dart异步编程、Flutter线程模型和DevTools文档。
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
|
2月前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术实践
本文将介绍如何通过前端和后端技术相结合,构建现代化Web应用的技术实践。我们将探讨前端开发、后端架构以及多种编程语言(如Java、Python、C、PHP、Go)在构建高效、可扩展的Web应用中的应用。
|
2月前
|
Web App开发 前端开发 JavaScript
构建跨浏览器兼容的前端应用:技术实践与挑战
【5月更文挑战第16天】构建跨浏览器兼容的前端应用是应对浏览器差异和多样性的挑战。使用现代框架(如React、Vue)能自动转换代码,编写可移植的Web标准代码,结合浏览器兼容性测试工具和Polyfill解决旧浏览器支持问题。关注浏览器更新,应对性能、API差异和样式问题,采用渐进增强、条件判断和CSS Reset策略确保应用在各种浏览器上运行良好。