>一个内/前端/
>第二内/后/
我正在使用@ angular / service-worker包来管理服务工作者.
当我构建prod版本并部署我的应用程序时会发生奇怪的事情.
当我首先进入http://my.domain/frontend/时,我无法进入http://my.domain/backend/,因为服务人员加载文件并将我重定向到http://my.domain/frontend/
这个设置有什么问题?我需要更改该服务工作者的文件名,或者只是我在这个设置的同一个域上不能有两个角度应用程序
解决方法
例如:
来自App 1的ngws-config.json:
{ "index": "/index.html","assetGroups": [ { "name": "sw-app-app","installMode": "prefetch","resources": { "files": ["/favicon.ico","/index.html"],"versionedFiles": ["/*.bundle.css","/*.bundle.js","/*.chunk.js"] } },{ "name": "sw-app-assets","installMode": "lazy","updateMode": "prefetch","resources": { "files": ["/assets/**"] } } ] }
App 2中的ngws-config.json:
{ "index": "/index.html","assetGroups": [ { "name": "sw-app-two-app",{ "name": "sw-app-two-assets","resources": { "files": ["/assets/**"] } } ] }
因为:
Cache Storage API(和其他存储机制,如IndexedDB)在整个源中共享,默认情况下没有“分片”或命名空间隔离.
我的猜测是这两个应用程序的缓存存储中使用了这个默认名称(但是还有一个哈希,这仍然让我感到困惑).我还检查了缓存存储并删除了所有不包含sw-app(或sw-app-two)的ngsw:*条目.
在这些更改之后,一切似乎都运行得更好,但经过一些重新加载(使用活动服务器)后,我意识到我的sw-app条目来自Cache Storage,在打开sw-app-two之后不见了.只有sw-app-two条目和一个名为ngsw:db:control left的条目.此条目仅包含sw-app-two的ngsw-conig.json的资产组(在清单下).再次打开sw-app后,assetGroups清单中的内容更改为sw-app,sw-app-two内容消失了.
所以我有ngsw:db:控制左边有sw-app内容,其他Cache Storage条目名称包含sw-app-two.当我打开两个应用程序(服务器关闭)时,总会出现sw-app-two(没有错误,但它只是一个没有真正内容的应用程序).这个混合适用于一个应用程序,也不知何故混淆.
更多细节,但仍然没有解决方案.很想检查角度代码并制作公关但……至少提出问题.我很确定缓存存储在同一来源的应用程序之间混淆了.
PS:当你设置baseHref时,一定要检查这个github问题:#8515 #8516
编辑:我创建了issue #21388
EDIT(2):
Service Worker脚本必须托管在同一源(协议域名端口).在this stackoverflow question提到
我将为每个应用程序创建一个子域,并在本地不同的端口上运行多个http服务器来测试它.这应该工作,似乎是这种用例的唯一解决方案.希望这也是你的选择!如果没有,你可以写一个评论来提升issue的频率标签;-)
EDIT(3):
我找到了一个似乎有效的解决方案,但你必须在构建过程之后编辑ngsw-worker.js.只需将ngsw:db:替换为应用程序的唯一名称(例如:ngsw:db:sw-app-one:for sw-app-one,ngsw:db:sw-app-two:for sw-app-二)
EDIT(4):
可悲的是,解决方案不起作用,控制键的条目(例如:ngsw:db:sw-app-one:control)将被另一个应用程序的内容覆盖…我将在issue发表评论以获取更多详细信息. ..