在部署时使Google云功能的Firebase缓存无效

在部署时使Google云功能的Firebase缓存无效,firebase,caching,google-cloud-functions,firebase-hosting,server-side-rendering,Firebase,Caching,Google Cloud Functions,Firebase Hosting,Server Side Rendering,我最近使用云功能和Firebase托管实现了SSR 构建JS包时,它会收到一个缓存突发后缀(main.1.JS) 在我的函数中,我有下面一段代码用于缓存云函数的结果 res.set('Cache-Control', 'public, max-age=300, s-maxage=300'); 在部署期间,我首先部署托管,然后部署云功能 firebase deploy --only hosting:production && gcloud functions deploy ssr

我最近使用云功能和Firebase托管实现了SSR

构建JS包时,它会收到一个缓存突发后缀(
main.1.JS

在我的函数中,我有下面一段代码用于缓存云函数的结果

res.set('Cache-Control', 'public, max-age=300, s-maxage=300');
在部署期间,我首先部署托管,然后部署云功能

firebase deploy --only hosting:production && gcloud functions deploy ssr --runtime nodejs8 --trigger-http --source dist/server
firebase宿主部署将
main.1.js
替换为
main.2.js

由于缓存崩溃,文件现在不同了(
main.2.js
),但由于云函数又被缓存了5分钟-我在访问网站时出错(因为缓存版本的函数中引用的
main.1.js
不再可用)


您将如何解决这样的问题?我可以拥有两个活动部署并逐个激活吗?

缓存控制头
public,max age=300,s-maxage=300
告诉处理请求的任何一方(主要是用户的浏览器和Google的CDN服务器,但也可以是用户使用的代理)如何缓存请求。根据您的配置,两者都将缓存文件5分钟。您无法更改此行为,因为无法使CDN服务器的缓存无效,而且浏览器也不知道您的部署情况,即使收到通知并重新加载,也会从CDN中获取相同的过期文件

我不完全理解您的用例,但以下是可能的解决方案:

  • 确保不要删除旧文件,因此您需要将任何版本的
    main.x.js
    保留至少一段缓存时间。您可以使用云存储在部署时上载文件
  • 将回退添加到客户端。如果
    main.1.js
    给出一个404,则增加该数字,然后尝试
    main.2.js
  • 保持名称稳定,例如
    main.js
  • main.js
    的内容添加到云函数的响应主体中。通过这样做,您可以确保云函数响应和
    main.x.js
    的内容一起缓存并重新加载
  • 删除缓存控制头。这将导致您的功能上的更高流量,从而导致更高的成本
  • 还可以在部署时更改函数名或其重写,以导致缓存未命中

1。使用云存储使两个版本保持活动状态是一个好主意,但我们目前将静态文件部署到Firebase主机,我很想知道我是否可以在Firebase主机上实现这一点。2.递增不起作用,因为实际文件名中有哈希。3.这将防止我在客户端缓存上进行缓存爆破,我的用户需要很长时间才能获取最新的文件。4.这看起来很有趣。我会试试的,谢谢!5.这就是我们现在所拥有的。我很想利用缓存。6.我不太明白。你能详细说明一下这会有什么帮助吗?你需要改变你的系统设计。没有本机解决方案,因为不能影响缓存。将脚本添加到云函数响应中如何?是的,正如我在上面的评论中提到的,这可能是解决此问题的一种有趣的方法。抱歉,我错过了评论未展开的消息!我的错:)大约6:你可以用与main.js文件相同的方法来破坏缓存的云函数。如果更改云函数的名称,将导致缓存未命中。这将使维护更加复杂。或者,您可以在firebase.json中定义云函数的重写(您很可能已经这样做了)。更改重写名称将产生相同的效果:部署后缓存未命中