简而言之:尝试选项3。你以后会感谢我的。
来自Google文档:
默认情况下,如果第三方网址不支持CORS,则从其处获取资源将失败。您可以向请求添加no-CORS
选项来克服此问题,尽管这将导致“opaque”响应,这意味着您将无法确定响应是否成功。
所以
选项1
添加no-cors
头。
var CACHE_NAME = 'my-site-cache-v1';
var urlsToPrefetch = [
'/',
'/styles/main.css',
'/script/main.js',
'https://fonts.googleapis.com/icon?family=Material+Icons'
];
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
cache.addAll(urlsToPrefetch.map(function(urlToPrefetch) {
return new Request(urlToPrefetch, { mode: 'no-cors' });
})).then(function() {
console.log('All resources have been fetched and cached.');
});
})
);
});
正如OP所说,当资源更新时,在这种情况下很难获得最新的副本。另一个问题是,就像我所说的,你不会知道响应是否成功。
选项2
或者像OP所说,我们可以创建一个代理服务器:像这样简单的东西(伪代码,未经测试的Node Express代码)
var request = require('request');
app.get('/library', function(req,res) {
var thirdPartyUrl = req.query.thirdPartyUrl;
request(thirdPartyUrl).pipe(res);
});
当您访问/library?thirdPartyUrl=https://fonts.googleapis.com/icon?family=Material+Icons
时,应该像通常缓存响应一样缓存响应。例如:删除no-cors
并将urlsToPrefetch
替换为以下值:
var urlsToPrefetch = [
'/',
'/library?thirdPartyUrl=https://fonts.googleapis.com/icon?family=Material+Icons',
'/library?thirdPartyUrl=https://fonts.googleapis.com/icon?family=Roboto'
];
选项3
我认为这是最好且更容易的方法。使用workbox。我们试过使用和不使用workbox来创建PWA,而使用workbox很简单。
了解workbox:https://developers.google.com/web/tools/workbox/
在初始设置完成后实现以下路由:
workbox.routing.registerRoute(
new RegExp('^https://third-party.example.com/images/'),
new workbox.strategies.CacheFirst({
cacheName: 'image-cache',
plugins: [
new workbox.cacheableResponse.Plugin({
statuses: [0, 200],
})
]
})
);
self.addEventListener('install', e => { e.waitUntil( caches.open('cache').then(cache => { return cache.addAll([ '/', '/index.html', '/styles/main.css', '/scripts/main.min.js', 'https://fonts.googleapis.com/css?family=Quicksand:300' ]) .then(() => self.skipWaiting()); }) ) });
这段代码能正常工作吗? - Asim K T