如何修复 service-worker + angular 的 'Uncaught (in promise) bad-precaching-response' 错误
How to fix 'Uncaught (in promise) bad-precaching-response' error with service-worker + angular
对于 jhipster-6.2 生成的项目,我 运行 遇到了将我的 Spring + Angular 应用程序转变为渐进式网络应用程序 (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}]
当我按照那个 link 进行操作时,我进入了一个页面,该页面由于违反 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.
我相信如果 url 有任何 <400
响应,服务工作者将不会缓存任何内容(有充分的理由),这意味着我的服务工作者不工作完全在生产中。然而,尽管将 linkhelp
资源列入白名单,错误仍然发生。我担心我在调整安全设置时走错了路,可能会遗漏一些关于服务工作者的基本知识,我是新手。
我通过谷歌搜索 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/
预期结果:生产部署允许像本地部署那样使用离线功能。 Lighthouse 审核成功。
实际结果:产品部署不允许离线功能。 Lighthouse 审核失败。
通过将 exclude: [/swagger-ui/]
添加到 webpack/webpack.prod.js
中对 WorkboxPlugin.GenerateSW
的调用中的配置,从工作箱预缓存清单中排除 swagger-ui
。大多数用户不会访问该页面,因此最好将其从预缓存中排除。
new WorkboxPlugin.GenerateSW({
clientsClaim: true,
skipWaiting: true,
exclude: [/swagger-ui/]
})
有了这个,满分唯一缺少的就是 apple-touch-icon
对于 jhipster-6.2 生成的项目,我 运行 遇到了将我的 Spring + Angular 应用程序转变为渐进式网络应用程序 (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}]
当我按照那个 link 进行操作时,我进入了一个页面,该页面由于违反 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.
我相信如果 url 有任何 <400
响应,服务工作者将不会缓存任何内容(有充分的理由),这意味着我的服务工作者不工作完全在生产中。然而,尽管将 linkhelp
资源列入白名单,错误仍然发生。我担心我在调整安全设置时走错了路,可能会遗漏一些关于服务工作者的基本知识,我是新手。
我通过谷歌搜索 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/
预期结果:生产部署允许像本地部署那样使用离线功能。 Lighthouse 审核成功。
实际结果:产品部署不允许离线功能。 Lighthouse 审核失败。
通过将 exclude: [/swagger-ui/]
添加到 webpack/webpack.prod.js
中对 WorkboxPlugin.GenerateSW
的调用中的配置,从工作箱预缓存清单中排除 swagger-ui
。大多数用户不会访问该页面,因此最好将其从预缓存中排除。
new WorkboxPlugin.GenerateSW({
clientsClaim: true,
skipWaiting: true,
exclude: [/swagger-ui/]
})
有了这个,满分唯一缺少的就是 apple-touch-icon