过去几天我一直在阅读关于这个主题的 SO 帖子和 Github 问题,但我似乎仍然找不到适合我的设置的组合。希望有人可以指出我的具体解决方案。这是正在发生的事情。
我正在使用 create-react-app v2 和sw-precache
. 构建通过 CircleCI 将新文件推送到 S3,而 S3 又从 CloudFront 提供服务。构建的最后一步是使之前的 CloudFront 分配无效。
我遇到的问题是,当部署新构建并更新服务工作者时,下一页加载会引发错误,因为服务工作者提供的捆绑文件不再存在。再说一遍,我可以加载站点,www.example.com
但如果我打开一个新选项卡并加载,www.example.com/test
我会收到未捕获的语法错误。
关于我的设置的一些注意事项。
我在 CloudFront 中创建了一个设置
Minimum and Maximum TTL
为service-worker.js
to的行为0
。对于我
sw-precache-config.js
的,这是我的设置:
module.exports = {
staticFileGlobs: [
'build/index.html',
'build/static/css/**.css',
'build/static/js/**.js'
],
swFilePath: './build/service-worker.js',
stripPrefix: 'build/',
handleFetch: false,
runtimeCaching: [...]
}
- 当我在构建后加载第一页时,对于 index.html,我看到以下响应:
Status Code: 200 OK (from ServiceWorker)
我的假设是我希望 service worker 不缓存 index.html 文件。但如果我这样做,我会不会失去我的离线功能?我是否应该为 index.html 设置一个 runtimeCachingnetworkFirst
以便我可以随时请求它但在离线时回退到缓存?如果是这样,那会是这样吗:
runtimeCaching: [
urlPattern: '/index.html',
handler: 'networkFirst'
]
我尝试过但对我不起作用的一些事情包括在发生这种情况时向用户显示一条消息以重新加载(技术上可行,但用户体验不是最佳的)。还查看了skipWaiting: false
选项,但在新版本中一直看到相同的错误。