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

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

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

浏览器如何加载网页

网页充满了依赖关系——在下载相关的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/

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 常用的3Dtiles加载有以下几种: 1. Cesium: Cesium是一款开源的3D地球浏览器,支持使用3Dtiles加载3D模型。 2. Potree: Potree是一款开源的3D点云浏览器,支持使用3Dtiles加载3D点云模型。 3. X3DOM: X3DOM是一款开源的3D Web浏览器,支持使用3Dtiles加载3D模型。 4. three.js: three.js是一款开源的3D JavaScript库,支持使用3Dtiles加载3D模型。 5. Sketchfab: Sketchfab是一款在线3D模型浏览器,支持使用3Dtiles加载3D模型。 这些3Dtiles加载都可以提供高效的3Dtiles加载服务。 ### 回答2: 目前市场上有很多高效的3Dtiles加载可供选择,以下是其中一些常见的: 1. Cesium:Cesium是一个开源的基于WebGL的虚拟地球引擎,它支持加载和渲染3Dtiles格式的地理数据。Cesium具有高效的渲染性能和优化的数据压缩算法,能够快速加载大规模的3Dtile数据,并进行动态的渲染和交互操作。 2. iTowns:iTowns是一个基于WebGL的地理信息可视化引擎,它也支持加载和渲染3Dtiles格式的数据。iTowns具有高性能的数据处理能力和优化的渲染算法,可以快速加载大规模的3Dtile数据集,并提供交互式的浏览和分析功能。 3. Potree:Potree是一个用于点云数据可视化的工具库,它也支持加载和渲染3Dtiles格式的数据。Potree具有高效的点云数据压缩和渲染算法,可以高速加载和显示大规模的点云数据,并提供高度定制化的显示效果和交互功能。 这些高效的3Dtiles加载在性能和功能上都有一定的优势,用户可以根据自己的需求和项目要求选择合适的加载。同时,还应根据实际场景和硬件条件,综合考虑加载速度、内存占用和渲染质量等因素,选择适合自己的加载以获得更好的使用体验。 ### 回答3: 高效的3Dtiles加载有许多种,以下是其中一些常用的: 1. Cesium:Cesium是一款开源的JavaScript库,它提供了丰富的地球数据可视化功能,包括对3Dtiles的加载和渲染。Cesium的加载是高效的,能够快速加载大量的3Dtiles数据,并提供了灵活的配置选项,例如加载优先级、LOD(级别的细节)控制等。Cesium还支持多种地形、影像和矢量数据,并提供了丰富的交互和可视化效果。 2. Three.js:Three.js是一款流行的JavaScript 3D图形库,它也提供了对3Dtiles的加载和渲染功能。Three.js的加载性能优秀,能够处理大规模的3Dtiles数据。它具有强大的渲染功能,支持多种效果和材质,并提供了灵活的控制和交互接口。 3. iTowns:iTowns是一款基于Three.js的开源JavaScript库,专注于地理信息的可视化。它支持对3Dtiles的高效加载和渲染,具有较低的内存占用和较高的渲染性能。iTowns提供了丰富的可视化效果和交互功能,并支持多种地理数据格式和服务。 以上是一些常用的高效3Dtiles加载,它们都提供了丰富的功能和性能优化选项,能够满足不同应用需求。选择合适的加载取决于具体的应用场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值