4

我正在使用 Google 的SW Precache为托管在 firebase 上的 Angular(当前为 v.4)应用程序生成 serviceworker。我正在使用 Angular cli 生成我的分布式文件。在部署我的应用程序时,我使用以下命令:

ng build --prod --aot #build angular app
sw-precache --config=sw-precache-config.js --verbose # generate precache
firebase deploy # Send to firebase

我的sw-precache-config.js文件如下所示:

module.exports = {
  staticFileGlobs: [
    'dist/**.css',
    'dist/**/**.png',
    'dist/**/**.svg',
    'dist/**.js'
  ],
  stripPrefix: 'dist',
  root: 'dist/',
  navigateFallback: '/index.html',
  runtimeCaching: [
    {
      urlPattern: /index\.html/,
      handler: 'networkFirst'
    },
    {
      urlPattern: /\.js/,
      handler: 'cacheFirst'
    }, {
      urlPattern: /fonts\.googleapis\.com/,
      handler: 'fastest'
    },
    {
      default: 'networkFirst'
    }
  ]
};

如果我进行更改并部署新版本,即使我刷新或关闭浏览器,我也会得到缓存的 index.html 文件。?cachebust=1如果我在 url 的末尾添加类似的内容,我可以获得更新的 index.html 文件。我的流程或配置中是否有什么问题不允许加载最新的 index.html?

4

1 回答 1

2

作为一般的最佳实践,我建议您在service-worker.js禁用 HTTP 缓存的情况下显式提供文件,以确保按预期获取对生成的 service worker 所做的更改,而无需等待 HTTP 缓存副本过期。

在未来的某个时候,Chrome 和 Firefox 的默认行为将始终是直接从网络获取服务工作者,而不是尊重 HTTP 缓存,但与此同时,您可以阅读更多关于当前行为的信息

我有一个 Firebase 部署的示例配置,可能会有所帮助:

{
  "hosting": {
    "public": "build",
    "headers": [{
      "source" : "/service-worker.js",
      "headers" : [{
        "key" : "Cache-Control",
        "value" : "no-cache"
      }]
    }]
  }
}
于 2017-04-11T04:09:50.957 回答