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 quicklinkYou 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.