Angular 7 - 未注册的服务人员

Posted

技术标签:

【中文标题】Angular 7 - 未注册的服务人员【英文标题】:Angular 7 - service worker not registered 【发布时间】:2019-04-19 04:10:20 【问题描述】:

我按照“https://angular.io/guide/service-worker-getting-started”中的说明做了所有事情来制作我的应用程序 PWA。

完全使用了这个命令:

ng add @angular/pwa

npm install http-server -g

ng build --prod

http-server -p 8080 -c-1 dist

然后我在 Chrome 上打开了这个网址(隐身)

http://127.0.0.1:8080

当我为开发人员打开工具 (f12) > 应用程序 > Service Worker 时,没有可用的 Service Worker 并且当我在那里设置离线时网站无法运行。

关于我的 Angular 应用的其他信息:

package.json:(最重要的)

"@angular/core": "^7.0.2",
"@angular/pwa": "^0.10.6",
"@angular/service-worker": "^7.0.4",
"@angular-devkit/build-angular": "^0.10.6",
"@angular/cli": "^7.0.6",

【问题讨论】:

你用过firefox吗?您是否尝试缓存动态资产或 url? 因为目前我只是尝试让基本功能正常工作,您可以在此处查看默认应缓存的内容angular.io/guide/… @tmz 是的,我明白了。您是否尝试过使用 firefox 来查看是否有 service worker?您的网站是静态内容还是只有动态内容? @ams 我没有尝试使用firefox,但我不认为这个问题与chrome浏览器有关。静态/动态内容。 【参考方案1】:

@angular/cli@7.1.4 的服务工作者设置似乎已损坏:

作为临时解决方案,您可以通过修改文件 src/main.ts 自己手动注册(一旦修复,您可以删除手动 service worker 注册。):

.....

platformBrowserDynamic().bootstrapModule(AppModule).then(() => 
  if ('serviceWorker' in navigator && environment.production) 
    navigator.serviceWorker.register('/ngsw-worker.js');
  
).catch(err => console.log(err));

PS:Github 问题已创建:https://github.com/angular/angular-cli/issues/13351

PS:Github 第 2 期已创建:https://github.com/angular/angular-cli/issues/15025

【讨论】:

非常感谢您的解决方法!!!我花了很多时间调试这个。顺便说一句,我什至在版本 7 之前就遇到过这个问题。 在 CLI 中损坏:7.3.1 也 哪个@angular/cli 版本稳定,我们可以使用service worker 我认为这与 serviceworker 坏了无关。我相信您的应用程序不稳定。例如 setinterval 或 settiemout 会破坏角度稳定性。你应该使用其他的东西。 新问题已创建,希望这次不要关闭:github.com/angular/angular-cli/issues/15025【参考方案2】:

artemisian 的解决方案有效,但它是一个 hack,你不确定它是否会在未来有效。

更好的解决方案

有一个“registrationStrategy”设置与注册时的角度等待有关,直到您的应用程序“稳定”。现在,如果您在启动应用程序(身份验证和构建 websocket 连接)时加载了一堆东西,那么 angular 显然认为您的应用程序永远不会稳定。

幸运的是,您可以像这样将registrationStrategy覆盖为registerImmediately

ServiceWorkerModule.register('ngsw-worker.js',  enabled: environment.production, registrationStrategy: 'registerImmediately' ),

查看文档here

在此之后,无论您的应用处于何种状态,serviceworker 都会加载。还有一个传递 observable 的选项,因此您可以在认为正确的时候加载它。

【讨论】:

这是一个方便的技巧,但仅在 Angular V8 中可用。 太棒了。我不明白为什么服务人员不注册。我有一些需要使用无限间隔/函数的东西...... 更新:当我用 rxjs 的 timer(...) 替换所有 setInterval(...) 时,我实际上不再需要该选项了! learnrxjs.io/operators/creation/timer.html 非常感谢您的回答!!!我正在使用 oidc 客户端,但无法弄清楚为什么它不会注册。我想给你的 GitHub 答案竖起大拇指github.com/angular/angular-cli/issues/13351,但他们锁定了这个问题! :-(【参考方案3】:

请注意,浏览器不会为 HTTP 注册服务工作者除非它是本地主机

运行 http-server,控制台显示应用程序将从以下 URL 提供服务: http://10.40.59.29:8080, http://127.0.0.1:8080, http://192.168.255.209:8080.

不要忘记将IP地址替换为localhost,例如http://localhost:8080/

【讨论】:

在 Google Chrome 中,您可以设置可信来源以在 chrome://flags/#unsafely-treat-insecure-origin-as-secure 中进行测试

以上是关于Angular 7 - 未注册的服务人员的主要内容,如果未能解决你的问题,请参考以下文章

angular 6 ionic 4 默认组件未注册

未检测到匹配的服务人员 - Angular 9

Angular 5 - 加载资源失败:服务器响应状态为 404(未找到)

nacos项目启动未注册却到服务里

Angular PWA 错误站点无法安装:未检测到匹配的服务人员

控制器未根据控制台注册