通过在空闲时间预取或预渲染视口内的链接,实现后续页面加载更快
Quicklink 试图使导航到后续页面的加载速度更快。它:
navigator.connection.effectiveType)或启用了数据保护(使用navigator.connection.saveData)<link rel=prefetch>或XHR)或预渲染(使用Speculation Rules API)链接的URL。提供一些对请求优先级的控制(如果支持,可以切换到fetch())。这个项目旨在为网站提供一个即插即用的解决方案,根据用户视口中的内容预取或预渲染链接。它还致力于保持小巧(压缩并gzip后小于2KB)。
npm install quicklink
你也可以从unpkg.com/quicklink获取quicklink。
初始化后,quicklink将在空闲时自动预取视口内链接的URL。
快速开始:
<!-- 从dist引入quicklink --> <script src="dist/quicklink.umd.js"></script> <!-- 初始化(你可以在任何时候进行) --> <script> quicklink.listen(); </script>
例如,你可以在load事件触发后初始化:
<script> window.addEventListener('load', () => { quicklink.listen(); }); </script>
ES模块导入:
import {listen, prefetch} from 'quicklink';
npm install quicklink webpack-route-manifest --save-dev
然后,按照这里的说明将Webpack路由清单配置到你的项目中。
这将生成一个名为rmanifest.json的路由和代码块映射。可以在以下位置获取:
site_url/rmanifest.jsonwindow.__rmanifest在你想添加预取功能的地方导入quicklink React HOC。
用withQuicklink()HOC包装你的路由。
例子:
import {withQuicklink} from 'quicklink/dist/react/hoc.js'; const options = { origins: [], }; <Suspense fallback={<div>加载中...</div>}> <Route path='/' exact component={withQuicklink(Home, options)} /> <Route path='/blog' exact component={withQuicklink(Blog, options)} /> <Route path='/blog/:title' component={withQuicklink(Article, options)} /> <Route path='/about' exact component={withQuicklink(About, options)} /> </Suspense>;
返回:Function
返回一个"重置"函数,该函数将清空活动的IntersectionObserver和已预取或预渲染的URL缓存。这可以在页面导航之间和/或发生重大DOM更改时使用。
Booleanfalse是否从默认的预取模式切换到视口内链接的预渲染模式。
**注意:**当浏览器不支持预渲染时,预渲染模式(当此选项设置为true时)将回退到预取模式。
Booleanfalse是否同时激活预取和预渲染模式。
Number0每个链接在被预取之前需要停留在视口内的时间,以毫秒为单位。
HTMLElement|NodeList<A>document.body要观察的DOM元素,用于检测视口内需要预取的链接,或锚点元素的NodeList。
NumberInfinity在观察options.el容器时可以预取或预渲染的总请求数。
Number0每个链接必须进入视口的面积百分比才能被获取,以小数形式表示(例如,0.25 = 25%)。
NumberInfinity在观察options.el容器时,同时进行的请求数限制。
Number2000requestIdleCallback超时时间,以毫秒为单位。
**注意:**浏览器必须在配置的持续时间内保持空闲状态才会进行预取。
FunctionrequestIdleCallback用于指定timeout延迟的函数。
这可以替换为自定 义函数,如networkIdleCallback(参见演示)。
默认情况下,使用requestIdleCallback或嵌入的polyfill。
Booleanfalseoptions.el容器内的URL是否应被视为高优先级。
当设置为true时,如果支持,quicklink将尝试使用fetch() API(而不是link[rel=prefetch])。
Array<String>[location.hostname]允许预取的URL主机名的静态数组。
默认为相同的域名源,这可以防止任何跨域请求。
重要:空数组([])允许预取所有来源。
RegExp或Function或Array[]确定是否应预取URL。
当RegExp测试为正,Function返回true,或Array包含字符串时,则不会预取该URL。
注意:
Array可以包含String、RegExp或Function值。
**重要:**此逻辑在源匹配之后执行!
Function一个可选的错误处理函数,用于接收预取请求中的任何错误。
默认情况下,这些错误会被静默忽略。
Function一个可选函数,用于生成要预取的URL。它接收一个Element作为参数。
返回:Promise
提供的urls始终通过Promise.all传递,这意味着结果将始终解析为一个数组。
**重要:**你必须自行
catch请求错误。
String或Array<String>true一个或多个要预取的URL。
**注意:**每个
url值都是相对于当前位置解析的。
Booleanfalse是否将URL视为"高优先级"目标。
默认情况下,对prefetch()的调用为低优先级。
**注意:**这与
listen()的priority选项行为相同。
返回:Promise
**重要:**你必须自行
catch请求错误。
String或Array<String>true一个或多个要预渲染的URL。
**注意:**推测性规则API支持同站跨域预渲染,需要选择加入头部。
quicklink:
IntersectionObserver(参见Can I Use)。我们建议使用Polyfill.io等服务有条件地填充此功能:<script src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver"></script>
或者,参见Intersection Observer polyfill。
默认为2秒(通过requestIdleCallback)。这里我们将其覆盖为4秒:
quicklink.listen({ timeout: 4000, });
默认为document。
quicklink.listen({ el: document.querySelectorAll('a.linksToPrefetch'), });
默 认为document。
quicklink.listen({ el: document.getElementById('carousel'), });
prefetch() URL如果你更喜欢提供一个静态的URL列表进行预取,而不是检测视口内的URL,支持自定义URL。
// 单个URL quicklink.prefetch('2.html'); // 多个URL quicklink.prefetch(['2.html', '3.html', '4.js']); // 多个URL,高优先级 // 注意:也可用于单个URL! quicklink.prefetch(['2.html', '3.html', '4.js'], true);
prerender() URL如果你更喜欢提供一个静态的URL列表进行预渲染,而不是检测视口内的URL,支持自定义URL。
// 单个URL quicklink.prerender('2.html'); // 多个URL quicklink.prerender(['2.html', '3.html', '4.js']);
默认为低优先级(rel=prefetch或XHR)。对于高优先级(priority: true),尝试使用fetch()或回退到XHR。
**注意:**这会在
options.el容器内找到的URL上运行prefetch(..., true)。
quicklink.listen({priority: true});
提供应该可预取的主机名列表。默认情况下只允许相同源。
**重要:**你还必须包括你自己的主机名!
quicklink.listen({ origins: [ // 添加自己的 'my-website.com', 'api.my-website.com', // 添加第三方 'other-website.com', 'example.com', // ... ], });
启用所有跨源请求。