Workbox logo

Workbox

Google 官方推出的 Progressive Web App 工具集,简化 Service Worker 开发和缓存策略实现,是生产级 PWA 的事实标准。

精选工具性能优化PWAService Worker缓存策略

Google Chrome 团队维护的 JavaScript 库集合,提供预缓存、运行时缓存、离线支持、推送通知等 PWA 核心功能的模块化实现,支持 Webpack/Vite 插件集成,是 PWA 领域事实标准的开发工具。

Workbox - PWA 缓存和 Service Worker 工具

Google 官方推出的 Progressive Web App 工具集,简化 Service Worker 开发和缓存策略实现,是生产级 PWA 的事实标准。

技术简介说明

Workbox 是由 Google Chrome 团队开发和维护的 JavaScript 库集合,专门为 Progressive Web App(PWA)开发提供一站式解决方案。它封装了 Service Worker API 的复杂操作,提供了预缓存、运行时缓存、离线支持、推送通知等核心功能的开箱即用实现。

Workbox 的核心价值在于将 Service Worker 开发中的常见模式标准化和模块化。通过提供一系列专注的库模块,开发者可以按需引入所需功能,而无需从零开始实现复杂的缓存逻辑。这不仅降低了 PWA 开发门槛,也确保了实现方案遵循 Google 推荐的最佳实践。

作为 PWA 领域的行业标准工具,Workbox 被广泛应用于各类 Web 应用中。当前最新版本为 v7.4.1(2026 年 5 月发布)。项目在经历了维护团队更替后(原作者 Jeff Posnick 离开 Google),目前由 Chrome Aurora 团队接手,保持了稳定的更新节奏。

基本信息

快速上手

安装

# 安装核心库
npm install workbox-sw
 
# 安装构建工具(根据构建系统选择其一)
# Webpack
npm install workbox-webpack-plugin --save-dev
 
# Vite(推荐第三方插件)
npm install vite-plugin-pwa --save-dev
 
# 独立构建工具
npm install workbox-build --save-dev

基础配置

方式 1:使用 webpack 插件(推荐)

// webpack.config.js
const { InjectManifest } = require('workbox-webpack-plugin');
 
module.exports = {
  plugins: [
    new InjectManifest({
      swSrc: './src/sw.js',
      swDest: 'service-worker.js',
    }),
  ],
};

方式 2:使用 vite-plugin-pwa

// vite.config.js
import { VitePWA } from 'vite-plugin-pwa';
 
export default {
  plugins: [
    VitePWA({
      registerType: 'autoUpdate',
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
      },
    }),
  ],
};

最小示例

// src/sw.js - Service Worker 文件
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate, CacheFirst } from 'workbox-strategies';
 
// 预缓存构建时生成的静态资源清单
precacheAndRoute(self.__WB_MANIFEST);
 
// 运行时缓存:HTML 页面使用 Network First
registerRoute(
  ({ request }) => request.mode === 'navigate',
  new StaleWhileRevalidate({ cacheName: 'pages' })
);
 
// 运行时缓存:静态资源使用 Cache First
registerRoute(
  ({ request }) => ['style', 'script', 'worker'].includes(request.destination),
  new CacheFirst({ cacheName: 'static-assets' })
);
 
// 运行时缓存:API 请求使用 Network First
registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new StaleWhileRevalidate({ cacheName: 'api-cache' })
);
<!-- index.html - 注册 Service Worker -->
<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js');
  }
</script>

核心概念与架构

模块化架构

Workbox 采用模块化设计,每个模块负责特定功能:

模块功能
workbox-sw核心库,整合其他模块
workbox-precaching预缓存管理
workbox-routingURL 路由匹配
workbox-strategies缓存策略实现
workbox-build独立构建工具
workbox-webpack-pluginWebpack 集成插件
workbox-window客户端窗口管理 API
workbox-background-sync后台同步(失败请求重试)
workbox-broadcast-update缓存更新广播通知
workbox-expiration缓存过期和数量管理
workbox-range-requests范围请求支持(大文件分段)
workbox-recipes预定义缓存模式集合
workbox-core底层核心工具函数

缓存策略

Workbox 提供五种内置缓存策略:

  1. CacheFirst(缓存优先):优先使用缓存,缓存未命中时请求网络。适合不变的静态资源。
  2. NetworkFirst(网络优先):优先请求网络,失败时使用缓存。适合需要最新数据的内容。
  3. StaleWhileRevalidate(陈旧时重新验证):立即返回缓存,同时后台更新。平衡速度和新鲜度。
  4. NetworkOnly(仅网络):始终请求网络,不使用缓存。适合实时数据。
  5. CacheOnly(仅缓存):始终使用缓存,不请求网络。适合预缓存的资源。

预缓存 vs 运行时缓存

预缓存(Precaching)

  • 在 Service Worker 安装时缓存指定资源
  • 适合静态资源(JS、CSS、图片等)
  • 构建时生成资源清单(manifest)
  • 自动处理资源版本更新(通过文件哈希)

运行时缓存(Runtime Caching)

  • 在请求发生时动态缓存资源
  • 适合 API 响应、动态内容
  • 基于路由规则匹配请求
  • 可配置缓存过期策略

核心特性

  • 预缓存管理:自动管理静态资源的缓存和版本更新,基于文件哈希检测变化
  • 运行时缓存:灵活的动态资源缓存策略,支持多种内置模式
  • 五种缓存策略:CacheFirst、NetworkFirst、StaleWhileRevalidate、NetworkOnly、CacheOnly
  • 离线支持:完整的离线访问能力,支持离线回退页面
  • 后台同步:失败请求的自动重试机制(Background Sync API)
  • 推送通知:支持 Push API 和 Notification API
  • 缓存过期管理:按时间或数量自动清理缓存项
  • 构建工具集成:Webpack、Vite 等构建系统的官方/社区插件
  • TypeScript 支持:完整的类型定义
  • 模块化设计:按需引入,减小包体积

生态图

关键依赖

Workbox 内部模块依赖关系:

workbox-sw (核心入口)
├── workbox-core (基础工具)
├── workbox-precaching (预缓存)
│   └── workbox-core
├── workbox-routing (路由)
│   └── workbox-core
├── workbox-strategies (策略)
│   ├── workbox-core
│   ├── workbox-routing
│   └── workbox-cacheable-response
└── workbox-expiration (过期管理)
    └── workbox-core

构建工具集成

Webpack

const { GenerateSW, InjectManifest } = require('workbox-webpack-plugin');
 
// 方式 1:自动生成 Service Worker(适合简单场景)
new GenerateSW({
  clientsClaim: true,
  skipWaiting: true,
  runtimeCaching: [{
    urlPattern: /^https:\/\/api\.example\.com/,
    handler: 'NetworkFirst',
  }],
});
 
// 方式 2:注入到自定义 Service Worker(适合复杂场景)
new InjectManifest({
  swSrc: './src/sw.js',
  swDest: 'service-worker.js',
});

Vite(vite-plugin-pwa)

import { VitePWA } from 'vite-plugin-pwa';
 
VitePWA({
  registerType: 'autoUpdate',
  workbox: {
    globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
    runtimeCaching: [{
      urlPattern: /^https:\/\/api\.example\.com\/.*/,
      handler: 'NetworkFirst',
      options: {
        cacheName: 'api-cache',
        expiration: {
          maxEntries: 50,
          maxAgeSeconds: 60 * 60 * 24,
        },
      },
    }],
  },
})

相关工具

  • vite-plugin-pwa:Vite 生态的 PWA 插件(社区维护,活跃度高)
  • @vue/cli-plugin-pwa:Vue CLI 的 PWA 插件
  • next-pwa / serwist:Next.js 的 PWA 方案
  • workbox-cli:命令行工具
  • PWA Builder:微软出品的 PWA 构建工具

适用场景

  • Progressive Web Apps(PWA):构建可安装的 Web 应用,支持离线使用
  • 离线优先应用:需要在离线状态下正常运行的应用
  • 内容型网站:博客、文档站点的静态资源缓存
  • 单页应用(SPA):React、Vue、Angular 应用的离线支持和加速
  • 电商网站:商品页面的快速加载和离线浏览
  • 新闻应用:文章内容的预缓存和离线阅读
  • 企业内部应用:内网/弱网环境下的稳定访问

开发与工程化

开发流程

git clone https://github.com/GoogleChrome/workbox.git
cd workbox
npm install
npm run build     # 构建所有包
npm test          # 运行测试
npm run dev       # 开发模式

生产构建配置

// webpack.config.js
const { InjectManifest } = require('workbox-webpack-plugin');
 
module.exports = {
  mode: 'production',
  plugins: [
    new InjectManifest({
      swSrc: './src/sw.js',
      swDest: 'service-worker.js',
      maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, // 5MB
      exclude: [/\.map$/, /^manifest.*\.js$/],
    }),
  ],
};

Service Worker 更新策略

// 使用 workbox-window 管理更新
import { Workbox } from 'workbox-window';
 
const wb = new Workbox('/service-worker.js');
 
wb.addEventListener('waiting', () => {
  if (confirm('有新版本可用,是否刷新?')) {
    wb.messageSkipWaiting();
    wb.addEventListener('controlling', () => {
      window.location.reload();
    });
  }
});
 
wb.register();

CI/CD 集成

name: Build and Deploy PWA
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm ci
      - run: npm run build
      - run: npm test
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./dist

性能与安全

性能特点

优势:

  • 减少网络请求,加速页面加载
  • 支持离线访问,提升用户体验
  • 智能缓存策略,优化资源利用
  • 自动处理资源版本更新

性能影响:

  • Service Worker 本身有初始化开销
  • 缓存管理增加存储占用
  • 不当配置可能导致缓存膨胀

优化建议

  1. 合理设置缓存大小:使用 ExpirationPlugin 限制缓存条目和有效期
  2. 选择性预缓存:只预缓存关键资源,不要将所有文件都加入预缓存
  3. 使用 StaleWhileRevalidate:平衡速度和新鲜度
  4. 监控存储使用:定期检查缓存占用情况
import { ExpirationPlugin } from 'workbox-expiration';
 
registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new StaleWhileRevalidate({
    cacheName: 'api-cache',
    plugins: [
      new ExpirationPlugin({
        maxEntries: 100,
        maxAgeSeconds: 7 * 24 * 60 * 60,
        purgeOnQuotaError: true,
      }),
    ],
  })
);

安全注意事项

  1. HTTPS 要求:Service Worker 只能在 HTTPS 环境下运行(localhost 除外)
  2. 作用域限制:Service Worker 只能控制其作用域内的请求
  3. 缓存投毒:确保缓存的内容来源可信
  4. CSP 策略:配合 Content Security Policy 使用
  5. 跨域资源:正确处理 CORS 请求

已知性能瓶颈

  • 首次加载:Service Worker 安装和预缓存需要时间
  • 存储限制:浏览器对存储有配额限制(通常为磁盘的 10-60%)
  • 更新延迟:Service Worker 更新需要用户刷新或重新访问
  • 内存占用:大量缓存会增加内存使用

技术对比

特性Workboxvite-plugin-pwa手写 Service Workerserwist (next-pwa)
维护状态活跃(Chrome Aurora)活跃(社区)-活跃(社区)
功能完整性完整完整(基于 Workbox)自定义完整(基于 Workbox)
学习曲线中等中等
构建集成Webpack 插件Vite 插件Next.js 集成
TypeScript完整支持完整支持自定义完整支持
社区生态丰富活跃自定义活跃
适用构建工具WebpackVite任意Next.js

选择建议:

  • 使用 Workbox + Webpack:Webpack 项目的首选
  • 使用 vite-plugin-pwa:Vite 项目的最佳选择
  • 使用 serwist:Next.js 项目的推荐方案
  • 手写 Service Worker:仅在需要完全控制时考虑

最佳实践

生产环境配置

// sw.js - 推荐的生产配置
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate, CacheFirst, NetworkFirst } from 'workbox-strategies';
import { ExpirationPlugin } from 'workbox-expiration';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
 
// 1. 预缓存静态资源
precacheAndRoute(self.__WB_MANIFEST);
 
// 2. HTML 页面 - StaleWhileRevalidate
registerRoute(
  ({ request }) => request.mode === 'navigate',
  new StaleWhileRevalidate({
    cacheName: 'pages-cache',
    plugins: [new CacheableResponsePlugin({ statuses: [200] })],
  })
);
 
// 3. 静态资源 - Cache First
registerRoute(
  ({ request }) => ['style', 'script', 'worker'].includes(request.destination),
  new CacheFirst({
    cacheName: 'static-cache',
    plugins: [
      new ExpirationPlugin({ maxEntries: 100, maxAgeSeconds: 30 * 24 * 60 * 60 }),
    ],
  })
);
 
// 4. 图片 - Cache First
registerRoute(
  ({ request }) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new ExpirationPlugin({ maxEntries: 50, maxAgeSeconds: 7 * 24 * 60 * 60 }),
    ],
  })
);
 
// 5. API 请求 - StaleWhileRevalidate
registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new StaleWhileRevalidate({
    cacheName: 'api-cache',
    plugins: [
      new CacheableResponsePlugin({ statuses: [200] }),
      new ExpirationPlugin({ maxEntries: 50 }),
    ],
  })
);
 
// 6. 跳过等待,立即激活
self.addEventListener('message', (event) => {
  if (event.data?.type === 'SKIP_WAITING') {
    self.skipWaiting();
  }
});

常见陷阱

// ❌ 错误:不处理 Service Worker 更新
navigator.serviceWorker.register('/sw.js');
 
// ✅ 正确:监听更新并提示用户
const registration = await navigator.serviceWorker.register('/sw.js');
registration.addEventListener('updatefound', () => {
  const newWorker = registration.installing;
  newWorker.addEventListener('statechange', () => {
    if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
      // 提示用户刷新
    }
  });
});
 
// ❌ 错误:缓存无限增长
registerRoute(/.*/, new CacheFirst());
 
// ✅ 正确:设置过期策略
registerRoute(/.*/, new CacheFirst({
  plugins: [new ExpirationPlugin({ maxEntries: 100 })],
}));

技术局限与边界

已知限制

  1. 浏览器兼容性:Service Worker 不支持 IE11 及以下;Safari 的 Service Worker 支持有限制;iOS Safari 有推送通知限制
  2. 首次加载:Service Worker 首次安装不控制页面;预缓存需要等待安装完成;用户需要刷新或重新访问
  3. 存储限制:浏览器对存储有配额限制;存储压力时浏览器可能自动清理
  4. 更新机制:Service Worker 更新需要浏览器检查;用户可能长时间不更新

不适用场景

  • 需要 IE11 支持的项目
  • 简单的静态站点(不需要复杂缓存策略)
  • 频繁更新的应用(Service Worker 更新机制可能导致延迟)
  • 小型项目(引入 Workbox 可能增加不必要的复杂性)
  • 无离线需求的应用

迁移注意事项

从旧版本 Workbox 迁移:

  1. 检查 Breaking Changes 和迁移指南
  2. 更新 API 调用(v6 → v7 的变更)
  3. 测试 Service Worker 更新流程
  4. 验证缓存清理行为

学习资源

2026 年现状

最新版本

v7.4.1(2026 年 5 月 5 日)是当前最新稳定版本:

  • 修复 source-map 相关安全问题
  • 性能优化和 bug 修复
  • 改进 TypeScript 类型定义

版本历史:

  • v7.4.1 - 2026 年 5 月 5 日
  • v7.4.0 - 2025 年 11 月 19 日
  • v7.3.0 - 2024 年 10 月 29 日
  • v7.1.0 - 2024 年 4 月 24 日

发展趋势

  1. 维护团队稳定:Chrome Aurora 团队接手后恢复稳定发布节奏
  2. 与现代构建工具集成:vite-plugin-pwa 活跃发展;框架级 PWA 支持完善
  3. PWA 标准演进:Service Worker API 持续完善;跨浏览器兼容性改进

社区活跃度

  • GitHub Stars:13k+
  • 维护状态:活跃维护,定期更新
  • 总发布数:92 个版本

未来路线图

  1. 持续维护更新,跟进浏览器 API 变化
  2. 更好的 ESM 支持和 TypeScript 类型
  3. 更多框架集成和改进的开发工具

替代方案关注

  • vite-plugin-pwa:Vite 生态的首选 PWA 方案
  • serwist(原 next-pwa):Next.js 项目的 PWA 方案
  • 手写 Service Worker:对于简单场景可能更合适

Workbox 在经历了维护团队更替后,目前已恢复稳定的更新节奏。v7.4.1 版本的发布标志着项目进入健康的发展轨道。对于需要构建 PWA 的开发者来说,Workbox 仍然是最成熟、功能最完整的选择。