Web 前端性能优化之三:加载优化

这篇具有很好参考价值的文章主要介绍了Web 前端性能优化之三:加载优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2、加载优化

1、延迟加载

本着节约不浪费的原则,在首次打开网站时,应尽量只加载首屏内容所包含的资源,而首屏之外涉及的图片或视频,可以等到用户滚动视窗浏览时再去加载。以上就是延迟加载优化策略的产生逻辑,通过延迟加载“非关键”的图片及视频资源,使得页面内容更快地呈现在用户面前。这里的“非关键”资源指的就是首屏之外的图片或视频资源,相较于文本、脚本等其他资源来说,图片的资源大小不容小觑。

〈img〉标签的src属性可以先使用同一个 Base64。该Base64图片仅仅是在真实图片显示出来前用以占位的,当页面发生滚动时,之前未出现在视窗中的商品出现在视窗中后,其商品图片的真实URL会被替换到〈img〉标签的src属性上,进而发起资源请求。

1、实现图片的延迟加载:Intersection Observer 方式

现代浏览器已大多支持了Intersection Observer API,可以通过它来检查目标元素的可见性,这种方式的性能和效率都比较好。

每当因页面滚动或窗口尺寸发生变化,使得目标元素(target)与设备视窗或其他指定元素产生交集时,便会触发通过Intersection Observer API配置的回调函数,在该回调函数中进行延迟加载的逻辑处理,会比传统方式(滚动监听等)显得更加简洁而高效。

以下便是Intersection Observer方式的具体实现,此方式仅需创建一个新的Observer,并在类名为lazy的〈img〉标签进入视窗后触发回调:

前端怎么优化加载延迟,前端,前端,性能优化

这种方式判断元素是否出现在视窗中更为简单直观,应在实际开发中尽量使用,但其问题是并非所有浏览器都能兼容

在将这种方式引入项目之前,应当确保已做到以下两点:

(1)做好尽量完备浏览器兼容性检查,对于兼容Intersection Observer API的浏览器,采用这种方式进行处理,而对于不兼容的浏览器,则切换回传统的实现方式进行处理。

(2)使用相应兼容的polyfill插件

2、实现图片的延迟加载:CSS 类名方式

这种实现方式通过CSS的background-image属性来加载图片,与判断〈img〉标签src属性是否有要请求图片的URL不同,CSS中图片加载的行为建立在浏览器对文档分析基础之上。

具体来说,当DOM树、CSSOM树及渲染树生成后,浏览器会去检查CSS以何种方式应用于文档,再决定是否请求外部资源。如果浏览器确定涉及外部资源请求的CSS规则在当前文档中不存在时,便不会去请求该资源。

前端怎么优化加载延迟,前端,前端,性能优化

具体的实现方式是通过JavaScript来判断元素是否出现在视窗中的,当在视窗中时,为其元素的class属性添加visible类名。而在CSS文件中,为同一类名元素定义出带.visible和不带.visible的两种包含background-image规则。

不带.visible的图片规则中的background-image属性可以是低分辨率的图片或Base64图片,而带.visible的图片规则中的background-image属性为希望展示的真实图片URL。

前端怎么优化加载延迟,前端,前端,性能优化

具体JavaScript的实现过程,即判断图片元素是否出现在视窗内的逻辑,与 Intersection Observer方式相同。同样为了确保浏览器的兼容性,在实际应用中应确保提供回退方案或polyfill。

3、原生的延迟加载支持

从Chrome 75版本开始,已经可以通过〈img〉和〈iframe〉标签的loading属性原生支持延迟加载了,loading属性包含以下三种取值。

●lazy:进行延迟加载。

●eager:立即加载。

●auto:浏览器自行决定是否进行延迟加载。

若不指定任何属性值,loading默认取值auto。下面是具体的代码使用场景:

前端怎么优化加载延迟,前端,前端,性能优化

此方式需要考虑兼容性:

前端怎么优化加载延迟,前端,前端,性能优化

2、视频加载
1、不需要自动播放的情况

由于Chrome等一些浏览器会对视频资源进行预加载,即在HTML完成加载和解析时触发DOMContentLoaded事件开始请求视频资源,当请求完成后触发window.onload事件开始页面渲染,过程如图:

前端怎么优化加载延迟,前端,前端,性能优化

视频资源的加载

为了使页面更快地加载并渲染出来,可以阻止不需要自动播放的视频的预加载,其方法是通过视频标签的preload进行控制:

前端怎么优化加载延迟,前端,前端,性能优化

〈video〉标签的preload属性通常的默认值为auto,表示无论用户是否希望,所有视频文件都会被自动下载,这里将其设置为none,来阻止视频的自动预加载。同时这里还通过poster属性为视频提供占位符图片,它的作用是当视频未加载出来时,不至于在页面中呈现一块让用户未知的空白。考虑类似边缘异常场景是必要的,因为浏览器对视频的加载行为可能存在较大差别。

2、视频替代 GIF 动画(自动播放的视频)

应当尽量用视频代替尺寸过大的GIF动画。

前端怎么优化加载延迟,前端,前端,性能优化

这里进行了两处修改:首先是为〈video〉标签添加了poster属性,意为使用poster中指定的图片作为视频延迟加载出现前的占位;其次是使用了类似应对图像延迟加载的方式,将真实视频资源的URL放在data-src属性中,然后基于Intersection Observer用JavaScript实现对延迟加载的控制:

前端怎么优化加载延迟,前端,前端,性能优化

3、首屏加载

对性能优化工作来说,不存在一蹴而就的解决方案,而是需要根据具体场景采用恰当的方式。

比如对于首屏上的内容就不应当进行延迟加载,而应使用正常加载的方式。

若将首屏视窗边界线作为延迟加载触发的阈值,其实并非最佳的性能考虑。更理想的做法是,在延迟加载的媒体资源到达首屏边界之前设置一个缓冲区,以便媒体资源在进入视窗之前就开始进行加载。

例如在使用Intersection Observer方式实现延迟加载判断时,可以通过配置options对象中的rootMargin属性来建立缓冲区:

前端怎么优化加载延迟,前端,前端,性能优化

观察可知rootMargin的值与CSS中margin属性值类似,上述代码中在屏幕视窗下设置了一个宽度为256px的缓冲区,这意味着当媒体元素距离视窗下边界小于256px时,回调函数就会执行开始资源的请求加载。而对于使用滚动事件处理来实现延迟加载的传统实现方式,也只需要更改getBoundingClientRect的设置,包括进入一个缓冲区即可实现类似的效果。

4、资源占位

当延迟加载的媒体资源未渲染出来之前,应当在页面中使用相同尺寸的占位图像。如果不使用占位符,图像延迟显示出来后,尺寸更改可能会使页面布局出现移位。

用来占位的图像解决方案也有多种,十分简单的方式是使用一个与目标媒体资源长宽相同的纯色占位符,或者像之前使用的Base64图片,当然也可以采用LQIP或SQIP等方法。

其中LQIP的全称是低质量图片占位符,即使用原图的较低分辨率版本来占位,SQIP则是一种基于SVG的LIQP技术。

5、内容加载失败

图像资源可以采取如下方案进行规避:

前端怎么优化加载延迟,前端,前端,性能优化

6、图像解码延迟

渐进式的JPEG会先呈现出一个低像素的图像版本,随后会慢慢呈现出原图的样貌。这是因为图像从被浏览器请求获取,再到最终完整呈现在屏幕上,需要经历一个解码的过程,图像的尺寸越大,所需要的解码时间就越长。

为减少此类卡顿现象,可以采用decode方法进行异步图像解码后,再将其插入DOM结构中。但目前这种方式在跨浏览器场景下并不通用,同时也会复杂化原本对于媒体资源延迟加载的处理逻辑,所以在使用中应进行必要的可用性检查。下面是一个使用Image.decode()函数来实现异步解码的示例:

前端怎么优化加载延迟,前端,前端,性能优化

7、JavaScript 是否可用

在通常情况下,我们都会假定JavaScript始终可用,但在一些异常不可用的情况下,开发者应当做好适配,不能始终在延迟加载的图像位置上展示占位符。可以考虑使用〈noscript〉标记,在JavaScript不可用时提供图像的真实展示:

前端怎么优化加载延迟,前端,前端,性能优化

如果上述代码同时存在,当JavaScript不可用时,页面中会同时展示图像占位符和〈noscript〉中包含的图像,为此我们可以给〈html〉标签添加一个no-js类:

前端怎么优化加载延迟,前端,前端,性能优化

在由〈link〉标签请求CSS文件之前,在〈head〉标签结构中放置一段内联脚本,当JavaScript可用时,用于移除no-js类:

前端怎么优化加载延迟,前端,前端,性能优化

以及添加必要的CSS样式,使得在JavaScript不可用时屏蔽包含.lazy类元素的显示:

前端怎么优化加载延迟,前端,前端,性能优化

当然这样并不会阻止占位符图像的加载,只是让占位符图像在JavaScript不可用时不可见,但其体验效果会比让用户只看到占位符图像和没有意义的图像内容要好许多。

8、资源优先级

浏览器向网络请求到的所有数据,并非每个字节都具有相同的优先级或重要性。所以浏览器通常都会采取启发式算法,对所要加载的内容先进行推测,将相对重要的信息优先呈现给用户,比如浏览器一般会先加载CSS文件,然后再去加载JavaScript脚本和图像文件。但即便如此,也无法保证启发式算法在任何情况下都是准确有效的,可能会因为获取的信息不完备,而做出错误的判断。

1、优先级

浏览器基于自身的启发式算法,会对资源的重要性进行判断来划分优先级,通常从低到高分为:Lowest、Low、High、Highest等。

比如,在〈head〉标签中,CSS文件通常具有最高的优先级Highest,其次是〈script〉标签所请求的脚本文件,但当〈script〉标签带有defer或async的异步属性时,其优先级又会降为Low。我们可以通过Chrome的开发者工具,在network页签下找到浏览器对资源进行的优先级划分:

前端怎么优化加载延迟,前端,前端,性能优化

浏览器的资源优先级
1、预加载

使用〈link rel=“preload”〉标签告诉浏览器当前所指定的资源,应该拥有更高的优先级,例如:

前端怎么优化加载延迟,前端,前端,性能优化

这里通过as属性告知浏览器所要加载的资源类型,该属性值所指定的资源类型应当与要加载的资源相匹配,否则浏览器是不会预加载该资源的。在这里需要注意的是,〈link rel=“preload”〉会强制浏览器进行预加载,它与其他对资源的提示不同,浏览器对此是必须执行而非可选的。因此,在使用时应尽量仔细测试,以确保使用该指令时不会提取不需要的内容或重复提取内容。

如果预加载指定的资源在3s内未被当前页面使用,则浏览器会在开发者工具的控制台中进行警告提示,该警告务必要处理:

前端怎么优化加载延迟,前端,前端,性能优化

预加载警告

可以使用〈link rel=“preload”〉来让浏览器立即获取所需的字体文件:

前端怎么优化加载延迟,前端,前端,性能优化

这里的crossorigin属性非常重要,如果缺失该属性,浏览器将不会对指定的字体进行预加载。

2、预连接

通过〈link rel=“preconnect”〉标签指令,告知浏览器当前页面将与站点建立连接,希望尽快启动该过程。虽然这么做的成本较低,但会消耗宝贵的CPU时间,特别是在建立HTTPS安全连接时。如果建立好连接后的10s内,未能及时使用连接,那么浏览器关闭该连接后,之前为建立连接所消耗的资源就相当于完全被浪费掉了。

另外,还有一种与预连接相关的类型〈link rel=“dns-prefetch”〉。

3、预提取

前面介绍的预加载和预连接,都是试图使所需的关键资源或关键操作更快地获取或发生,这里介绍的预提取,则是利用机会让某些非关键操作能够更早发生。

显而易见,预提取最适合的场景是为用户下一步可能进行的操作做好必要的准备,如在电商平台的搜索框中查询某商品,可预提取查询结果列表中的首个商品详情页;或者使用搜索查询时,预提取查询结果的分页内容的下一页:

前端怎么优化加载延迟,前端,前端,性能优化

前端怎么优化加载延迟,前端,前端,性能优化文章来源地址https://www.toymoban.com/news/detail-859095.html

到了这里,关于Web 前端性能优化之三:加载优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试:【网络协议与性能优化】提升Web应用性能的策略

    嗨,亲爱的Web开发者!构建高性能的Web应用是每个开发者的梦想。本文将介绍一些性能优化策略,包括资源加载、懒加载和CDN等,以帮助你提升Web应用的性能。 1. 性能优化策略: 压缩资源: 使用Gzip或Brotli等压缩算法来减小CSS和JavaScript文件的大小,加快加载速度。 合并文件

    2024年02月11日
    浏览(41)
  • Web 前端性能优化之七:数据存储与缓存技术

    7、数据存储 在开发Web应用的过程中,会涉及一些数据的存储需求,常见的存储方式可能有: 保存登录态的Cookie; 使用浏览器本地存储进行保存的Local Storage和Session Storage; 客户端数据持久化存储方案涉及的Web SQL和IndexedDB; 直接存储在本机的文件系统上等。 文件系统、Web

    2024年04月12日
    浏览(43)
  • 前端开发怎么解决性能优化的问题? - 易智编译EaseEditing

    前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法: 压缩和合并代码: 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小,加快加载速度。使用压缩工具(如UglifyJS和CSSNano)和构建工具

    2024年02月11日
    浏览(47)
  • 如何缩短 js 解析时间,如何优化首屏(延迟加载)

    避免全局查找(沿着作用域链找需要时间),避免闭包,用数据结构等 压缩 剔除没用到的代码,把长表达式转换成同含义的短表达式等 语法转换和优化:压缩工具会对 JavaScript 代码进行语法转换和优化,以提高代码的执行效率。例如,它可能将一些长表达式简化为更短的形

    2024年02月16日
    浏览(49)
  • 微服务与服务网格技术的性能优化:实现低延迟与高吞吐量

    微服务和服务网格技术在近年来逐渐成为企业构建高性能、高可靠、高扩展性的软件系统的主流方法。微服务将应用程序拆分成小型服务,每个服务运行在自己的进程中,通过轻量级的通信协议(如HTTP/REST)进行通信。服务网格则是一种基础设施,为微服务提供了一套统一的管

    2024年02月22日
    浏览(35)
  • 【 Vue3 性能优化】页面加载性能 与 更新性能

    Vue 在大多数常见场景下性能都是很优秀的,通常不需要手动优化。然而,总会有一些具有挑战性的场景需要进行针对性的微调。 数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus教程 权限系统-商城 个人博客地址 Web 性能优化主要有两个方面: 页面加载性能 首次访问时,应

    2024年02月14日
    浏览(45)
  • 性能优化-react路由懒加载和组件懒加载

    随着项目越来越大,打包后的包体积也越来越大,严重影响了首屏加载速度,需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说,直接上干货 核心代码 配合路由表的完整例子 效果 组件加载前 组件懒加载后 这样就会大大加快首屏加载速度

    2024年02月14日
    浏览(39)
  • 【Angular性能优化】项目8版本加载速度缓慢、白屏时间、首页渲染性能优化方案

    随着业务的代码一点点增加,加上Angular的项目本身就比 vue、react 的重一些,随之而来的启动速度,更改文件后编译速度,以及打包速度也会变慢,于是乎想着优化下我们的项目。 本文章主要说的是 : 打包Angular项目的一些配置,性能优化方面的方案 打包后,用户进入页面的

    2024年04月10日
    浏览(51)
  • JVM性能优化 —— 类加载器,手动实现类的热加载

    每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将c

    2024年02月08日
    浏览(37)
  • 利用Intersection Observer实现图片懒加载性能优化

    Intersection Observer是浏览器所提供的一个 Javascript API,用于异步的检测目标元素以及祖先或者是顶级的文档视窗的交叉状态 这句话的意思就是: 我们可以看的图片当中,绿色的 target element(目标元素),并且存在一个顶层的或者祖先的文档视窗也就是当前图片中的,灰色的

    2024年01月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包