乐闻世界logo
搜索文章和话题

How can I cache external URLs using service worker?

4 个月前提问
3 个月前修改
浏览次数28

1个答案

1

在使用Service Worker缓存外部URL的过程中,首先得确保您有权访问这些资源,并且遵循同源策略或资源提供CORS(跨源资源共享)头部的指示。以下是使用Service Worker缓存外部URL的步骤:

步骤 1: 注册 Service Worker

在您的主JavaScript文件中,您需要检查浏览器是否支持Service Worker,并在支持的情况下对其进行注册。

javascript
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(function(registration) { console.log('Service Worker 注册成功: ', registration); }) .catch(function(error) { console.log('Service Worker 注册失败: ', error); }); }

步骤 2: 监听 install 事件

在您的 service-worker.js 文件中,您将监听 install 事件,这是您预缓存资源的理想时机。

javascript
const CACHE_NAME = 'external-resources-cache-v1'; const urlsToCache = [ 'https://example.com/external.css', // 外部资源的URL 'https://example.com/external.js' // 外部资源的URL ]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(CACHE_NAME) .then(function(cache) { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); });

需要注意的是,您要缓存的外部资源需要允许跨源访问,否则浏览器的同源策略会阻止它们的缓存。

步骤 3: 拦截 fetch 事件

每当页面尝试获取资源时,Service Worker将有机会拦截这一请求,并提供缓存中的资源。

javascript
self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) .then(function(response) { // 缓存命中,返回缓存中的资源 if (response) { return response; } // 未命中缓存,发起请求获取资源,并将其加入到缓存中 return fetch(event.request).then(function(response) { // 检查是否成功获取资源 if(!response || response.status !== 200 || response.type !== 'basic') { return response; } // 克隆响应对象,因为请求可能需要被浏览器多次使用 var responseToCache = response.clone(); caches.open(CACHE_NAME) .then(function(cache) { cache.put(event.request, responseToCache); }); return response; }); }) ); });

这里要注意的是,如果响应类型不是 'basic',则表示可能是跨源请求,您需要确保响应包含CORS头部,以便能够由Service Worker正确处理。

例子:

假设我们想缓存来自CDN的一些库和字体文件,如下:

javascript
const urlsToCache = [ 'https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js', 'https://fonts.googleapis.com/css?family=Roboto' ];

在安装阶段,Service Worker将预缓存这些文件。在拦截请求阶段,当应用尝试请求这些文件时,Service Worker会检查缓存,并根据上面的代码提供缓存中的响应或者通过网络获取资源并将其加入缓存。

这种方法可以提高性能并减少对网络的依赖,但请记住,您需要在对应的Service Worker生命周期事件中管理缓存的更新、删除过期的缓存等。

2024年6月29日 12:07 回复

你的答案