javascript - 为渐进式 Web 应用缓存设置最小网络类型 (WLAN)

标签 javascript vue.js progressive-web-apps workbox

我通过使用外部 API 的 Vue CLI 创建了一个 PWA。 API 响应应该被缓存以供离线访问。

来自文档 https://cli.vuejs.org/core-plugins/pwa.html#configuration我在根目录下创建了一个 vue.config.js 文件

module.exports = {
  publicPath: '/pwa',
  pwa: {
    appleMobileWebAppCapable: 'yes',
    workboxPluginMode: 'GenerateSW',
    workboxOptions: {
      runtimeCaching: [
        {
          urlPattern: new RegExp('^https://example.com/'),
          handler: 'networkFirst', // Network first, Cache fallback
          options: {
            networkTimeoutSeconds: 5,
            cacheName: 'api-cache',
            cacheableResponse: {
              statuses: [0, 200],
            },
          },
        },
      ],
    },
  },
};

该项目运行良好,但我想避免在非常糟糕的连接上从 API 加载数据。

我只想在 WLAN 网络连接上加载数据。有没有办法可以扩展配置并设置要检测的网络类型?应该调用配置

use network first but only with WLAN, otherwise use cache as fallback

最佳答案

您需要从使用 Workbox 的 GenerateSW 切换。使用 InjectManifest模式,这使您可以更好地控制服务人员。
https://developers.google.com/web/tools/workbox/guides/get-started 中的示例可以让您开始了解要包含在服务工作人员文件中的内容的基础知识。
请注意 Network Information API并不总是可靠的,并且并非所有浏览器都支持。您应该进行防御性编码,以便在 API 不可用时体验不会“中断”。
您可以添加到服务 worker 的特定逻辑可能类似于:

import {CacheableResponsePlugin} from 'workbox-cacheable-response';
import {NetworkFirst, CacheFirst} from 'workbox-strategies';
import {registerRoute} from 'workbox-routing';

// This will be shared by both the strategies.
const cacheableResponsePlugin = new CacheableResponsePlugin({
  statuses: [0, 200],
});

const networkFirst = new NetworkFirst({
  cacheName: 'api-cache',
  networkTimeoutSeconds: 5,
  plugins: [cacheableResponsePlugin],
});

const networkFirst = new CacheFirst({
  cacheName: 'api-cache',
  plugins: [cacheableResponsePlugin],
});

registerRoute(
  // Replace with the routing criteria appropriate for your API.
  ({url}) => url.origin === 'https://example.com',

  (params) => {
    // navigator.connection might not always be available, and might not
    // always be reliable.
    // See https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation
    if (navigator.connection?.effectiveType === '4g') {
      return networkFirst.handle(params);
    }

    // If the current connection is not flagged as '4g',
    // or if navigator.connection isn't set, use CacheFirst
    // as a fallback.
    return cacheFirst.handle(params);
  }
);

关于javascript - 为渐进式 Web 应用缓存设置最小网络类型 (WLAN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058671/

相关文章:

javascript - ASP.NET MVC 4 捆绑缩小 OK 但没有混淆

javascript - ES2015 构造函数的返回值是什么?

javascript - 如何将变量值从组件一发送到组件二? (vue.js 2)

service-worker - 如何在 Web 应用程序中使用 Workbox 后台同步来处理离线发布请求

ios - PWA 上 iPhone X 上的白色状态栏

javascript - 停止幻灯片并在 3 秒后继续

javascript - Jquery JScrollPane - 设置滚动速度/灵敏度

vue.js - 将route.params.id传递给vuex操作

vue.js - vue-apollo:GraphQL 查询仅在使用 <ApolloQuery> 标签时运行。永远不会在脚本代码中工作。 this.$apollo.queries 为空

javascript - 由于客户端未注册,在服务 worker 的第一次页面加载中未执行获取事件