如何在 UniApp 中使用 Service Worker 和 Workbox

1. 基本前提

H5 平台限制:Service Worker 和 Workbox 仅能在 H5 端运行。
HTTPS 必须:Service Worker 只能在 HTTPS 或 localhost 环境下运行。
UniApp 打包 H5:确保项目是以 H5 目标进行构建的。

2. 实现步骤

2.1 初始化 UniApp 项目

如果还没有项目,可以初始化一个 UniApp 项目:

vue create -p dcloudio/uni-preset-vue my-uniapp-project
2.2 配置 Service Worker 和 Workbox
1) 注册 Service Worker

在 main.js 中添加 Service Worker 的注册代码:

if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js')
    .then(registration => {
      console.log('Service Worker registered with scope:', registration.scope);
    })
    .catch(error => {
      console.error('Service Worker registration failed:', error);
    });
}
2) 安装 Workbox

在项目中安装 Workbox:

npm install workbox-cli --save-dev
3) 配置 Workbox

在项目根目录创建 workbox-config.js:

module.exports = {
  globDirectory: 'dist/build/h5',
  globPatterns: [
    '**/*.{html,js,css,png,jpg,svg}'
  ],
  swDest: 'dist/build/h5/sw.js',
  runtimeCaching: [
    {
      urlPattern: /\/api\/.*\/*.*/,
      handler: 'NetworkFirst',
      options: {
        cacheName: 'api-cache',
        expiration: {
          maxAgeSeconds: 24 * 60 * 60, // 缓存一天
          maxEntries: 50, // 最多缓存 50 条请求
        },
      },
    },
    {
      urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
      handler: 'CacheFirst',
      options: {
        cacheName: 'image-cache',
        expiration: {
          maxAgeSeconds: 30 * 24 * 60 * 60, // 缓存一个月
        },
      },
    },
  ],
};
4) 生成 Service Worker

在项目根目录运行以下命令生成 sw.js 文件:

workbox generateSW workbox-config.js
2.3 自定义打包流程

UniApp 打包 H5 时,生成的文件位于 dist/build/h5 目录。你需要将生成的 sw.js 文件放入这个目录。

修改 vue.config.js,在 H5 打包完成后将 Workbox 的 sw.js 文件复制到目标目录:

const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  configureWebpack: {
    plugins: [
      new CopyWebpackPlugin({
        patterns: [
          { from: 'sw.js', to: 'dist/build/h5/' }
        ]
      })
    ]
  }
};

重新打包项目:

npm run build:h5
2.4 测试 Service Worker

启动一个本地 HTTPS 服务器(可以使用 serve 或 http-server)。

npm install -g serve
serve -s dist/build/h5 -l 5000 --ssl

访问 https://localhost:5000,在浏览器的开发者工具中确认 Service Worker 是否成功注册。

3. 优化和扩展

3.1 动态缓存策略

可以在 workbox-config.js 中增加更多缓存策略,如:

动态加载资源(如异步加载的组件和图片)。
接口数据缓存:对 /api/ 路径的请求使用 NetworkFirst 策略。
字体文件缓存:

{
  urlPattern: /\.(?:woff|woff2|ttf|otf)$/,
  handler: 'CacheFirst',
  options: {
    cacheName: 'font-cache',
    expiration: {
      maxAgeSeconds: 60 * 60 * 24 * 365, // 缓存一年
    },
  },
}
3.2 添加应用更新逻辑

在 sw.js 中监听更新事件,提示用户刷新页面:

self.addEventListener('install', event => {
  self.skipWaiting();
});

self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(cacheNames =>
      Promise.all(
        cacheNames.map(cacheName => {
          if (cacheName !== 'new-cache-name') {
            return caches.delete(cacheName);
          }
        })
      )
    )
  );
});

self.addEventListener('fetch', event => {
  // 自定义逻辑
});

4. 总结

在 UniApp 的 H5 项目中,Service Worker 和 Workbox 可以通过以下方式实现:

  • 安装 Workbox:生成和管理缓存文件。
  • 注册 Service Worker:在 H5 端加载和运行。
  • 配置缓存策略:根据需求缓存 HTML、静态资源和 API 数据。
  • 优化体验:结合 UniApp 的框架特性,实现更流畅的页面切换和更快的加载速度。

尽管 UniApp 没有内置支持 Service Worker,但通过上述自定义配置可以轻松集成,并实现类似微信小程序的资源加载和离线访问机制。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容