油管、BBC 都在用的优化技术:fetchPriority

看了看油管的网站,发现它们用了这个属性,解决了之前怎么设置资源优先级的困扰。

image.png

image.png

简介

我们都知道,在浏览器解析网页并开始发现和下载资源(如图片、脚本或CSS)时,它会为这些资源分配一个获取优先级,以尝试以最优顺序下载资源。这些优先级可以取决于资源的类型以及其在文档中的位置。例如,在视口内的图片可能具有High的优先级,在<head>中的<link>元素加载的CSS可能具有Very High的优先级。浏览器在分配优先级方面表现得相当不错,但在某些情况下可能不是最优的。

Fetch Priority 可以在以下几个关键领域发挥作用:

提高图片LCP的优先级: 在 img 元素上指定 fetchpriority="high",可以使 LCP 尽早的触发。

使用更好的语义来增加异步脚本的优先级: 这比通常使用的 <link rel="preload"> 更有效。

降低后加载脚本的优先级: 这样可以更好地与图片进行顺序加载。

以前,我们会使用 preloadpreconnect 对资源优先级有一些影响, 但是这种影响时有限的。Fetch Priority 是 Resource Hints 的补充,但是理解它们的使用位置很重要。

Preload 可以让你告诉浏览器你想要在关键资源被自然发现之前就加载它们。这对于不容易发现的资源特别有用,例如样式表中包含的字体、背景图或从 script 加载的资源。

Preconnect 有助于预热到跨源服务器的连接,可以优化 TTFB 之类的指标,并且在知道 origin 但不一定知道确切 URL 的场景时非常有用。

Fetch Priority 是一种基于标记的信号(设置 fetchpriority 属性),可以用它告诉特定资源的相对优先级。您还可以通过 JavaScript 和 Fetch API 使用这些提示,Fetch API 是通过设置 priority 属性。Fetch Priority 还可以与 preload 配合使用。比如,在样式表中包含的 LCP 图片即使使用了预加载,但是它的优先级仍然很低。如果它被其他早期低优先级资源推迟,可以使用 Fetch Priority 来早地加载图像。

// 几种使用方式 
<img src="/images/in_viewport_but_not_important.svg" fetchpriority="low" alt="I'm an unimportant image!">  
   
<link rel="preload" href="/js/script.js" as="script" fetchpriority="low">  
  
<script>  
    fetch('https://example.com/', {priority: 'low'})
    .then(data => {});  
</script>

资源优先级

资源下载顺序取决于浏览器为页面的每个资源分配的优先级。不同的因素会影响优先级计算逻辑。

  • CSS、字体、脚本、图片和第三方资源分配不同的优先级。
  • 在文档中引用资源的位置或顺序也会影响资源的优先级。
  • preload 资源提示有助于浏览器更快地发现资源,从而在文档加载之前加载资源,并影响优先级。
  • script 设置了 async 和 defer 也会影响优先级

当前大多数资源在Chrome中的优先级和顺序

布局阻塞在布局阻塞阶段加载在布局阻塞阶段逐个加载资源
Blink 优先级VeryHighHighMedium Low VeryLow
DevTools 优先级HighestHighMedium Low Lowest
主要资源
CSS*** (early**)CSS*** (late**) ## CSS (mismatch)
Script (early** or not from preload scanner)Script (**late) Script (async) ##
FontFont (preload)
Import
视口中的 Image## Image ##
## Media ##
## SVG document ##
## ## Prefetch
Preload*
XHR (sync)XHR/fetch* (async)
  1. '*' 使用 as 进行预加载或使用了"type"的 fetch 会使用它们请求的类型的优先级(例如,预加载 as="stylesheet" 将使用 Highest 优先级)。如果没有 "as",它们会表现得像 XHR。

    • fetch('image.jpg', { type: 'image/jpeg' }) ,浏览器会根据请求的资源类型来确定它的优先级。

    • <link rel="preload" href="styles.css" as="style">

  2. '**' "Early": 在请求任何非预加载图像之前的请求("late" 是之后)

  3. '***' 如果 CSS 的媒体查询类型不匹配,就不会被预加载扫描器获取,并且只会在主解析器到达时处理,这通常意味着它会被很晚地获取并且具有"late"优先级。

解释下第3点: <link rel="stylesheet" href="styles.css" media="print"> 在这个link中,styles.css 的媒体类型为 print,而浏览器在预加载时可能会忽略它,因为当前页面加载的是 "screen" 媒体类型的样式。只有当页面主解析器达到 "styles.css" 样式表时,它才会被处理,这可能发生得很晚,因此它的优先级可能是"late"。

看下前后的优先级:

image.png

image.png

image.png

什么时候需要用 fetchPriority 🍒

首先,了解浏览器的优先级逻辑可以帮助你调整下载顺序。通过以下方式来控制浏览器的优先级计算,从而改善性能和核心 Web Vitals:

  1. 根据希望下载它们的顺序,放置资源标签,如
  2. 用 preload 资源提示来尽早下载必要的资源,特别是那些浏览器不容易早期发现的资源。
  3. 用 async 或 defer 异步下载脚本,而不会阻塞其他资源。
  4. 懒加载屏幕以外的内容,以便浏览器可以为更重要的内容更快的下载

在某些情况下,这些方法可能不太够用,这时候可以尝试下 fetchPriority :

  1. 比如轮播图,一般刚开始就会出现在视口中,但不必都具有相同的优先级,只有第一个可见的图像需要比其他图像具有更高的优先级(YouTube 视频预览图同理)。

  2. 有的视口内的主要图像是 "Low" 优先级,这一般会能感受到明显延迟。在标记中提供Fetch优先级可以让图像以“高”优先级开始,并更早地开始加载。

    注意:CSS 中 background 中的 LCP 图像,仍然需要使用预加载(preload)。可以通过在预加载元素上添加 fetchpriority='high' 来与 Fetch Priority 结合使用,否则图像仍将以默认的“低”优先级开始加载。

  3. 将脚本声明为异步(async)或延迟(defer)。这样脚本就是“low”优先级。我们可以添加 fetchpriority提高它们的优先级,同时确保异步下载。

  4. 还可以使用 fetch 来异步获取资源或数据。fetch 是“High”优先级。但有时候,我们可能不希望所有的 fetch 都以“High”优先级执行,比如初始化页面时,同时请求几个接口,想要某一部分数据最快展示出来。

  5. 浏览器将CSS和字体看成“High”优先级,但是对于LCP来说,并非所有这些资源都同等重要或必需。可以使用Fetch Priority来降低其中一些资源的优先级。

兼容性

惨不忍睹,但是不影响使用

如果学到了新知识,麻烦点个 👍 和 ⭐

全部评论

相关推荐

Z_eus:别打招呼直接发你的优势
点赞 评论 收藏
分享
咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
本科生是不是只能去送外卖了
有气魄的海豚在喝茶:外卖这个版本被保安克制
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务