Angular 服务工作人员注册失败:DomeException

Angular 服务工作人员注册失败:DomeException,angular,cordova,ionic-framework,ionic4,progressive-web-apps,Angular,Cordova,Ionic Framework,Ionic4,Progressive Web Apps,为了处理PWA中的缓存,我正在将main.ts中的文件名ngsw-worker.js更改为ngsw-worker22.js(每次创建新版本时添加增量编号) 构建之后,我将生成的ngsw-worker.js重命名为ngsw-worker22.js 当我在浏览器上运行我的应用程序时,会出现此错误- main-es2015.642820dbdb6b7b3ca0e0.js:1服务工作者注册失败,原因为:domeException:未能为作用域('s)注册服务工作者https://example.com/

为了处理PWA中的缓存,我正在将
main.ts
中的文件名ngsw-worker.js更改为ngsw-worker22.js(每次创建新版本时添加增量编号)

构建之后,我将生成的ngsw-worker.js重命名为ngsw-worker22.js

当我在浏览器上运行我的应用程序时,会出现此错误-

main-es2015.642820dbdb6b7b3ca0e0.js:1服务工作者注册失败,原因为:domeException:未能为作用域('s)注册服务工作者https://example.com/apptest/“)和脚本('https://example.com/apptest/ngsw-worker.js“):脚本具有不受支持的MIME类型('text/html')

为什么它还在寻找
ngsw worker.js
,当我在控制台中看到时,它显示我已注册

请注意-我的web应用程序使用Cordova,因此缓存的页面是Cordova的,正如您在网络中看到的,服务人员也在工作


我没有使用Cordova,所以可能有一些不同,但是当我将Service Worker与Angular一起使用时,引用是在Angular.json中。这可能是您的更改未生效的原因

“ngswConfigPath”:“ngsw config.json”

话虽如此,我想知道您为什么要更改服务人员文件名?当应用程序打开或刷新时,浏览器会自动检测到新版本。您无需执行任何操作。

您不应将软件名称与版本绑定并不断重命名它,因为它可能会导致客户端出现问题

可能发生的情况是,浏览器将注册新的软件(ngsw-worker22.js),但旧的服务工作者也将保持安装状态

重命名SW被认为是一种反模式(也称为坏习惯)。您可以简单地更改SW范围内的任何文件,以更改其哈希表,并告诉SW服务器上有新数据可用,以便SW可以缓存它

如果希望随每个版本提供一些元数据(如发行说明),可以使用
ngsw.json
文件中的
appData
属性

从Angular.io:

此部分允许您传递描述此特定版本应用程序的任何数据。SwUpdate服务在更新通知中包含该数据。许多应用程序使用此部分为UI弹出窗口的显示提供附加信息,通知用户可用的更新

比如:

在产品构建之后,dist文件夹将有一个
ngsw.json
文件。在内部,目标资产在哈希表中注册,如下例所示。SW使用该散列值来确定服务器上是否存在新版本的资产,因为在每个页面(重新)加载时都会下载此ngsw.json文件


奖励信息:
如果您部署的新版本没有ngsw.json,只要软件检测到该文件丢失(抛出404错误),软件缓存和软件本身将被删除。这是一种安全措施,用于删除潜在的格式错误的缓存/软件版本,并确保从访问web应用程序的客户端中删除这些缓存/软件版本。

您通常应该更改服务人员内部的某些内容,如缓存名。如果没有检测到新版本,我已在多个设备上检查过。即使在刷新3到4次后,它也没有效果。我使用Ionic,我在main.ts中看到ngsw文件如果我不这样做,那么即使在多次重新加载后,它也没有显示更新,你能帮我理解为什么会发生这种情况吗?我如何确保它每次都会更新。在所有运行它的浏览器选项卡/窗口关闭后,旧的软件版本会被替换。在此之前,新软件版本已安装但未激活。在开发过程中,您可以勾选DevTools中的“重新加载时更新”复选框,看看这是否有帮助。Angular在ngsw.json文件中使用hashmap来注册资产版本,软件使用它来检测是否有新资产可用。您还可以检查正在部署的新版本是否有新的hasmaps。如果不是,则新版本与已安装的软件相同。生成后哈希表值始终相同,当我签入浏览器时,当我在10:50再次上载生成时,它显示在10:20收到ngsw-worker.js,它在同一时间再次显示,但我看到了我的新更改i find-only index.html哈希值changedIf index.html在hasTable中并且哈希不同,这应该足以获取新数据并在下次访问时显示它(考虑到在此之前所有浏览器选项卡/窗口都将关闭)。如果仍然不是这样,您应该证明您获得的软件不是来自浏览器缓存。这是杰夫对此的一个很好的回答->
{
  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
  "index": "/index.html",
  "appData": {
    "version": "1.0.0",
    "changelog": "Updated Angular to v.10.0.2"
  },
  "assetGroups": [
    {
     ...
    }
   ]
}
"hashTable": {        
    "/assets/icons/icon-152x152.png": "7479a9477815dfd9668d60f8b3b2fba709b91310",
    "/assets/icons/icon-512x512.png": "559d9c4318b45a1f2b10596bbb4c960fe521dbcc",
    "/assets/icons/icon-72x72.png": "c457e56089a36952cd67156f9996bc4ce54a5ed9",
    "/assets/icons/icon-96x96.png": "3914125a4b445bf111c5627875fc190f560daa41",
    "/favicon.ico": "84161b857f5c547e3699ddfbffc6d8d737542e01",
    "/index.html": "a975fbc21acc838a26b5a9f4a32f51cabefd66e6",
    "/main.3ad4b6e924d02c367683.js": "b4e507433cb30a760dfdc8b7591f25af2ddd0f1a",
    "/manifest.webmanifest": "88d5a912c54f29fe0743a02be3c6f208cc7d5880",
    "/styles.59cf8d767805b2930ef2.css": "93d8472f3f9e95fe245335903d6a64333fdbd353"
  },