做前端性能优化,还不知道什么是Preload、Prefetch、Preconnect、Prerendering,你就out了?
做前端性能优化,还不知道什么是Preload、Prefetch、Preconnect?
今天,我们将探讨当前的资源提示和指令,这是提高网站或 Web 应用程序性能的另一种好方法。您可能听说过Preload、Prefetch、Preconnect,但我们将会更加深入地了解它们之间的不同之处,以及如何从中获的性能提升。这些优点是,它们允许 Web 开发人员在用户浏览页面时优化资源交付、减少往返行程和获取资源以更快地交付内容。
preload
预加载
是一种新的 Web 标准,它提供了对当前导航获取特定资源方法的更多控制。这是 2016 年 1 月弃用的子资源预取的更新版本。例如,此指令可以在元素中定义 。通常,它最适合最重要的资源,如图像、CSS、JavaScript 和字体文件。这与浏览器预加载不一,在浏览器预加载中,仅预加载 HTML 中声明的资源。该指令实际上克服了这一限制,并允许通过CSS和JavaScript启动的资源进行预加载,并定义何时应用每个资源。<link>
<link rel="preload">
preload
与 它侧重于获取当前导航的资源不同。 侧重于为下一个导航获取资源。还必须注意,不要阻止窗口的事件。
优点:
- 允许浏览器设置资源优先级,因此允许 Web 开发人员优化某些资源的交付。
- 使浏览器能够确定资源类型,因此它可以判断将来是否可以重用相同的资源。
- 浏览器可以通过引用属性中定义的内容来确定请求是否符合内容安全策略。
as
- 浏览器可以根据资源类型(例如 )发送相应的标头。
Accept
image/webp
下面是预加载图像的一个非常基本的示例。
<link rel="preload" href="image.png">
下面是预加载字体的示例。如果要预加载具有启用 CORS 的资源的链接,还必须包括 该属性。crossorigin
<link rel="preload" href="https://example.com/fonts/font.woff" as="font" crossorigin>
下面是使用标记和 JavaScript 预加载样式表的示例。
<!-- Via markup -->
<link rel="preload" href="/css/mystyles.css" as="style">
<!-- Via JavaScript -->
<script>var res = document.createElement("link");res.rel = "preload";res.as = "style";res.href = "css/mystyles.css";document.head.appendChild(res);
</script>
有一个有趣的解决方法,以获得异步加载的样式使用标记。这意味着它是非渲染阻止!
preload
浏览器支持
preload
支持于 2016 年 4 月添加到Chrome 50中,并且还得到 Opera 37 及更上面的支持。
阅读我们关于预加载指令的完整深入
文章。
prefetch
prefetch
是一个低优先级的资源提示,允许浏览器在后台(空闲时间)提取以后可能需要的资源,并将其存储在浏览器的缓存中。一旦页面加载完成后,它开始下载其他资源,如果用户然后点击预取的链接,它会立即加载内容。有三种不同类型的预取,链接,DNS和预发型,我们将在下面进入更多。
如上所述,prefetch
取允许浏览器获取资源,将它们存储在缓存中,假设用户将请求它们。浏览器在 HTML 元素或 HTTP 标头中寻找,例如:
- Html:
<link rel="prefetch" href="/uploads/images/pic.png">
- HTTP 标头:
Link: </uploads/images/pic.png>; rel=prefetch
这种技术有可能加快许多交互式网站的速度,但不可能在任何地方都起作用。对于某些网站,很难猜测用户下一步可能做什么。对于其他人,如果获取得太快,数据可能会过时。同样重要的是要小心不要太早预放文件,或者您可以减慢用户正在查看的页面速度。 - 谷歌开发者
除了Safari、IOS Safari 和Opera Mini 之外,大多数现代浏览器都支持链接。如果您尝试测试,Chrome 和 Firefox 也会在网络面板中显示预取的资源。prefetch
dns-prefetch
DNS 预取允许浏览器在用户浏览时在后台的页面上执行 DNS查找。这最大限度地减少了延迟,因为一旦用户单击链接,DNS 查找就已发生。通过将标记添加到链接属性,可以将 DNS 预取添加到特定 URL。我们建议在 Google 字体、Google 分析和 CDN 等方面使用此功能。rel="dns-prefetch"
DNS 请求在带宽方面非常小,但延迟可能相当高,尤其是在移动网络上。通过推测性地预提取 DNS 结果,延迟可以显著减少,在特定时间,例如当用户单击链接时。在某些情况下,延迟可以减少一秒钟。 - Mozilla 开发人员网络
它还可用于重定向背后的资源。请参阅下面的示例。
<!-- Prefetch DNS for external assets -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//www.google-analytics.com">
<link rel="dns-prefetch" href="//cdn.domain.com">
还必须注意,当您在地址栏中键入诸如 DNS 预解和TCP 预连接等功能时,Google Chrome 已经执行过类似的事情。太酷了!您可以通过 访问 来查看列表。chrome://dns/
您还可以利用 PageSpeed 筛选器,insert_dns_prefetch所有域的页眉中自动显示标记。<link rel="dns-prefetch">
DNS 预处理 也支持大多数现代浏览器,除了 Opera Mini。
Prerendering
预发自给与预发非常相似,因为它收集了用户可能导航到的下一个资源。区别在于预渲染实际上呈现整个页面的背景,文档的所有资产。下面是一个示例。
<link rel="prerender" href="https://www.keycdn.com">
应用程序可以使用预渲染提示来指示下一个可能的 HTML 导航目标:用户代理将提取并处理指定的资源作为 HTML 响应。若要使用适当的请求标头获取其他内容类型,或者不需要 HTML 预处理,应用程序可以使用预取提示。 - W3C
您希望在预渲染时更加小心,因为预渲染资源非常繁重,并可能导致带宽浪费,尤其是在移动设备上。还必须注意,您不能使用 Chrome DevTools 来测试此内容,而是可以看到页面是否正在预渲染。您也可以在一个prerender-test.appspot.com。chrome://net-internals/#prerender
prerender 仅
一些浏览器支持,除了 Mozilla 火狐, Safari, Ios Safari, Opera mini 和 Android 浏览器。
除了额外的资源,还有一些额外的缺点,使用预取,如批评的隐私。
- 即使谷歌说它禁止了标签,网络统计信息也可能被夸大。
- 用户可能会通过下载更多页面或从未请求的网站(随着驱动下载变得更加先进和多样化而变得更加复杂),面临更多的安全风险。
- 如果预取访问未经授权的内容,用户可能会违反其网络或组织的可接受使用策略。
请务必查看有关使用预取资源提示的深入帖子。
preconnect
我们要讨论的最后一个资源提示是 。该指令允许浏览器在HTTP 请求实际发送到服务器之前设置早期连接。这包括 DNS 查找、TLS 协商、TCP 握手。这反过来又消除了往返延迟,并节省了用户的时间。
预连接是优化工具箱中的重要工具...它可以从请求路径中消除许多昂贵的往返 - 在某些情况下,可将请求延迟减少数百甚至数千毫秒。 - 伊利亚·格里戈里克
可以在 HTML 中将 直接添加到链接标记中作为属性。它也可以通过 HTTP 标头传递,也可以由 JavaScript 基于用户活动调用。下面是启用 CDN URL 的示例。
<link href="https://cdn.domain.com" rel="preconnect" crossorigin>
下面是使用 Google 字体的示例。通过 添加 提示,它将与 CSS 请求并行启动请求,从而允许立即发送字体请求。在此特定方案中,从关键路径中删除了三个RTT,并消除了超过一半的延迟秒。查看更多关于lya格里戈里克关于消除RTTS与预连接的详细帖子。preconnect
preconnect
fonts.gstatic.com
preconnect
高效和深思熟虑地使用不仅有助于优化您的网站,而且将防止您充分利用资源。 一些现代浏览器支持,除了互联网浏览器, Safari, iOS Safari 和 OperaMini 。preconnect
preconnect
请务必查看有关使用预连接资源提示的深入
帖子。
总结
希望现在你更了解什么 ,和 是,以及如何可以利用他们,以加快内容和资产的交付,使用它们的战略方式。在接下来的几个月里,该指令将获得更多的支持,而 Web 开发人员也开始采用该指令,这将是令人振奋的。preload
prefetch
preconnect
preload
做前端性能优化,还不知道什么是Preload、Prefetch、Preconnect、Prerendering,你就out了?相关推荐
- 罗海雄:仅仅使用AWR做报告? 性能优化还未入门(含PPT)
编辑手记:祝贺罗海雄老师加入Oracle ACE社区,他是数据库SQL开发和性能优化专家,也是ITPUB论坛的资深版主,我们整理了罗老师一篇AWR裸数据分析的文档,供大家学习参考(同款PPT和相关源码 ...
- 原来前端性能优化还可以这么玩?
事件委托 事件委托(也叫事件代理)利用了事件冒泡,把监听函数绑定在父容器上.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息. 使用事件委托的优点: a. ...
- 前端服务器获取js文件偶尔慢_我所认识的前端性能优化
现象: 用户体验差 网页太卡打不开(卡.慢) 服务器带宽流量(成本) 服务器压力 从哪处理:各处的缓存 地址缓存 减少DNS的解析请求.预解析DNS(不是"解析DNS") TCP缓 ...
- 前端性能优化总结(遇到好的,就得珍惜)
前端性能优化(一) 前端是庞大的,包括 HTML. CSS. Javascript.Image .Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的 ...
- 还是关于前端性能优化,真的是的从细节开始
前端性能优化(一) 前端是庞大的,包括 HTML. CSS. Javascript.Image .Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的 ...
- 前端性能优化:启用 gzip
大家好,我是前端西瓜哥.今天带大家学习如何启用 gzip 来做前端性能优化. HTTP 上的 gzip gzip 是一种优秀的压缩算法,我们可以在 HTTP 请求上对一些文本文件,设置 gzip 压缩 ...
- 回归 HTTP 协议本质:前端还能做哪些性能优化?
上篇文章聊到:在 HTTP 2.0 时代以后,不需要额外担心由于 TCP 连接数带来的前端性能问题,因此我们不再需要雪碧图等优化手段了.于是前端工程师在 HTTP 协议这层能做的性能优化似乎只有「尽可 ...
- Web前端性能优化,应该怎么做?
本文将分享一些前端性能优化的常用手段,包括减少请求次数.减小资源大小.各种缓存.预处理和长连接机制,以及代码方面的性能优化等方面. base64:尤其是在移动端,小图标可以base64(webpack ...
- 【Day11】平时在项目开发中都做过哪些前端性能优化
平时在项目开发中都做过哪些前端性能优化 一.体验优化 二.提升页面性能 三.首页加载优化(减少白屏时间) 一.体验优化 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提 ...
最新文章
- 20165232 2017-2018-2《Java程序设计》结对编程一 第一周总结
- 使用命令行对Android应用签名
- linux实用小工具,Linux系统小工具使用大用途---1
- 一套存储承载全场景,XSKY星辰天合发布企业级SDS V5系列
- 理解字节序(大小端)
- (干货)css常用技巧
- 亚马逊EC2根硬盘空间扩容
- 思必驰十年创业,(现在)是一家怎样的公司?
- 自有数据集上,如何用keras最简单训练YOLOv3目标检测
- 最棒的PHP后台管理系统
- java线程状态与操作系统线程状态的关系
- edwin报警和监控平台近期的更新(python源码)
- 分布式环境下限流器springboot实现,令牌桶
- C语言中的二分查找法
- 试题 历届真题 机器人行走(C语言实现)
- 华为方舟编译器开源官网正式上线:源代码已开放下载;中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”……...
- 亚马逊雨林大火为何上不了热搜?我们都被某些媒体给忽悠了!
- 小熊派开发板移植RT-FOTA
- 奈奎斯特与香农定理等系列概念(易混淆)
- 哈夫曼编码算法 c语言,《哈夫曼编码的算法》
热门文章
- Spring Cloud微服务之Gateway网关(十三)
- C# 中 Struct 与 Class 的区别,以及两者的适用场合
- 在 phpMyAdmin 里添加新用户帐号
- 无处不在的xss攻击
- 使用CSS3伪类元素(::before|::after)对文字进行美化
- WordPress 数据库操作WPDB对象($wpdb)用法详解
- Magento中调用JS文件的几种方法
- 搜索——下沙小面的2(hdu1572)
- gcc g++ 支持c++11编译的标准和区别
- Oracle之ROW_NUMBER() OVER函数