标签:mamicode pre tor sel nav 允许 ext 开源 add
加载时间从4.6s降到0.7s,谷歌开源quicklink
作者|Google 团队
译者|无明
近日,Google 团队在 GitHub 上开源了一个项目 quicklink,quicklink 能在空闲时预取 viewport 内的链接来加快后续页面的加载速度。具体的技术原理和实现过程请看下文。
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();
上面的选项最适合多页面网站。单页应用程序也有几个可用的选项:
使用自定义 URL 调用 quicklink({urls:[…]}) 进行预取。
quicklink 可以接受带有以下参数的可选选项对象:
quicklink:
<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 提供的预取可以被视为一种渐进式增强。跨浏览器支持情况如下:
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 演示:
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
标签:mamicode pre tor sel nav 允许 ext 开源 add
原文地址:https://blog.51cto.com/15057848/2567777