GoogleChromeLabs / quicklink
- среда, 12 декабря 2018 г. в 00:16:20
JavaScript
⚡️ Faster subsequent page-loads by prefetching in-viewport links during idle time
Faster subsequent page-loads by prefetching in-viewport links during idle time
Quicklink attempts to make navigations to subsequent pages load faster. It:
navigator.connection.effectiveType
) or has data-saver enabled (using navigator.connection.saveData
)<link rel=prefetch>
or XHR). Provides some control over the request priority (can switch to fetch()
if supported).This project aims to be a drop-in solution for sites to prefetch links based on what is in the user's viewport. It also aims to be small (< 1KB minified/gzipped).
npm install --save quicklink
You can also grab quicklink
from unpkg.com/quicklink.
Once initialized, quicklink
will automatically prefetch URLs for links that are in-viewport during idle time.
Quickstart:
<!-- Include quicklink from dist -->
<script src="dist/quicklink.js"></script>
<!-- Initialize (you can do this whenever you want) -->
<script>
quicklink();
</script>
For example, you can initialize after the load
event fires:
<script>
window.addEventListener('load', () =>{
quicklink();
});
</script>
ES Module import:
import quicklink from "dist/quicklink.mjs";
quicklink();
The above options are best for multi-page sites. Single-page apps have a few options available for using quicklink with a router:
quicklink()
once a navigation to a new route has completedquicklink()
against a specific DOM element / componentquicklink({urls:[...]})
with a custom set of URLs to prefetchquicklink
accepts an optional options object with the following parameters:
el
: DOM element to observe for in-viewport links to prefetchurls
: Static array of URLs to prefetch (instead of observing document
or a DOM element links in the viewport)timeout
: Integer for the requestIdleCallback
timeout. A time in milliseconds by which the browser must execute prefetching. Defaults to 2 seconds.timeoutFn
: Function for specifying a timeout. Defaults to requestIdleCallback
. Can also be swapped out for a custom function like networkIdleCallback (see demos)priority
: Boolean specifying preferred priority for fetches. Defaults to false
. true
will attempt to use the fetch()
API where supported (rather than rel=prefetch)TODO:
quicklink
:
IntersectionObserver
to be supported (see CanIUse). We recommend conditionally polyfillng this feature with a service like Polyfill.io:<script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script>
Alternatively, see the Intersection Observer polyfill.
Set a custom timeout for prefetching resources
Defaults to 2 seconds (via requestIdleCallback
). Here we override it to 4 seconds:
quicklink({
timeout: 4000
});
Set the DOM element to obseve for in-viewport links
Defaults to document
otherwise.
const elem = document.getElementById('carousel');
quicklink({
el: elem
});
Set a custom array of URLs to be prefetched
If you would prefer to provide a static list of URLs to be prefetched, instead of detecting those in-viewport, customizing URLs is supported.
quicklink({
urls: ['2.html','3.html', '4.js']
});
Set the request priority for prefetches
Defaults to low-priority (rel=prefetch
or XHR). For high-priority (priority: true
), attempts to use fetch()
or falls back to XHR.
quicklink({ priority: true });
The prefetching provided by quicklink
can be viewed as a progressive enhancement. Cross-browser support is as follows:
Certain features have layered support. If opting for {priority: true}
and fetch()
isn't available, XHR will be used instead.
quicklink
includes a prefetcher that can be individually imported for use in other projects. After installing quicklink
as a dependency, you can use it as follows:
<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>
Intersection Observer
to prefetch all of the links that are in view and provided heavy inspiration for this project.Licensed under the Apache-2.0 license.