javascript - Angular7:服务工作者没有按预期运行
问题描述
我有一个角度服务工作者,我已经缓存了声音(mp3 文件),以便它们可以离线播放。这是ngsw-config-json
:
{
"index": "/index.html",
"assetGroups": [{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": [
"/favicon.ico",
"/index.html",
"/*.css",
"/*.js",
"/*.svg",
"/*.eot",
"/*.woff",
"/*.woff2",
"/*.tff"
]
}
}, {
"name": "assets",
"installMode": "prefetch",
"updateMode": "prefetch",
"resources": {
"files": [
"/assets/sounds/character1/**",
"/assets/sounds/character2/**"
]
}
}]
}
在我的网络应用程序中,声音播放如下:
let audioLink = `/assets/sounds/${character}/${soundURL}`;
let player = new Audio(audioLink);
player.play()
该网站离线工作。HTML、CSS、JS、JSON 文件都被缓存了。但是声音不播放(当我尝试播放时,我在上面显示了一个错误)。
在 Chrome Developer Tools > Application > Cache中,我可以看到一些声音(路径),但不是全部。但他们都没有离线工作。
有时会出现这些错误:
GET "path/to/file" net::ERR_ABORTED 504 (Gateway Timeout)
Uncaught (in promise) DOMException
Failed to load resource: net::ERR_INTERNET_DISCONNECTED
有时它也说 存在问题manifest.json
,但并没有错,因为它在在线时显示在开发人员工具的清单部分中。
这个问题有什么解决办法吗?这不是 Chrome 错误,因为我在 Safari 和 Firefox 中也看到了相同的行为。我知道在新的 chrome 版本中存在一个错误,并且由于这个错误,favicon.ico
没有离线显示
不确定这是否有帮助,但这里是托管 Web 应用程序的链接。如果您在 Chrome 开发者工具中看到网络选项卡,您可以看到 mp3 文件正在“下载”,但它们不能离线播放。
在为生产(ng build --prod --base-href="/"
)生成网站后,我查看了ngsw.json
这就是我所看到的(删除了一些行):
{
"name": "assets",
"installMode": "prefetch",
"updateMode": "prefetch",
"urls": [
"/assets/sounds/character1/sound one.mp3",
"/assets/sounds/character1/sound two.mp3",
"/assets/sounds/character2/sound three.mp3"
"/assets/sounds/character2/sound four.mp3"
],
"patterns": []
}
这是完整生成的ngsw.json
. 一切都设置为预缓存而不是延迟缓存。
所有这些资产 URL 也在"hashTable"
对象中。我还看到它们在 chrome 开发者工具(开发者工具 > 网络)中被下载,但我只在应用程序缓存部分看到其中一些(可能是总共 150 个中的前 20-30 个)。
我在这里做错了什么?这可能是 Angular 7 的错误吗?我已经看到关于类似问题的各种其他 StackOverflow 和 Reddit 问题。
我尝试过的东西正在改变
let audioLink = `/assets/sounds/${character}/${soundURL}`;
至
let audioLink = `assets/sounds/${character}/${soundURL}`;
(在开始时删除了斜线),但这并没有什么不同。
我完全确定所有声音文件路径都是正确的,因为网站在线运行时绝对没有错误。
除了上述之外,我尝试手动更改所有 url 并插入%20
应该有空格的位置。例如,更改"/assets/sounds/character1/sound one.mp3"
为"/assets/sounds/character1/sound%20one.mp3"
,但这也不起作用。
我注意到的一件事是,如果您第一次访问该网站,并等待所有声音下载,然后关闭您的互联网连接并尝试该网站,所有声音都可以正常工作。但只有一段时间,通常大约 10-15 分钟,然后他们停止工作。我已经在 Chrome、Chrome Android、Firefox、Safari 和 IOS Safari 上进行了测试。
编辑:根据某人的建议,我尝试更改
{
"name": "assets",
"installMode": "prefetch",
"updateMode": "prefetch",
"urls": [
"/assets/sounds/character1/sound one.mp3",
"/assets/sounds/character1/sound two.mp3",
"/assets/sounds/character2/sound three.mp3"
"/assets/sounds/character2/sound four.mp3"
],
"patterns": []
}
至
{
"name": "assets",
"installMode": "prefetch",
"updateMode": "prefetch",
"urls": [
"/assets/sounds/**"
],
"patterns": []
}
但同样的问题仍然存在:声音被离线缓存可能 10-15 分钟,之后它们不会离线播放。我只能在 Chrome 和 Chrome Android 中对此进行测试。
解决方案
我已经尝试制作一个演示来隔离错误并且似乎可以工作。注意到应用缓存中有一些奇怪的 url:
不确定这是导致问题的原因。您已经提到使设备离线后声音会起作用,我猜这是浏览器缓存而不是离线缓存。当我尝试刷新页面时,声音永远不会起作用。我的猜测是 ngsw 的配置或 ngsw 缓存文件的方式与 Audio 类不兼容。
您可以通过首先使用@angular/common/http
. 我认为这是因为音频文件似乎位于不同的缓存目录中(见截图)。由于某种原因,css/js 文件的存储方式似乎有所不同,并且音频文件只能以角度访问(离线)。
发布为回复,因为评论太长了
推荐阅读
- r - 如何在数据框中按行获取所有值组合
- php - 我必须如何实现我的代码才能获得正确的 json?
- java - 如何模拟 SFTP 连接的连接
- binary-search-tree - 一棵空二叉树中的5个数字
- python-3.x - Python 3 Windows 安装给出包错误 ModuleNotFoundError
- r - 图像未显示 R 仪表板
- asp.net-web-api - ASP.net web api刷新JWT逻辑问题
- django - Gunicorn 无法运行服务器
- javascript - 反应合成事件在 Web 组件中不起作用
- node.js - 我正在声明一个函数,但它是不可调用的,为什么?