【问题标题】:Priming a runtime service worker cache using Workbox使用 Workbox 启动运行时服务工作者缓存
【发布时间】:2017-07-28 17:24:18
【问题描述】:

如何在 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));
}
});

【问题讨论】:

    标签: javascript google-chrome service-worker progressive-web-apps workbox


    【解决方案1】:

    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 策略,只有在网络不可用时才会使用这些缓存的响应。)

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

    // Your existing WorkboxSW code goes here.
    
    self.addEventListener('install', event => {
      event.waitUntil(
        caches.open('my-api')
          .then(cache => cache.add(API_URL))
      );
    });
    

    【讨论】:

    • 谢谢!如何在 serviceworker.js 文件之外使用 workboxSW.registerRoute?在 service worker js 中,我使用 importScripts 来使用 workbox-sw.js 库,但是如何在其他页面上使用它来进行运行时缓存呢?我的 api 调用是基于 ID 的动态的,即 /MyAPI/Records/{xxx}/data
    • 您在 Service Worker 中执行此代码(在顶级 Service Worker 文件中,或在通过 importScripts() 拉入的独立 JS 文件中),然后您不必更改 Web 应用程序页面中的任何内容。一旦 SW 控制了客户端 Web 应用程序,它将自动开始拦截网络请求并处理它们,而无需您更改页面。
    • 如何从独立的 JS 进行 ajax 调用?我的 api 调用是动态的,这意味着它依赖于 /MyAPI/Records api 来为 /MyAPI/Records/{xxx}/data 构建 url
    • 我不太确定你在问什么,但一般来说,你可以使用 fetch() API 从 JS 客户端(页面或软件)的 API 请求数据: developer.mozilla.org/en-US/docs/Web/API/Fetch_API
    • 我更新了我的问题中的代码给你更好的主意!使用 ajax 将所有 url 添加到 urls 数组后,cache.addAll 正在获取/缓存所有数据!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多