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

Angular 6中带版本参数的资源无法被Service Worker离线处理

解决Angular 6 Service Worker离线无法处理带版本GET参数的资源问题

你遇到的核心问题是Angular Service Worker默认的资源缓存规则不会匹配带查询参数的文件(比如FontAwesome字体末尾的?v=4.7.0),导致离线时这些资源找不到缓存,返回504错误。下面是具体的解决步骤:

1. 修改ngsw-config.json的资源匹配规则

Angular Service Worker的配置文件ngsw-config.json里的assetGroups负责定义需要缓存的静态资源,默认规则是精确匹配路径,不包含查询参数。你需要添加能覆盖带参数资源的匹配规则:

打开项目根目录的ngsw-config.json,找到assetGroups下的resources -> files数组,添加针对字体文件(或更通用的带参数资源)的匹配模式:

{
  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
  "index": "/index.html",
  "assetGroups": [
    {
      "name": "app",
      "installMode": "prefetch",
      "resources": {
        "files": [
          "/favicon.ico",
          "/index.html",
          "/*.css",
          "/*.js",
          // 新增:匹配带版本参数的字体文件
          "/*.woff2?*",
          "/*.woff?*",
          "/*.ttf?*"
        ]
      }
    },
    {
      "name": "assets",
      "installMode": "lazy",
      "updateMode": "prefetch",
      "resources": {
        "files": [
          "/assets/**"
        ]
      }
    }
  ]
}

如果你想覆盖所有带查询参数的静态资源,可以添加更通用的**/*?*模式,但建议尽量精准匹配,避免缓存不必要的资源。

2. 重新构建生产环境应用

修改配置后必须重新构建生产版本的应用,因为Service Worker的缓存清单是在构建阶段生成的:

ng build --prod

3. 验证缓存效果

部署新构建的应用后,打开浏览器开发者工具的Application -> Service Workers面板,查看缓存的资源列表,确认那些带?v=4.7.0的字体文件已经被纳入缓存。之后切换到离线模式刷新页面,就能正常加载这些资源了。

另外,确保你的Angular CLI版本和@angular/pwa、@angular/service-worker版本保持一致(均为6.x系列),避免版本不兼容导致的异常。

内容的提问来源于stack exchange,提问作者Sebastian Viereck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:46:05