Angular 5和Service Worker:如何从ngsw-config.json中排除特定路径

ktr*_*yak 21 service-worker angular angular-service-worker

ngsw-config.json(摘自文档):

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "app",
    "installMode": "prefetch",
    "resources": {
      "files": [
        "/favicon.ico",
        "/index.html"
      ],
      "versionedFiles": [
        "/*.bundle.css",
        "/*.bundle.js",
        "/*.chunk.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}
Run Code Online (Sandbox Code Playgroud)

在我的网站上有一个指向RSS源的链接,该链接/api/rss应该在新的浏览器选项卡中打开而不加载Angular应用程序.如何将其从请求重定向到的资源列表中排除index.html

UPD:我试过但没有使用以下配置(请参阅参考资料!/api/rss):

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "app",
    "installMode": "prefetch",
    "patterns": ["!/api/rss"],
    "resources": {
      "files": [
        "/favicon.ico",
        "/index.html",
        "!/api/rss"
      ],
      "versionedFiles": [
        "/*.bundle.css",
        "/*.bundle.js",
        "/*.chunk.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}
Run Code Online (Sandbox Code Playgroud)

ktr*_*yak 22

感谢Pedro Arantes的 建议,我达到了下一个工作配置(见dataGroups"maxAge": "0u"):

{
  "index": "/index.html",
  "dataGroups":
  [
    {
      "name": "api",
      "urls": ["/api"],
      "cacheConfig": {
        "maxSize": 0,
        "maxAge": "0u",
        "strategy": "freshness"
      }
    }
  ],
  "assetGroups":
  [
    {
      "name": "app",
      "installMode": "prefetch",
      "resources": {
        "files": [
          "/favicon.ico",
          "/index.html"
        ],
        "versionedFiles": [
          "/*.bundle.css",
          "/*.bundle.js",
          "/*.chunk.js"
        ]
      }
    },
    {
      "name": "assets",
      "installMode": "lazy",
      "updateMode": "prefetch",
      "resources": {
        "files": [
          "/assets/**"
        ]
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 我放入数据组中的所有内容似乎都被忽略了。我在 dist 中生成的 ngsw.json 文件中没有数据组(使用 ng build --prod)。您有这种配置吗?还是以其他方式工作? (2认同)
  • 它也适用于外部网址(即CDN文件)吗?我正在尝试但对我不起作用 (2认同)

Ped*_*tes 15

您是否已尝试创建数据组?dataGroups用于数据请求,例如assetGroups资产(文件).

数据组

与资产资源不同,数据请求不会随应用程序一起进行版本控制.它们根据手动配置的策略进行缓存,这些策略对API请求和其他数据依赖性等情况更有用.

数据组界面:

export interface DataGroup {
  name: string;
  urls: string[];
  version?: number;
  cacheConfig: {
    maxSize: number;
    maxAge: string;
    timeout?: string;
    strategy?: 'freshness' | 'performance';
  };
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一个排除的数据组/api/rss(如果"!/api/rss"不起作用,您可以添加所有其他API urls": ["/api/user", "/api/admin"]:

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "assetGroup1",
    ...
  }, {
    "name": "assetGroup1",
    ...
  }],
  "dataGroups": [{
    "name": "dataGroup1";
    "urls": ["!/api/rss"];
    cacheConfig: {
      maxSize: 50;
      maxAge: "3d12h";
    }
  }, {
    "name": "dataGroup2";
    "urls": ["/api/user"];
    cacheConfig: {
      maxSize: 40;
      maxAge: "3d12h";
    }
  }]
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*rch 14

正确的方法是从索引重定向中省略端点。因此,您的 ngsw-config.json 应该如下所示,添加navigationUrls和否定您希望省略的 url 部分。这样 URL 将被重定向并完全绕过 ngSW。

    {
      "index": "/index.html",
      "assetGroups": [{
        "name": "app",
        "installMode": "prefetch",
        "resources": {
          "files": [
            "/favicon.ico",
            "/index.html"
          ],
          "versionedFiles": [
            "/*.bundle.css",
            "/*.bundle.js",
            "/*.chunk.js"
          ]
        }
      }, {
        "name": "assets",
        "installMode": "lazy",
        "updateMode": "prefetch",
        "resources": {
          "files": [
            "/assets/**"
          ]
        }
      }],
      "navigationUrls": [
        "!/api/rss"
      ]
    }
Run Code Online (Sandbox Code Playgroud)

注意,!/api/rss是具体的。如果您想省略整个api文件夹,请使用!/api/**

此处的文档https://angular.io/guide/service-worker-config#navigationurls

请注意,根据文档,否定 ( !) 不起作用。"resources": "urls":

  • 我认为你的解决方案是最好的!但您还需要包含文档中的默认 navigationUrls: `"navigationUrls": [ "/**", "!/**/*.*", "!/**/*__*", "!/ **/*__*/**", "!/api/rss"`] (2认同)

Chr*_*ney 11

现在这变得更容易了,您可以使用ngsw-bypass 绕过来自 angular service worker 的 URL 。从文档

要绕过 Service Worker,您可以将 ngsw-bypass 设置为请求标头或查询参数。(标题或查询参数的值被忽略,可以为空或省略。)

我正在使用查询字符串绕过 service worker 的某个 url,如下所示:

https://mydomain.report-uri.com/r/d/csp/enforce?ngsw-bypass=true

  • 这绝对是一个比公认的答案更好的答案。这是因为现在您不必编辑 ngsw-config.json 文件,我认为最好保留该文件(如果可能)以便将来更容易更新。 (2认同)

Tre*_*ent 5

ngsw-configuration.json文件使用glob格式表示模式匹配路径.

Patterns use a limited glob format:

** matches 0 or more path segments.
* matches exactly one path segment or filename segment.
The ! prefix marks the pattern as being negative, meaning that only files that don't match the pattern will be included.
Run Code Online (Sandbox Code Playgroud)

这里重要的是!前缀,可用于排除路径.例如,glob模式!/api/rss应该排除此路径.

要从nags-configuration.json文件中排除路径,只需将!字符添加到此路径模式中.

  • 请注意,dataGroups或AssetGroups / resources中的files数组中的urls数组不支持负的glob模式。 (3认同)