在部署时使Google云功能的Firebase缓存无效
我最近使用云功能和Firebase托管实现了SSR 构建JS包时,它会收到一个缓存突发后缀(在部署时使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
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
- 将回退添加到客户端。如果
给出一个404,则增加该数字,然后尝试main.1.js
main.2.js
- 保持名称稳定,例如
main.js
- 将
的内容添加到云函数的响应主体中。通过这样做,您可以确保云函数响应和main.js
的内容一起缓存并重新加载main.x.js
- 删除缓存控制头。这将导致您的功能上的更高流量,从而导致更高的成本
- 还可以在部署时更改函数名或其重写,以导致缓存未命中