0

如何在 WorkboxSW 中使用以下代码为所有每个缓存的 url 注册路由。这个每个缓存的 url 包括也将转到服务器的 ajax!

$.ajax({
   url : '/MyAPI/Records',
   type : 'GET',
   dataType:'json',
   success : function(data) {              
     alert('Records: '+data);

     //build urls array to get all records details  
     var urls = [];
     urls.push('/MyAPI/Records')
     $(data).each(function (index) {
        urls.push('/MyAPI/Records/' + data[index].id + '/data') 
      });

     //add all urls to cache
     var requests = urls.map(url => new Request(url));
     caches.open('my-cache').then(cache => {
     return cache.addAll(requests).then(() => {
        // At this point, `cache` will be populated with `Response` objects,
        // and `requests` contains the `Request` objects that were used.
     }).catch(error => console.error(`Oops! ${error}`));
  });
},
error : function(request,error)
{
    alert("Request: "+JSON.stringify(request));
}
});
4

1 回答 1

3

Workbox 的预缓存依赖于在构建时访问代表资源的本地文件。这允许它生成其管理的每个资源的哈希(基于本地文件的内容),然后在本地文件更改时保持该缓存资源为最新。

您的建议听起来更像 Workbox 对通过运行时缓存处理某些路由的支持。您可以通过以下方式对其进行配置:

// Replace with your actual API endpoint.
const API_URL = 'https://my-api-server.com/api/restEndpoint';

// Use whichever strategy you'd prefer: networkFirst, staleWhileRevalidate, etc.
const apiCallHandler = workboxSW.strategies.networkFirst({
  cacheName: 'my-api'
});

workboxSW.registerRoute(
  API_URL,
  apiCallHandler
);

在您发出第一个请求后,这将导致响应https://my-api-server.com被添加到运行时命名的缓存中。my-api(在这种特殊情况下,使用该networkFirst策略,那些缓存的响应将仅在网络不可用时使用。)

如果您不同意运行时缓存从“冷”开始并且您觉得它需要准备好,那么您可以通过install在 Workbox 代码旁边编写自己的事件处理程序来做到这一点:

// Your existing WorkboxSW code goes here.

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('my-api')
      .then(cache => cache.add(API_URL))
  );
});
于 2017-07-28T19:48:46.540 回答