13

是否可以将静态资产从 firebase 功能部署到 firebase 托管?

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

这种工作流程可行吗?在当前文档中,我找不到任何关于 deploy from functions 的信息。

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

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

4

3 回答 3

3

我一直想做这个很久了,似乎有了新推出的Firebase Functions Hosting Integration ……好吧,我们仍然不能完全按照我们的意愿去做。但我们可以靠近

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

问题是,这发生在GET每个页面的每个请求上。这是愚蠢的(对于像典型博客这样的大部分静态页面)。我们希望静态页面可以立即可用,而无需等待函数生成任何东西(即使这发生得非常快)。我们可以通过将Cache-Control标头设置为任意大的数字来缓解这种情况,response

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

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

越来越近。

但我们并不完全是我们需要的地方。假设您发布了您的帖子,几天后,注意到一个错字?好吧,我认为你已经很兴奋了。除非您执行以下操作,否则您的缓存内容将在今年剩余时间内继续提供:

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

可能有一种方法可以强制 CDN 更新,可能是通过扩展您的“发布博客文章”流程以GET在请求标头中包含一个带有奇怪内容的 javascript 请求,或者可能有一种方法可以随时使用 firebase 函数进行更新帖子得到更新。这就是我卡住的地方。

Firebase 使用 Google 的 Cloud Platform CDN,其中包含一种Cache invalidation机制,但我不知道这是否可以从函数中轻松获得——即使是这样,它仍然无法解决从缓存中逐出的问题。

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

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

于 2017-05-23T01:06:26.370 回答
2

我还没有尝试过,但我希望您的云功能可以使用Hosting REST API将新的静态文件部署到 Firebase 托管。

经过一些测试,我将使用功能代码和教程更新此答案。

于 2019-08-14T12:24:01.213 回答
0

我还没有完全调查这个,但我想知道这是否是你正在寻找的:

https://gist.github.com/puf/e00c34dd82b35c56e91adbc3a9b1c412

git clone https://gist.github.com/e00c34dd82b35c56e91adbc3a9b1c412.git firebase-hosting-deploy-file cd firebase-hosting-deploy-file npm install

进行试运行,确保你没有做你会后悔的事情 node deployFile.js contentsite /index.html

删除真实节点 deployFile.js contentsite /index.html commit

于 2019-03-02T16:55:09.607 回答