通过在空闲时间预取或预渲染视口内的链接,实现后续页面加载更快
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.json
window.__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更改时使用。
Boolean
false
是否从默认的预取模式切换到视口内链接的预渲染模式。
**注意:**当浏览器不支持预渲染时,预渲染模式(当此选项设置为true时)将回退到预取模式。
Boolean
false
是否同时激活预取和预渲染模式。
Number
0
每个链接在被预取之前需要停留在视口内的时间,以毫秒为单位。
HTMLElement|NodeList<A>
document.body
要观察的DOM元素,用于检测视口内需要预取的链接,或锚点元素的NodeList。
Number
Infinity
在观察options.el
容器时可以预取或预渲染的总请求数。
Number
0
每个链接必须进入视口的面积百分比才能被获取,以小数形式表示(例如,0.25 = 25%)。
Number
Infinity
在观察options.el
容器时,同时进行的请求数限制。
Number
2000
requestIdleCallback
超时时间,以毫秒为单位。
**注意:**浏览器必须在配置的持续时间内保持空闲状态才会进行预取。
Function
requestIdleCallback
用于指定timeout
延迟的函数。
这可以替换为自定 义函数,如networkIdleCallback(参见演示)。
默认情况下,使用requestIdleCallback
或嵌入的polyfill。
Boolean
false
options.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
值都是相对于当前位置解析的。
Boolean
false
是否将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', // ... ], });
启用所有跨源请求。