You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Workbox PWA路由分包缓存自定义:仅缓存当前访问路由chunk咨询

全量缓存是否为Workbox默认行为

全量缓存路由chunk是开启Workbox预缓存(Precaching)功能后的默认表现。
Workbox配合Webpack插件使用时,默认会将构建输出的所有静态资源(包括路由分割生成的异步chunk)全部加入预缓存清单,在Service Worker安装阶段就会一次性全部下载并缓存,与用户是否访问对应路由无关。

配置仅缓存已访问路由chunk的方案

完全可以实现按需缓存,核心思路是把异步路由chunk从预缓存清单中排除,改用运行时缓存策略处理:

  1. 修改Workbox Webpack插件配置,排除异步路由chunk
    示例配置(以GenerateSW插件为例):

    // webpack.config.js
    const { GenerateSW } = require('workbox-webpack-plugin');
    
    module.exports = {
      // 其他webpack配置
      plugins: [
        new GenerateSW({
          // 排除异步路由chunk,可根据项目chunk命名规则调整匹配正则
          exclude: [/^async-route.*\.js$/, /\.chunk\.js$/],
          // 保留其他原有配置
        })
      ]
    }
    

    如果项目的路由chunk有统一命名规则,比如都带pages-前缀、都以.chunk.js为后缀,调整正则匹配即可。

  2. 添加运行时缓存规则匹配路由chunk
    在Service Worker配置中添加对应规则,只有当chunk被实际请求时才会被缓存:

    // service-worker.js (使用InjectManifest模式时直接写在自定义sw源码中即可)
    import { registerRoute } from 'workbox-routing';
    import { StaleWhileRevalidate, CacheFirst } from 'workbox-strategies';
    import { ExpirationPlugin } from 'workbox-expiration';
    
    // 匹配异步路由chunk的请求
    registerRoute(
      ({ url }) => url.pathname.includes('/static/js/') && url.pathname.endsWith('.chunk.js'),
      // chunk文件名带hash时用CacheFirst策略,避免重复请求;不带hash用StaleWhileRevalidate兼顾更新
      new CacheFirst({
        cacheName: 'route-chunks',
        plugins: [
          new ExpirationPlugin({
            maxEntries: 20, // 限制最大缓存路由chunk数量,避免存储空间占用过大
            maxAgeSeconds: 30 * 24 * 60 * 60, // 缓存30天
          })
        ]
      })
    );
    

优化建议

  • 首屏依赖的核心chunk可以保留在预缓存清单中,保证首次加载速度
  • 低频访问的路由chunk可以不做强制缓存,或者设置更短的过期时间

内容的提问来源于stack exchange,提问作者Martin Nordström

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:09