angular - 如何使用 service-worker + angular 修复 'Uncaught (in promise) bad-precaching-response' 错误

标签 angular webpack jhipster service-worker progressive-web-apps

使用 jhipster-6.2 生成的项目,我在将 Spring + Angular 应用程序转换为渐进式 Web 应用程序 (PWA) 时遇到了问题。我的 service-worker 成功注册,但一旦我的应用程序部署到生产环境就不会提供离线功能。在我的控制台中,我得到一个 bad-precaching-response ,似乎至少适用于一个 CSS 文件。对于本地部署,缓存工作。

为了成功注册我的 service-worker,我在 index.html 中取消了 serviceWorker 相关代码的注释。所以我有这个:

    <script>
        if ('serviceWorker' in navigator) {
            window.addEventListener('load', function() {
                navigator.serviceWorker.register('/service-worker.js')
                    .then(function () {
                        console.log('Service Worker Registered');
                    });
            });
        }
    </script>

我通过 Workbox 插件成功生成了我的 service worker:
new WorkboxPlugin.GenerateSW({
            clientsClaim: true,
            skipWaiting: true
        })

我有我的 manifest.webapp在我的 webapp 目录中:
{
  "name": "<truncated>",
  "short_name": "<truncated>",
  "icons": [
        <truncated>
    ],
  "theme_color": "#000000",
  "background_color": "#e0e0e0",
  "start_url": ".",
  "display": "standalone",
  "orientation": "portrait"
}

对于本地部署,Workbox 会按预期进行缓存。但是,它在生产中失败了。

当我通过 Heroku 部署时,我强制 https .在完成上述步骤后首次部署后,我必须更新我的内容安全策略以包含 worker-src 'self' https://storage.googleapis.com/* blob: .虽然这解决了我最初的安全问题,但现在我的控制台中出现了这个错误,并进行了实时生产部署:
Uncaught (in promise) bad-precaching-response: 
bad-precaching-response :: [{"url":"https://<truncated>/swagger-ui/dist/css/typography.css?__WB_REVISION__=d41d8cd98f00b204e9800998ecf8427e",
"status":404}]

当我点击该链接时,我进入了一个由于违反 CSP 而返回 404 的页面:
Refused to load the script 'https://linkhelp.clients.google.com/tbproxy/lh/wm?sourceid=wm&url=https%3A%2F%<truncated>.herokuapp.com%2Fswagger-ui%2Fdist%2Fcss%2Ftypography.css%3F&hl=en&site=<truncated>.herokuapp.com&error=http404&js=true' 
because it violates the following Content Security Policy directive: 
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com https://linkhelp.clients.google.com/* https://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js blob:". 
Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.

我相信如果有任何 < 400 服务 worker 不会缓存任何东西(有充分的理由)来自 url 的响应,这意味着我的 service-worker 在生产中根本不工作。然而,尽管将 linkhelp 列入白名单资源,错误仍然发生。我担心我在调整安全设置方面走错了路,可能会遗漏一些关于服务 worker 的基本知识,这是我的新手。

我通过谷歌搜索 jhipster pwa 的一些变体,查阅了许多指南。或类似但最终在同一个地方。这些指南包括:
  • Service-Worker 相关教程在 https://angular.io
  • https://blog.ippon.tech/build-a-pwa-in-jhipster/
  • https://developer.okta.com/blog/2017/05/09/progressive-web-applications-with-angular-and-spring-boot
  • https://www.smashingmagazine.com/2018/09/pwa-angular-6/

  • 预期结果:生产部署允许像本地部署一样的离线功能。灯塔审计成功。

    实际结果:产品部署不允许离线功能。灯塔审计失败。

    最佳答案

    排除 swagger-ui从工作箱预缓存 list 中添加 exclude: [/swagger-ui/]到对 WorkboxPlugin.GenerateSW 的调用中的配置在 webpack/webpack.prod.js .大多数用户不会访问该页面,因此最好将其从预缓存中排除。

    new WorkboxPlugin.GenerateSW({
      clientsClaim: true,
      skipWaiting: true,
      exclude: [/swagger-ui/]
    })
    

    有了这个,完美分数中唯一缺少的是 apple-touch-icon

    关于angular - 如何使用 service-worker + angular 修复 'Uncaught (in promise) bad-precaching-response' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57979835/

    相关文章:

    Jhipster 应用程序中的 Iframe 幻灯片 google 被阻止

    angular - 如何在angular 7中将内容类型设置为multipart/form-data

    javascript - 使用 Webpack + Typescript 加载 AmCharts

    Webpack,为什么我们需要哈希来有效地缓存文件?

    vue.js - 安装了vue loader unmet dependancy但仍然报错

    Azure Spring Cloud 和 JHipster

    javascript - 如何配置 [mode] ="' sql'"在 Angular 7 中使用 ng2-ace-editor?

    angular - Visual Studio 2017 Angular 4 模板

    javascript - 单击按钮后隐藏元素 - angular2 - ngFor

    java - 无法将 DaoAuthenticationConfigurer 应用于已构建的对象