最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

加载时间从 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:0017773
用户头像

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

关注

评论 1 条评论

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

3D模型轻量化

3D建模设计

3D轻量化 三维模型轻量化

纹理贴图如何为游戏角色增添质感

3D建模设计

3D渲染 3D材质纹理贴图 3D材质编辑器

GLTF编辑器设置3D纺织纹理贴图

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图

【Linux】工具介绍vim及gcc详解。

百度搜索:蓝易云

vim Linux 运维 云服务器 GCC

原创逼真实时互动“青否数字人”是如何生产出来的?

青否数字人

数字人

数字人分身让企业更高效!

青否数字人

YouTube音乐转MP3转换器 MediaHuman YouTube to MP3 Converter 中文

mac大玩家j

Mac软件 音频格式转换器

分层架构最佳实践

俞凡

架构

关于在容器中,nignx代理后端多个服务如何保证后端服务的地址不变呢?

百度搜索:蓝易云

nginx 云计算 Linux 运维 云服务器

Office2019 for Mac(办公套件全家桶) v16.78正式激活版

mac

苹果mac Windows软件 office 2019

小红书 X WSDM 2024「对话式多文档问答挑战赛」火热开赛!

小红书技术REDtech

人工智能 数据挖掘 搜索 信息检索 WSDM

解读 $mash 通证 “Fair Launch” 规则,公平的极致?(Staking 玩法)

EOSdreamer111

好用的软件卸载工具:TrashMe激活最新版

mac大玩家j

Mac软件 卸载工具 软件卸载

3D 建模中的 GLTF、USDZ 和 GLB 3D 文件格式

3D建模设计

3D模型 GLTF glb USDZ

Helm vs Kustomize 深度比较

俞凡

Kubernetes 云原生 Helm Kustomize

技术写作概述:内容分析、平台和转化追踪以及内容老化

小万哥

程序人生 软件工程 后端开发 技术写作 内容分析

解读 $mash 通证 “Fair Launch” 规则,公平的极致?(Staking 玩法)

股市老人

如何提高3D渲染速度

3D建模设计

3D渲染 3D加载 3D模型加载速度 3D模型渲染效率

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(Staking 玩法)

西柚子

clickhouse重启,以及修改数据存储目录后重启失败的解决办法

百度搜索:蓝易云

云计算 Linux 运维 Clickhouse 服务器

项目经验还写外卖和商城?来看看异构数据源数据流转服务DatalinkX

李晓飞

flink springboot

macos三国策略游戏:三国志11威力加强版最新中文版

胖墩儿不胖y

mac游戏 游戏推荐 好玩的游戏分享

重庆大学OpenHarmony技术俱乐部成立:产学研紧密合作,共创数智生态新篇章

科技热闻

交互式数字人将取代全球3亿人工岗位!

青否数字人

数字人

如何避免购买体育直播系统源码时隐藏费用陷阱

软件开发-梦幻运营部

软件开发给外包公司,开发需求功能纸面合同化有多重要

软件开发-梦幻运营部

文字处理软件推荐 Mellel 6 激活中文版

胖墩儿不胖y

Mac软件 文字处理软件

etcd-workbench一款免费好用的ETCD客户端,支持SSH Tunnel、版本对比

北风

Docker etcd tools etcd-client

Ulysses 27 for Mac(markdown编辑软件) v27.3中文完整激活版

mac

苹果mac Windows软件 Ulysses Markdown写作工具

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(Staking 玩法)

长安区块链

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