gpt4 book ai didi

javascript - 在 Service Worker 中添加图像和 CSS 文件以及 HTML 文件以进行离线缓存

转载 作者:行者123 更新时间:2023-11-28 15:08:00 24 4
gpt4 key购买 nike

我有这个服务人员:

'use strict';

const CACHE_VERSION = 1;
let CURRENT_CACHES = {
offline: 'offline-v' + CACHE_VERSION
};
const OFFLINE_URL = 'http://example.com/offline.html';

function createCacheBustedRequest(url) {
let request = new Request(url, {cache: 'reload'});

if ('cache' in request) {
return request;
}

let bustedUrl = new URL(url, self.location.href);
bustedUrl.search += (bustedUrl.search ? '&' : '') + 'cachebust=' + Date.now();
return new Request(bustedUrl);
}

self.addEventListener('install', event => {
event.waitUntil(

fetch(createCacheBustedRequest(OFFLINE_URL)).then(function(response) {
return caches.open(CURRENT_CACHES.offline).then(function(cache) {
return cache.put(OFFLINE_URL, response);
});
})
);
});

self.addEventListener('activate', event => {

let expectedCacheNames = Object.keys(CURRENT_CACHES).map(function(key) {
return CURRENT_CACHES[key];
});

event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (expectedCacheNames.indexOf(cacheName) === -1) {

console.log('Deleting out of date cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});

self.addEventListener('fetch', event => {

if (event.request.mode === 'navigate' ||
(event.request.method === 'GET' &&
event.request.headers.get('accept').includes('text/html'))) {
console.log('Handling fetch event for', event.request.url);
event.respondWith(
fetch(createCacheBustedRequest(event.request.url)).catch(error => {

console.log('Fetch failed; returning offline page instead.', error);
return caches.match(OFFLINE_URL);
})
);
}


});

It's the standard service worker -
This is my service worker:

'use strict';


const CACHE_VERSION = 1;
let CURRENT_CACHES = {
offline: 'offline-v' + CACHE_VERSION
};
const OFFLINE_URL = 'offline.html';

function createCacheBustedRequest(url) {
let request = new Request(url, {cache: 'reload'});

if ('cache' in request) {
return request;
}

let bustedUrl = new URL(url, self.location.href);
bustedUrl.search += (bustedUrl.search ? '&' : '') + 'cachebust=' + Date.now();
return new Request(bustedUrl);
}

self.addEventListener('install', event => {
event.waitUntil(

fetch(createCacheBustedRequest(OFFLINE_URL)).then(function(response) {
return caches.open(CURRENT_CACHES.offline).then(function(cache) {
return cache.put(OFFLINE_URL, response);
});
})
);
});

self.addEventListener('activate', event => {

let expectedCacheNames = Object.keys(CURRENT_CACHES).map(function(key) {
return CURRENT_CACHES[key];
});

event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (expectedCacheNames.indexOf(cacheName) === -1) {

console.log('Deleting out of date cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});

self.addEventListener('fetch', event => {

if (event.request.mode === 'navigate' ||
(event.request.method === 'GET' &&
event.request.headers.get('accept').includes('text/html'))) {
console.log('Handling fetch event for', event.request.url);
event.respondWith(
fetch(createCacheBustedRequest(event.request.url)).catch(error => {

console.log('Fetch failed; returning offline page instead.', error);
return caches.match(OFFLINE_URL);
})
);
}


});

这是标准的离线缓存服务 worker :https://googlechrome.github.io/samples/service-worker/custom-offline-page/

如何缓存图像和 CSS 文件?现在,我使用内联 CSS 创建一个离线页面,并将图像转换为 SVG 代码。这并不理想。

我是否需要拥有多个具有不同 ID 的服务工作线程来进行离线缓存图像?

或者我可以使用 1 个服务工作线程来处理多个元素以进行离线缓存吗?

最佳答案

缓存可以存储多个请求,以便您可以调用cache.put()多次,你可以这样写:

var ASSETS = ['/index.html', '/js/index.js', '/style/style.css'];

self.oninstall = function (evt) {
evt.waitUntil(caches.open('offline-cache-name').then(function (cache) {
return Promise.all(ASSETS.map(function (url) {
return fetch(url).then(function (response) {
return cache.put(url, response);
});
}));
}))
};

或者,类似且更短,使用 addAll() :

var ASSETS = ['/index.html', '/js/index.js', '/style/style.css'];

self.oninstall = function (evt) {
evt.waitUntil(caches.open('offline-cache-name').then(function (cache) {
return cache.addAll(ASSETS);
}))
};

您可以在 Service Worker Cookbook 中找到从外部资源加载 Assets 集的示例。 .

关于javascript - 在 Service Worker 中添加图像和 CSS 文件以及 HTML 文件以进行离线缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com