-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: minor improvements for performance
- Loading branch information
1 parent
47de12b
commit 63184d6
Showing
3 changed files
with
28 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,5 @@ | ||
/* | ||
Cache-Control: max-age=31536000 | ||
|
||
/docs/images/* | ||
Cache-Control: public, max-age=604800 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,83 +1,52 @@ | ||
/* =========================================================== | ||
* docsify sw.js | ||
* =========================================================== | ||
* Copyright 2016 @huxpro | ||
* Licensed under Apache 2.0 | ||
* Register service worker. | ||
* ========================================================== */ | ||
|
||
const RUNTIME = 'docsify' | ||
const RUNTIME = 'docsify'; | ||
const HOSTNAME_WHITELIST = [ | ||
self.location.hostname, | ||
'fonts.gstatic.com', | ||
'fonts.googleapis.com', | ||
'cdn.jsdelivr.net' | ||
] | ||
]; | ||
|
||
// The Util Function to hack URLs of intercepted requests | ||
const getFixedUrl = (req) => { | ||
var now = Date.now() | ||
var url = new URL(req.url) | ||
var now = Date.now(); | ||
var url = new URL(req.url); | ||
|
||
// 1. fixed http URL | ||
// Just keep syncing with location.protocol | ||
// fetch(httpURL) belongs to active mixed content. | ||
// And fetch(httpRequest) is not supported yet. | ||
url.protocol = self.location.protocol | ||
// 1. Fixed http URL | ||
// Keep syncing with location.protocol | ||
url.protocol = self.location.protocol; | ||
|
||
// 2. add query for caching-busting. | ||
// Github Pages served with Cache-Control: max-age=600 | ||
// max-age on mutable content is error-prone, with SW life of bugs can even extend. | ||
// Until cache mode of Fetch API landed, we have to workaround cache-busting with query string. | ||
// 2. Add query for caching-busting. | ||
// Cache-Control-Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=453190 | ||
if (url.hostname === self.location.hostname) { | ||
url.search += (url.search ? '&' : '?') + 'cache-bust=' + now | ||
url.search += (url.search ? '&' : '?') + 'cache-bust=' + now; | ||
} | ||
return url.href | ||
} | ||
return url.href; | ||
}; | ||
|
||
/** | ||
* @Lifecycle Activate | ||
* New one activated when old isnt being used. | ||
* | ||
* waitUntil(): activating ====> activated | ||
*/ | ||
// Lifecycle Activate | ||
self.addEventListener('activate', event => { | ||
event.waitUntil(self.clients.claim()) | ||
}) | ||
event.waitUntil(self.clients.claim()); | ||
}); | ||
|
||
/** | ||
* @Functional Fetch | ||
* All network requests are being intercepted here. | ||
* | ||
* void respondWith(Promise<Response> r) | ||
*/ | ||
// Functional Fetch | ||
self.addEventListener('fetch', event => { | ||
// Skip some of cross-origin requests, like those for Google Analytics. | ||
if (HOSTNAME_WHITELIST.indexOf(new URL(event.request.url).hostname) > -1) { | ||
// Stale-while-revalidate | ||
// similar to HTTP's stale-while-revalidate: https://www.mnot.net/blog/2007/12/12/stale | ||
// Upgrade from Jake's to Surma's: https://gist.github.com/surma/eb441223daaedf880801ad80006389f1 | ||
const cached = caches.match(event.request) | ||
const fixedUrl = getFixedUrl(event.request) | ||
const fetched = fetch(fixedUrl, { cache: 'no-store' }) | ||
const fetchedCopy = fetched.then(resp => resp.clone()) | ||
const cached = caches.match(event.request); | ||
const fixedUrl = getFixedUrl(event.request); | ||
const fetched = fetch(fixedUrl, { cache: 'no-store' }); | ||
const fetchedCopy = fetched.then(resp => resp.clone()); | ||
|
||
// Call respondWith() with whatever we get first. | ||
// If the fetch fails (e.g disconnected), wait for the cache. | ||
// If there’s nothing in cache, wait for the fetch. | ||
// If neither yields a response, return offline pages. | ||
event.respondWith( | ||
Promise.race([fetched.catch(_ => cached), cached]) | ||
.then(resp => resp || fetched) | ||
.catch(_ => { /* eat any errors */ }) | ||
) | ||
.catch(_ => {}) | ||
); | ||
|
||
// Update the cache with the version we fetched (only for ok status) | ||
event.waitUntil( | ||
Promise.all([fetchedCopy, caches.open(RUNTIME)]) | ||
.then(([response, cache]) => response.ok && cache.put(event.request, response)) | ||
.catch(_ => { /* eat any errors */ }) | ||
) | ||
.catch(_ => {}) | ||
); | ||
} | ||
}) | ||
}); |