从firebase函数部署到firebase主机

从firebase函数部署到firebase主机,firebase,firebase-hosting,google-cloud-functions,Firebase,Firebase Hosting,Google Cloud Functions,是否可以将静态资产从firebase功能部署到firebase主机 用例:包含静态html文件的博客。博客内容和元信息将存储在数据库中(内容为降价)。发布或更新时,会触发firebase函数,该函数解析标记并为博客文章生成静态html文件,并将其部署到firebase主机。部署后,该函数将在数据库中存储实时URL 这个工作流程可行吗?在当前文档中,我找不到任何关于函数部署的信息 作为一种解决方法,我可以想象travis ci的设置。该函数触发travis上的重建,travis构建静态资产并将其部

是否可以将静态资产从firebase功能部署到firebase主机

用例:包含静态html文件的博客。博客内容和元信息将存储在数据库中(内容为降价)。发布或更新时,会触发firebase函数,该函数解析标记并为博客文章生成静态html文件,并将其部署到firebase主机。部署后,该函数将在数据库中存储实时URL

这个工作流程可行吗?在当前文档中,我找不到任何关于函数部署的信息

作为一种解决方法,我可以想象travis ci的设置。该函数触发travis上的重建,travis构建静态资产并将其部署到firebase主机,但这似乎是一个巨大的开销


我也可以从数据库中提取降价内容并在客户端上构建,但出于初始加载时间的原因,我真的很喜欢尝试静态文件方法。

我一直想这样做很长一段时间了,似乎随着新发布的。。。好吧,我们还是不能做我们想要的。但是我们可以接近

如果您阅读上面的文章,您可以看到我们现在如何编辑
firebase.json
重定向URL以指向firebase函数,该函数可以从firebase中存储的标记构建页面并将其提供给客户端

问题是,这发生在每个页面的每个
GET
请求上。这是愚蠢的(对于一个基本上是静态的页面,比如一个典型的博客)。我们希望静态页面立即可用,而无需等待函数生成任何内容(即使发生得非常快)。我们可以通过使用
响应
对象将
缓存控制
头设置为任意大的数字来缓解这种情况,如中所示

res.set('Cache-Control','public,max-age=600,s-maxage=31536000');

这将告诉浏览器将结果缓存10分钟,但CDN将其缓存一年。这几乎解决了除了第一次点击外,所有用户都需要预渲染的即时可用页面的问题,这将导致渲染成本。此外,如果CDN确定没有足够的流量来保证存储缓存内容,它可以收回缓存内容

越来越近了

但我们还没有达到我们需要的程度。假设你发布了你的帖子,几天后,你注意到了一个打字错误?嗯,我想你差不多被水淹没了。除非您执行以下操作,否则您的缓存内容将在今年剩余时间内继续提供:

更改帖子的URL——这可能是个坏主意,因为它会破坏任何SEO,并破坏已经存在的页面链接

可能有一种方法可以强制CDN更新,可能是通过增强“发布博客帖子”过程,在请求头中包含一个javascript
GET
请求,或者有一种方法可以在帖子更新时使用firebase函数进行更新。这就是我被卡住的地方

Firebase使用Google的云平台CDN,其中包括一个用于的机制,但我不知道这是否可以从函数中轻松获得——即使可以,它仍然无法解决从缓存中被逐出的问题

就我个人而言,我可能会使用我描述的设置,使用中间长度的CDN缓存年限限制。这胜过了我目前使用(优秀的)shodown.js向客户端发送标记并在本地渲染的方法,shodown.js仍然非常快,但确实需要客户端javascript和一些cpu周期


希望有人能解决这个问题(或者firebase的某个人可以悄悄地将托管从函数推到下一个版本:)。如果我确定了答案,我会更新我的答案。

我还没有完全调查过这一点,但我想知道这是否就是你想要的:

git克隆 firebase托管部署文件cd firebase托管部署文件npm 安装

执行一次试运行,确保您没有做一些您会后悔的事情node deployFile.js contentsite/index.html

执行real node deployFile.js contentsite/index.html提交的删除操作


我还没有尝试过这一点,但我希望您的云功能可以将新的静态文件部署到firebase主机上


在一些测试之后,我将用函数代码和教程更新这个答案。

我真的不想在重建时弄乱缓存。应用程序应该尽可能简单:监听firebase数据库的更新,重新生成静态html,完成。尽管您的解决方案可能有效,但我会等待适当的集成来尝试。在那之前,我选择一个节点/快速服务器来进行传递、监听和重新编译。@PhilippGfeller三年后,你解决过这个问题吗?我也处于类似的位置,不知道下一步该怎么办。嘿@Leads,不幸的是我没有。最后我换成了heroku主持。然而,我目前正在研究Netlify。他们甚至为免费层提供了非常好的服务-也许这对你来说是一个很好的解决方案。我刚刚尝试了一下,并成功地让它工作了-当对数据库进行更改时,我有一个函数触发此脚本,它更新了云托管中的文件。需要注意的一件事是,如果您也从命令行部署到云主机,您将覆盖自动部署到其中的任何更改。是否有任何与此相关的更新?我觉得那里的文档不是很简单