angular - Angular 6 Service Worker 拒绝缓存资产,因为 ngsw.json 未正确获取
问题描述
当前行为
我做到了ng add @angular/pwa
,我在生产构建中遇到了这个错误
Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
at Driver.<anonymous> (ngsw-worker.js:2297)
at Generator.next (<anonymous>)
at fulfilled (ngsw-worker.js:1752)
我做了一些研究,发现
/ngsw.json?ngsw-cache-bust=0.08769372894975769
GET 请求存在问题。虽然 fetchLatestManifest 返回 200 状态码,但响应实际上不是 JSON ,而是它的无脚本版本index.html
您可以看到响应状态为 200/ngsw.json?ngsw-cache-bust=0.08769372894975769
但实际响应不是所需的 JSON
我尝试在 chrome Actual ``` 中复制作为 fetch 选项
fetch("https://officehawk.com/ngsw.json?ngsw-cache-bust=0.7927584506157848", {"credentials":"omit","headers":{},"referrer":"https://officehawk.com/ngsw-worker.js","referrerPolicy":"no-referrer-when-downgrade","body":null,"method":"GET","mode":"cors"});
``` 我?ngsw-cache-bust=0.7927584506157848
从 fetch 的 URL 部分中删除了,我可以看到响应是 JSON。
编辑了```
fetch("https://officehawk.com/ngsw.json", {"credentials":"omit","headers":{},"referrer":"https://officehawk.com/ngsw-worker.js","referrerPolicy":"no-referrer-when-downgrade","body":null,"method":"GET","mode":"cors"});
``` 这样你现在就可以看到 ngsw.json 的内容了
我怀疑它必须在这个函数中处理? https://github.com/angular/angular/blob/0b4d85e9f19246af68a75140afc4db3d97f9ddfd/packages/service-worker/worker/src/driver.ts#L645
环境
角度版本:6.0.0
浏览器:- [x] Chrome(桌面)版本 67
解决方案
我最近在使用 Nginx 作为我的网络/反向代理服务器的 Angular PWA 上遇到了这个错误。
我在 Nginx 的虚拟服务器配置中解决了我的问题。我从这里更改了我的位置块:
location / {
root $root_path;
index index.html;
try_files $uri$args $uri$args/ index.html =404;
error_page 404 =200 /index.html;
}
对此:
location / {
root $root_path;
index index.html;
try_files $uri $uri$args $uri$args/ index.html =404;
error_page 404 =200 /index.html;
}
不同之处在于 try_files 行。基本上,这一行告诉 Nginx 如何检查被请求文件的路径。它们按从左到右的顺序进行评估。
推荐阅读
- php - 如何使用 php 在工具提示 Bootstrap 4 中显示图像
- tcl - 在 mkdir 之后,文件不会在创建的文件夹中生成
- python-3.x - Pyspark 中的 HDFS 文件存在性检查
- python - tensorflow:分析图像给出了无法为张量“占位符:0”提供形状(1296000,)的值,其形状为“(?,1296000)”
- mysql - Mysql - 选择有所有日期的房间
- sentry - Sentry - 将 JSON 字段包含在引号中的设置
- mysql - SphinxQL 连接问题(守护进程正在监听时)
- avro - 如何在 Avro 模式中指定范围?
- javascript - 在 Angular 6 中动态调用索引组件
- node.js - Let's Encrypt 的证书无法与 node.js 一起使用