我一直想这样做很长一段时间,似乎与新揭幕Firebase Functions Hosting Integration ......好吧,我们仍然不能做到我们想要的。但我们可以得到关闭!
如果你按照上面的文章阅读,你可以看到我们现在如何编辑firebase.json
重定向一个URL指向一个firebase函数,它可以从存储在firebase中的markdown构建页面并将其提供给客户端。
事情是,这发生在每个页面的每个GET
请求上。这是愚蠢的(对于像一个典型的博客一个基本静态页面)。我们希望立即可以使用即时的静态页面,而无需等待函数生成任何内容(即使这种情况非常快)。我们可以减轻由在
res.set('Cache-Control', 'public, max-age=600, s-maxage=31536000');
它会告诉浏览器缓存结果10分钟的Cache-Control
头与response
对象设置为任意数量众多,但CDN缓存它的年。这几乎解决了除了第一次打击之外,想要预先渲染,即时可用的页面的问题,这将导致渲染成本。另外,如果CDN确定没有足够的流量来存储它,则可以将缓存的内容逐出。
靠近。
但是我们并不是很需要的地方。假设你发布你的帖子,并在几天后,注意到一个错字?好吧,我认为你几乎被洗净了。您的缓存内容将在今年余下时间继续提供服务,除非您执行以下操作:
更改帖子的网址 - 这可能是一个坏主意,因为它会将任何搜索引擎优化和连结断开已经在野外。
可能有办法强制CDN更新,也许是通过增加“发布博客帖子”流程来在请求头中包含一个带有奇怪内容的javascript GET
请求,或者有一种方法可以实现每当帖子更新时,都会有一个火力点功能。这是我卡住的地方。
Firebase使用Google的云平台CDN,其中包含Cache invalidation的机制,但我不知道这些功能可以轻松地从功能获得 - 即使它的确如此,它仍然无法解决从缓存中被逐出的问题。个人而言,我可能会使用我所描述的设置和中间长度的CDN缓存年龄限制。这胜过了我当前使用(优秀)showdown.js向客户端发送markdown并在本地渲染的方法,该方法仍然非常快,但确实需要客户端JavaScript和几个cpu周期。
希望有人会有解决这个问题的方法(或者firebase中的某个人可以将功能托管到下一个版本:))。如果我确定了它,我会更新我的答案。
我真的不想在重建上弄乱缓存。应用程序应该尽可能简单:侦听Firebase数据库的更新,重新生成静态html,完成。尽管你的解决方案可能正在工作,但我会等待适当的整合来尝试一下。在那之前,我正在选择一个节点/快递服务器来完成交付,收听和重新编译。 – phippu