浏览器预加载器如何使页面加载速度更快

news2024/12/25 12:35:25

预加载器(也称为推测或前瞻预解析器)可能是浏览器性能有史以来最大的改进。

那么什么是预加载器以及它如何提高性能呢?

浏览器如何加载网页

网页充满了依赖关系——在下载相关的CSS之前页面无法开始渲染,然后当遇到脚本时HTML解析器会暂停直到脚本执行(当然,如果脚本是外部的,它也需要下载)。

让我们考虑一下浏览器如何加载页面:

  • 首先下载 HTML,浏览器开始解析它。它找到对外部 CSS 资源的引用并发出下载它的请求。

  • 浏览器可以在下载 CSS 时继续解析 HTML,但随后它会找到带有外部 URL 的脚本标记,现在(除非脚本具有asyncdefer属性)它必须等到脚本下载并执行。

  • 一旦脚本下载并执行,浏览器就可以继续解析 HTML,当它发现图像等非阻塞资源时,它会请求它们并继续解析,但是当它发现脚本时,它必须停止并等待脚本执行。被检索并执行。

尽管浏览器能够并行发出多个请求,但具有这种行为的浏览器通常不会与脚本并行下载任何资源。

测试页有两个样式表,头部有两个脚本,然后在正文中有两个图像、一个脚本,最后是另一个图像。

在这里插入图片描述

通过瀑布可以很容易地看到在下载脚本时并行下载停止。

如果浏览器仍然这样工作,那么页面加载速度会更慢,因为每次遇到脚本时,浏览器都需要等待脚本下载并执行,然后才能发现更多资源。

预加载器如何提高网络利用率

Internet Explorer、WebKit 和 Mozilla 都在 2008 年实施了预加载器,作为克服等待脚本下载和执行时网络利用率低的问题的一种方法。

当浏览器在脚本上被阻止时,第二个轻量级解析器会扫描标记的其余部分,查找也需要检索的其他资源,例如样式表、脚本、图像等。

然后,预加载器开始在后台检索这些资源,目的是当主 HTML 解析器到达这些资源时,它们可能已经被下载,从而减少页面稍后的阻塞。

(当然如果资源已经在缓存中那么浏览器就不需要下载它)

使用 IE8 重复之前的测试表明,其他资源现在与脚本并行下载,为此测试用例带来了巨大的性能改进:7 秒 vs 14 秒。

在这里插入图片描述

预加载器的行为因浏览器而异,并且仍然是一个实验领域,一些浏览器似乎有幼稚的实现,它们按照发现的顺序下载资源,但其他浏览器会优先考虑下载,例如 Safari 提供的样式表不适用于当前视口的优先级较低,Chrome 会以比页面上大多数图像更高的优先级安排脚本(即使是页面底部的脚本)。

预加载器陷阱

预加载器从标记中提取 URL,并且不会/无法执行 javascript,因此使用 javascript 插入的任何 URL 对它来说都是不可见的,并且这些资源的下载将被延迟,直到 HTML 解析器发现并执行加载它们的 javascript。

在某些情况下,使用 JavaScript 插入资源也会导致某些预加载器出错。

示例:

<html>
<head>
  <script>
      var file = window.innerWidth < 1000 ? "mobile.css" : "desktop.css";
      document.write('<link rel="stylesheet" type="text/css" href="css/' + file + '"/>');
  </script>
</head>
<body>
<img src="img/gallery-img1.jpg" />
<img src="img/gallery-img2.jpg" />
<img src="img/gallery-img3.jpg" />
<img src="img/gallery-img4.jpg" />
<img src="img/gallery-img5.jpg" />
<img src="img/gallery-img6.jpg" />
</body>
</html>

我不使用这种方法有几个原因,但即使是这个简单的例子也足以使 IE9 的预加载器出错——注意图像如何获取所有连接,并且 CSS 被延迟,直到其中一个图像完成并且连接变为可用的。

在这里插入图片描述

一些响应式图像方法使用后备图像,预加载器通常会在执行 javascript 以选择适当的图像之前启动后备图像下载,从而导致额外的下载。

影响预加载器

目前,我们影响预加载器优先级的方法有限(使用 javascript 隐藏资源就是其中之一),但W3C 资源优先级规范提出了两个属性来帮助表明我们的意图。

lazyload:在未标记为延迟加载的其他资源开始下载之前,不应下载资源

postpone:资源必须在用户可见(即在视口内并且显示不是无)之前才能下载。

预加载与预取

预取是向浏览器暗示将来肯定会或可能使用的资源的一种方式,一些提示适用于当前页面,其他提示适用于未来可能的页面。

在最简单的层面上,我们可以告诉浏览器将 DNS 解析为我们稍后将在页面上访问的另一个主机名:

<link rel="dns-prefetch" href="other.hostname.com">

Chrome 还允许我们暗示我们稍后将在当前页面中使用另一个资源,因此应该优先下载它:

<link rel="subresource"  href="/some_other_resource.js">

(Chromium 的源代码表明它实际上下载的优先级低于样式表/脚本和字体,但优先级等于或高于图像)

还有两种链接类型允许我们推测性地暗示接下来会发生什么,并且将以比当前页面上的资源更低的优先级下载。

预取可能位于下一页的单个资源:


<link rel="prefetch"  href="/some_other_resource.jpeg">

在后台选项卡中预取并渲染整个页面:

<link rel="prerender"  href="//domain.com/next_page.html">

总结

预加载器并不是什么新鲜事,它提供了显着的性能提升,作为开发者,我们不需要做任何特殊的事情来利用它。

原文链接:https://andydavies.me/blog/2013/10/22/how-the-browser-pre-loader-makes-pages-load-faster/

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

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

相关文章

零基础该如何自学linux运维?

零基础该如何自学linux运维&#xff1f;以下是建议帮助你入门Linux运维的一些建议。 一、自学建议&#xff1a; 理解基础概念&#xff1a;首先&#xff0c;你需要对Linux操作系统的基本概念有所了解&#xff0c;包括文件系统、用户权限、进程管理等。安装Linux系统&#xff1…

若依前后端部署系统--详细附图

一、后端部署 1、在ruoyi项目的Maven中的生命周期下双击package.bat打包Web工程&#xff0c;生成jar包文件。 提示打包成功 2、多模块版本会生成在ruoyi/ruoyi-admin模块下target文件夹,我们打开目录ruoyi-admin/taget&#xff0c;打开cmd&#xff0c;运行java -jar jar包名称…

【C语言进阶】程序编译中的预处理操作

&#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容讲解C语言中程序预处理要做的事情 目录 1.1 预处理符号 1.2 #define 1.2.1 #define定义标识…

【Docker学习】docker stats

命令&#xff1a; docker container stats 描述&#xff1a; 显示容器资源使用的状态&#xff08;实时&#xff09; 用法&#xff1a; docker container stats [OPTIONS] [CONTAINER...] 别名&#xff1a; docker stats(docker的一些命令可以简写&#xff0c;docker stats就等同…

Odoo17开发环境搭建

1.先下载godoo17_20240227_02.zip压缩包&#xff0c;里面包含了项目用到的所有的插件了&#xff0c;直接使用这个包即可。 下载地址&#xff1a;https://download.csdn.net/download/java173842219/89242257 2.解压该压缩包&#xff0c;目录如下&#xff1a; 3.下载pycharm并…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

声明式事务(@Transactional)使用时需要注意的坑

前言 上两篇文章已经详细分析了申明式事务的实现原理&#xff0c;知道了底层原理之后&#xff0c;现在就可以开始使用申明式事务去简化我们的代码了。但是在使用Transactional注解的时候也会经常遇到一些问题&#xff0c;有些问题不仔细测试观察的话还不容易发现&#xff0c;比…

Windows vbs脚本定时给焦点窗口发送消息

直接上脚本代码,你们可以自己看着改 MsgInputbox("message1") Msg1Inputbox("message2") numInputbox("number")a1 bnumset wshshellCreateObject("wscript.shell") 创建Windows的shell对象打开shell窗口 wscript.sleep 5000for ia t…

vue本地调试devtools

一、谷歌浏览器加载扩展程序 二、把解压的压缩包添加即可&#xff0c;重启浏览器 三、启动前端本地项目&#xff0c;即可看到Vue小图标

Linux|awk 特殊模式“BEGIN 和 END”

引言 在本文[1]&#xff0c;我们将介绍Awk的更多特性&#xff0c;特别是两个特殊的模式&#xff1a;BEGIN和END。 这些独特的功能在我们努力扩展和深入探索构建复杂Awk操作的多种方法时&#xff0c;将大有裨益。 实例 让我们从Awk系列的开篇回顾开始&#xff0c;回想一下&#…

SSL证书一般是怎么收费的?

SSL证书的费用通常按照以下几个因素决定&#xff1a; 1. 证书类型&#xff1a; - 域名验证&#xff08;DV&#xff09;证书&#xff1a;这是最基本的类型&#xff0c;仅验证域名所有权&#xff0c;费用一般在几十到几百之间. - 组织验证&#xff08;OV&#xff09;证书&#xf…

【触摸案例-手势解锁案例-九宫格 Objective-C语言】

一、手势解锁案例,九宫格,我们先来分析一下怎么实现: 首先呢,我们先来运行一下, 这一块儿,上面的这九个东西,肯定是要有一个九宫格的一个算法的问题,然后呢,上边的这九个小圆圈儿,这是什么东西,Button,为什么是Button,因为可以点,是吗,就因为这个?实际上,你用…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想 每次…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板&#xff0c;供大家参考。距离考试还有二十八天&#xff0c;如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发&#xff0c;后端基于java开发&#xff0c;前后端分离部署。整体采用B/S架构&…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

公网ip申请ssl仅260

现在很多网站都已经绑定域名&#xff0c;因此使用的都是域名SSL证书保护网站传输信息安全&#xff0c;而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书&#xff0c;用来保护用户的隐私以及数据安全&…

容器工作流

背景 目前某平台使用计算容器和解析容器&#xff0c;这两种容器目前通过rabbitmq消息来进行链接&#xff0c;形成容器工作流&#xff0c;使用容器工作流框架可以省去两个容器中间环节的控制&#xff0c;不需要再使用java代码对容器的操作&#xff0c;通过容器工作流框架即可控…

资深项目经理15年心得:管理需求变更5大技巧

高效管理需求变更对项目管理至关重要。通过严格的变更控制&#xff0c;确保所有需求变更都与项目目标和范围保持一致&#xff0c;避免偏离原定计划&#xff0c;有助于项目按既定目标顺利推进。能够及时评估变更对项目的影响&#xff0c;有利于减低项目延期和超支的风险&#xf…

特斯拉PIXCELL矩阵大灯擎耀远程控制技术照亮未来智能之光

在科技的浪潮中&#xff0c;特斯拉这个名字如同一道闪电&#xff0c;照亮了新能源汽车的天空。而在这片星空中&#xff0c;特斯拉PIXCELL矩阵大灯则如同一颗璀璨的星辰&#xff0c;以其独特的创新技术和卓越的性能&#xff0c;为驾驶者提供了前所未有的照明体验。矩阵大灯技术如…

OceanBase开发者大会实录-杨传辉:携手开发者打造一体化数据库

本文来自2024 OceanBase开发者大会&#xff0c;OceanBase CTO 杨传辉的演讲实录—《携手开发者打造一体化数据库》。完整视频回看&#xff0c;请点击这里&#xff1e;> 各位 OceanBase 的开发者&#xff0c;大家上午好&#xff01;今天非常高兴能够在上海与大家再次相聚&…