UNPKG

1.67 kBJavaScriptView Raw
1const support = function(feature) {
2 if (typeof document === `undefined`) {
3 return false
4 }
5 const fakeLink = document.createElement(`link`)
6 try {
7 if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {
8 return fakeLink.relList.supports(feature)
9 }
10 } catch (err) {
11 return false
12 }
13 return false
14}
15
16const linkPrefetchStrategy = function(url) {
17 return new Promise((resolve, reject) => {
18 if (typeof document === `undefined`) {
19 reject()
20 return
21 }
22
23 const link = document.createElement(`link`)
24 link.setAttribute(`rel`, `prefetch`)
25 link.setAttribute(`href`, url)
26
27 link.onload = resolve
28 link.onerror = reject
29
30 const parentElement =
31 document.getElementsByTagName(`head`)[0] ||
32 document.getElementsByName(`script`)[0].parentNode
33 parentElement.appendChild(link)
34 })
35}
36
37const xhrPrefetchStrategy = function(url) {
38 return new Promise((resolve, reject) => {
39 const req = new XMLHttpRequest()
40 req.open(`GET`, url, true)
41 req.withCredentials = true
42
43 req.onload = () => {
44 if (req.status === 200) {
45 resolve()
46 } else {
47 reject()
48 }
49 }
50
51 req.send(null)
52 })
53}
54
55const supportedPrefetchStrategy = support(`prefetch`)
56 ? linkPrefetchStrategy
57 : xhrPrefetchStrategy
58
59const preFetched = {}
60
61const prefetch = function(url) {
62 return new Promise(resolve => {
63 if (preFetched[url]) {
64 resolve()
65 return
66 }
67
68 supportedPrefetchStrategy(url)
69 .then(() => {
70 resolve()
71 preFetched[url] = true
72 })
73 .catch(() => {}) // 404s are logged to the console anyway
74 })
75}
76
77export default prefetch