NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

加载时间从 4.6s 降到 0.7s,谷歌开源 quicklink

  • 2019-01-25
  • 本文字数:2649 字

    阅读完需:约 9 分钟

加载时间从4.6s降到0.7s,谷歌开源quicklink

近日,Google 团队在 GitHub 上开源了一个项目 quicklink,quicklink 能在空闲时预取 viewport 内的链接来加快后续页面的加载速度。具体的技术原理和实现过程请看下文。

工作原理

quicklink 通过以下措施加快后续页面的加载速度:


  • 检测 viewport 中的链接,使用Intersection Observer

  • 等待浏览器空闲,使用requestIdleCallback

  • 检查用户的连接速度(使用 navigator.connection.effectiveType)或者是否启用了 data-saver(使用 navigator.connection.saveData);

  • 预取链接(使用或 XHR),可以控制请求优先级(如果支持,可以切换到 fetch())。

为什么要推出 quicklink?

quicklink 旨在成为根据用户 viewport 中的链接预取内容的简易解决方案,而且要保持很小的体积(压缩后小于 1KB)。

安装

npm install --save quicklink
复制代码


也可以从unpkg.com/quicklink下载 quicklink。

用法

在初始化后,quicklink 将自动在空闲时预取 viewport 内的链接。


<!-- Include quicklink from dist --><script src="dist/quicklink.umd.js"></script><!-- Initialize (you can do this whenever you want) --><script>quicklink();</script>
复制代码


例如,你可以在 load 事件触发后进行初始化:


<script>window.addEventListener('load', () =>{   quicklink();});</script>
复制代码


ES 模块导入:


import quicklink from "quicklink/dist/quicklink.mjs";quicklink();
复制代码


上面的选项最适合多页面网站。单页应用程序也有几个可用的选项:


  • 在完成新路由导航后调用 quicklink();

  • 针对特定的 DOM 元素/组件调用 quicklink();

  • 使用自定义 URL 调用 quicklink({urls:[…]})进行预取。

API

quicklink 可以接受带有以下参数的可选选项对象:


  • el:包含需要预取的链接的 DOM 元素;

  • urls:要预取的 URL 数组(不是在 viewport 中检测到的文档或 DOM 元素的链接);

  • timeout:requestIdleCallback 超时时间,浏览器执行预取的时间(以毫秒为单位),默认为 2 秒;

  • timeoutFn:用于指定超时的函数,默认为 requestIdleCallback,也可以替换为networkIdleCallback等自定义函数;

  • priority:布尔值,指定预取优先级,默认为 false。如果设置为 true,将尝试使用 fetch() API(而不是 rel=prefetch);

  • origins:允许预取的 URL 主机名字符串数组。默认为与域名相同的 origin,防止跨 origin 请求;

  • ignores:一个 RegExp 函数或数组,用于决定是否应该预取某个 URL。在 orign 匹配之后执行。


待完成事项:


  • 检测资源的文件扩展名,并使用 rel=preload 进行高优先级预取;

  • 使用Priority Hints进行重要性提示。

polyfill

quicklink:


  • 可以回退到 requestIdleCallback;

  • 需要支持 IntersectionObserver,请参阅CanIUse。我们建议使用 Polyfill.io 等服务来有条件地 polyfill 该功能:


<script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script>
复制代码

一些示例

设置自定义的资源预取超时时间

默认为 2 秒(通过 requestIdleCallback),在这里我们将其设置为 4 秒:


quicklink({  timeout: 4000});
复制代码

设置包含预取 URL 的 DOM 元素

如果不设置,默认为 document。


const elem = document.getElementById('carousel');quicklink({  el: elem});
复制代码

设置预取 URL 数组

如果你想要直接提供预取 URL 的列表,而不是去检测 viewport,可以使用 URL 数组。


quicklink({   urls: ['2.html','3.html', '4.js']});
复制代码

设置预取的请求优先级

默认为低优先级(rel=prefetch 或 XHR)。对于高优先级(priority: true),尝试使用 fetch(),或者回退到 XHR。


quicklink({ priority: true });
复制代码

指定 origin 自定义列表

提供可预取的主机名列表。默认情况下只允许来自相同 origin 的 URL。


quicklink({  origins: [    // add mine    'my-website.com',    'api.my-website.com',    // add third-parties    'other-website.com',    'example.com',    // ...  ]});
复制代码

允许所有 origin

启用所有跨 origin 请求。


quicklink({  origins: true,  // or  origins: []});
复制代码

自定义 Ignore 模式

这些过滤器在 origin 匹配之后运行,对于避免下载大文件或动态响应 DOM 属性来说非常有用。


// Same-origin restraint is enabled by default.//// This example will ignore all requests to://  - all "/api/*" pathnames//  - all ".zip" extensions//  - all <a> tags with "noprefetch" attribute//quicklink({  ignores: [    /\/api\/?/,    uri => uri.includes('.zip'),    (uri, elem) => elem.hasAttribute('noprefetch')  ]});
复制代码


你可能希望忽略包含 URL 片段的 URL(例如 index.html #top)。如果你在页面中使用了锚点或为单页面应用程序设置了 URL 片段,希望避免触发此类 URL 的预取, 那么这项功能非常有用。


quicklink({    ignores: [        uri => uri.includes('#')        // or RegExp: /#(.+)/        // or element matching: (uri, elem) => !!elem.hash    ]});
复制代码

浏览器支持

quicklink 提供的预取可以被视为一种渐进式增强。跨浏览器支持情况如下:


  • 没有 polyfill:Chrome、Firefox、Edge、Opera、Android Browser, Samsung Internet。

  • 使用 Intersection Observer polyfill:Safari、IE11。

  • 上面的再加上 Set()和 Array.from polyfill:IE9 和 IE10。Core.js提供了 Set()和 Array.from()填充,也可以考虑es6-shim


提供了某些功能的分层支持:


  • Network Information API,用于检查用户的连接类型(通过 navigator.connection.effectiveType),仅适用于 Chrome 61+和 Opera 57+。

  • 如果选择{priority: true}并且 Fetch API 不可用,则将使用 XHR。

直接使用 prefetcher

quicklink 包含一个 prefetcher,可以单独导入到其他项目中使用。在将 quicklink 作为依赖项安装好以后,可以按如下方式使用它:


<script type="module">import prefetch from '../src/prefetch.mjs';
const urls = ['1.html', '2.html'];const promises = urls.map(url => prefetch(url));Promise.all(promises);</script>
复制代码

演示

这里是一个 WebPageTest演示


通过使用 quicklink,将页面加载时间减少了 4 秒。这里是进行预取前后的比较视频


出于演示的目的,我们在 Firebase 上部署了一个谷歌博客,然后我们又部署了另一个版本,在主页上添加了 quicklink,并测试从主页导航到文章的速度,结果预取版本的加载速度更快。


请注意:这并不是一个针对 viewport 内链接预取优缺点的详尽基准测试,我们只是演示了这个方法可以为我们带来的潜在改进。


英文原文:https://github.com/GoogleChromeLabs/quicklink


更多内容,请关注前端之巅。



2019-01-25 07:0017776
用户头像

发布了 731 篇内容, 共 434.2 次阅读, 收获喜欢 1997 次。

关注

评论 1 条评论

发布
用户头像
这个好
2019-01-27 10:48
回复
没有更多了
发现更多内容

都是植物补光,为什么你的没效果?

电子信息发烧客

一位CSDN的博主怀疑我抄袭他

Loken

音视频开发

SD-WAN的降本增效作用是如何体现的

Geek一起出海

沉浸文旅体验!实时云渲染助力2023广东旅博会智慧文旅元宇宙体验馆上线

3DCAT实时渲染

元宇宙 实时渲染 实时云渲染 实时渲染云

深入学习Python与Vscode环境的安装与配置

申公豹

Python

用户指南|使用 Helm Chart 部署单机版 GreptimeDB

Greptime 格睿科技

Kubernetes 时序数据库 #数据库 Helm Charts

软件测试/人工智能丨计算机视觉常见业务场景,原理和测试指标

测试人

人工智能 软件测试

【活动回顾】Databend 云数仓与 Databend Playground 扩展组件介绍

Databend

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

阿里巴巴云原生

阿里云 云原生

打造绿色计算数智动力 HashData 入选“绿色计算最具价值解决方案”

酷克数据HashData

一款功率电子开关TP6062

智趣匠

三大神医齐现身,竟为医院数据中心而来?

脑极体

数据中心

Python从基础到进阶字符串验证

申公豹

Python

从“卷智商”到“卷情商”我们能从一场华为海外发布会学到什么?

脑极体

PC

低代码与自动化:加速软件开发的新趋势

不在线第一只蜗牛

运维 自动化 低代码

Python 函数式编程让代码直接优雅起来

秃头小帅oi

在 Excel 里研发俄罗斯方块;全国首例「AI 声音侵权案」审理丨 RTE 开发者日报 Vol.106

声网

计算机设计大赛信息可视化设计的获奖经验剖析解读—4C大赛【全网最全万字攻略-获奖必读】

申公豹

可视化

文心一言 VS 讯飞星火 VS chatgpt (156)-- 算法导论12.3 3题

福大大架构师每日一题

福大大架构师每日一题

基于STM32的物联网节点设计与实现-传感器数据采集与无线通信

申公豹

嵌入式

SAP数据一键拉取!利用零代码ETL工具快速实现数据同步

RestCloud

数据同步 ETL SAP

利用机器学习实现客户细分:提升市场营销效果的技术策略

快乐非自愿限量之名

机器学习 框架 客户细分

马上2024年了,现在去开发一款App需要投入多少资金?

编程的平行世界

开发 Android Studio 成本管理

纯干货|聊一聊大促活动背后的技术:火山引擎边缘云CDN/DCDN/GA

火山引擎边缘云

CDN CDN加速 加速 内容分发 CDN带宽

雅高与亚马逊云科技合作为宾客提供卓越体验

财见

三大神医齐现身,竟为医院数据中心而来?

白洞计划

AI

某公司案例分析

尚思卓越

运维 堡垒机

【写作训练营打卡|08】写作的四大问题踩坑点总结

写作

C 语言注释和变量详解

小万哥

c c++ 程序员 后端 软件开发

在Python中实现条形图动态追赶动画效果

申公豹

Python

Google Gemini Pro API专家级体验

Bob Lin

人工智能 AI openai LLM gemini

加载时间从4.6s降到0.7s,谷歌开源quicklink_大前端_Google官方团队_InfoQ精选文章