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

栏目: IT技术 · 发布时间: 7年前

内容简介:加载时间从4.6s降到0.7s,谷歌开源quicklink

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

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

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

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

    https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API

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

    https://developer.mozilla.org/en-US/docs/Web/API/Window/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 内的链接。




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

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(https://github.com/pastelsky/network-idle-callback)等自定义函数;

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

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

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

待完成事项:

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

  • 使用 Priority Hints(https://github.com/WICG/priority-hints)进行重要性提示。

polyfill

quicklink:

  • 可以回退到 requestIdleCallback;

  • 需要支持 IntersectionObserver,请参阅 CanIUse(https://caniuse.com/#feat=intersectionobserver)。我们建议使用 Polyfill.io 等服务来有条件地 polyfill 该功能:

一些示例
 设置自定义的资源预取超时时间

默认为 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  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 提供的预取可以被视为一种渐进式增强。跨浏览器支持情况如下:

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

直接使用 prefetcher

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

 演 示 

这里是一个 WebPageTest 演示:

https://www.webpagetest.org/video/view.php?id=181212_4c294265117680f2636676721cc886613fe2eede&data=1

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

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

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

英文原文:

https://github.com/GoogleChromeLabs/quicklink

活动推荐

2019 年 5 月 6-8 日,QCon 与您相约北京国际会议中心,深度解析业界前沿领域及技术趋势。点击 「 阅读原文 」或识别二维码了解 QCon 十周年精心策划,现在购票即享 8 折限时折扣,立减 1760 元,团购还有更多优惠!有任何问题欢迎联系票务小姐姐 Ring:电话 010-53935761,微信 qcon-0410

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

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


以上所述就是小编给大家介绍的《加载时间从4.6s降到0.7s,谷歌开源quicklink》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Text Processing in Python

Text Processing in Python

David Mertz / Addison-Wesley Professional / 2003-6-12 / USD 54.99

Text Processing in Python describes techniques for manipulation of text using the Python programming language. At the broadest level, text processing is simply taking textual information and doing som......一起来看看 《Text Processing in Python》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具