用元宝写一个ServiceWorker

智能摘要
Kimi·K2.5

前言

在前几个月的时候,原本打算使用ServiceWorker来对字体、图片以及部分耗时长的文件来进行缓存,解决在非缓存下的等待时间长问题。因为一些原因导致了没去使用,在前几天我通过元宝来解决这个问题,顺便写了一个要求清单来给大家思考

思考text
清除之前的思考并重新开发,遵循以下全部要求进行开发一个基于Nuxt SSG模式 + ServiceWorker的TS模块
1.缓存整站的图片、字体后,当自身没有任何新东西的时候,不在继续缓存
2.在更新时,自动清除客户端中全部缓存并通过悬浮提示框提示,需要在提示末尾处添加一个手动清除按钮,以免无法自动清除。同时自动清除通过强制刷新策略来进行清除,无论用户是否需要自主刷新。同时悬浮提示框需要使用文字提示
3.全局版本号依靠构建时间(runtimeConfig.public.buildTime)来作为版本号(V年.月.日.时.分),同时在构建出版本号后需要解析到runtimeConfig.public.swBuildTime,每当客户端版本号出现变动时启用要求二
4.需要在app.config.ts中添加配置项,包含是否永久缓存(若不需要请额外增加一个缓存时间)、逃生门(需要使用["", ""]作为配置项,用于配置特定请求忽略)、关闭ServiceWorker选项、额外缓存文件类型
5.不许在Ctrl + R时出现重新加载的提示
文字提示:本站已更新至多少版本号(将已经生成好的版本号放在此处),请重新加载以免出现不可预料的问题,刷新缓存(缓存刷新功能放在此处)

配置&逻辑

Nuxt配置

APP配置

app.Config.tsts
  serviceWorker: {
    // 1. 主开关:设为 false 时,客户端将注销并停止所有 Service Worker
    enabled: true, 
    
    // 2. 缓存规则
    cacheRules: {
      // 需要拦截缓存的文件后缀
      extensions: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'woff2', 'woff', 'ttf'],
      // 额外需要缓存的 MIME 类型
      mimeTypes: ['image', 'font'],
      escapeDoors: ['/api/recent-comments', '/api/stats']
    },
    
    // 3. 永久缓存开关与过期时间(单位:秒)
    // 若 permanent 为 true,则无视 maxAge;若为 false,超过 maxAge 的资源会被重新拉取
    permanent: true, 
    maxAge: 3600 * 24 * 30, // 30天
    
    // 4. 逃生门 (Escape Door)
    // 当请求 URL 包含此前缀时,Service Worker 将彻底放行,不做任何拦截
    // 可用于动态大文件下载或需要实时获取的后端接口
    escapeDoor: ['/api/recent-comments'], 
    
    // 5. 版本号 (由构建时自动注入,此处仅为类型提示)
    // 在 sw.ts 中我们会通过模板字符串自动生成时间戳
  },

核心代码

客户端插件

服务引擎

新故事即将发生
用Codex写一个热搜页面

评论区

评论加载中...