Firebase-tools: 通过prerender.io使用托管

创建于 2014-10-10  ·  93评论  ·  资料来源: firebase/firebase-tools

你好

我想知道是否有办法将Firebase托管与prerender.io之类的服务结合使用?
这样,就有可能部署具有SEO功能的Web应用程序(即angularjs应用程序)。

谢谢

question

最有用的评论

只是想快速发出提示音,所以我们肯定已经将其告知我们。 这很重要,但是其他很多事情也是如此(如加藤列举的)。 我们对解决此问题的一些好方法有一些想法,但是它们有一些依赖关系,我们必须首先解决。 尝试保持耐心,并知道这绝对在我们的脑海中!

所有93条评论

你好

目前,Firebase Hosting的重写/重定向规则不够详细,无法提供预渲染服务,但是我们的一些客户已经成功使用html5 pushState将预渲染步骤构建到了相当静态的网站的构建过程中。 他们基于单个页面应用程序预渲染每个页面,以便将正确的内容提供给搜寻器,然后,如果用户导航到另一个页面,则网络应用程序将接管并重新渲染而不刷新页面

这显然很复杂,而且显然不理想,但是我们正在努力减轻痛苦点

希望有帮助

克里斯

我知道只有两个月了,但是有没有更新? 由于你们现在归Google所有,我假设他们希望由firebase托管的网站能够由其搜索服务编制索引。

目前,我们对此没有任何具体更新,只是SEO对我们显然很重要,并且使Firebase Hosting与开发人员相关。 我希望尽快为您更新

嗨,大家好! 我只是想知道此更新的状态是什么? 很快会来吗? 我使用Firebase托管,唯一令人关注的是SEO,我的网站没有出现在Google的任何地方,我也搜索了与Firebase的seo集成,但找不到任何解决方案。 我真的很想将所有内容都保存在一个地方,因此更改为可以将我的页面投放到Google的搜寻器引擎的其他服务将是可耻的。 因为我知道Firebase现在归Google所有,所以这将是一个巨大的改进。 谢谢!

仍然对此服务感兴趣。 谢谢!

将我的声音添加到线程中-拥有此功能真是太好了!

+1

我也在等待这个。

作为替代方案,我正在研究使用https://divshot.com + firebase。

+1

由于最近宣布了DIvshot和Firebase合并,因此该问题再次出现。 我实际上已经转移到Divshot,以利用免费的自定义Domain和prerender.io功能。 fireabse将如何处理这些问题? 您是否要将自定义域添加到免费套餐? 那prerender.io呢?

我们正在研究将JS预渲染引入Firebase Hosting的方法,但目前尚无任何共享的坚定计划。 (个人说明:我真的很想看到它发生)。

由于Firebase认为所有站点都应仅使用HTTPS,因此我们代表用户管理SSL证书设置。 这样做的成本使我们无法提供免费的自定义域托管。

感谢您的快速回答(双关语)。

静态Web应用程序托管平台不仅仅需要某种SEO功能,因此我只希望你们能够设法在12月中旬之前使该功能正常工作,否则很多开发人员将需要切换到老式托管提供商(不幸的是,包括我在内) )。

第二个答案很合理,我认为只是跳上付费级别,可惜没有提供相同的额外扩展。

100%的Firebase托管站点都位于Fastly的快速CDN中。 即使使用免费计划,您也可以获得Divshot高性能计划的所有好处(只是不在定制域上)。 至于带宽,10GB最终是静态网站的一大段带宽。

我需要承认,我还没有谈到Divshot的高性能津贴。 无论如何,我可能需要迁移我的应用程序并准备一个后端(并延迟新功能!),这是一个耻辱,而CS学位几乎吞噬了我的全部时间。 虽然我的项目并不是说其他​​先进的项目可能会遭受巨大的延误,所以我再次希望Firebase能够帮助我们变得对SEO友好,或者Divshot可能会延迟其关闭。 我知道这可能不是一个选择,但是如果我们中的一些人会迁移,他们可能永远也不会回来。

恭喜@mbleigh的收购!

@DamodarSojka ,我完全同意你的看法。 我是现有的Divshot付费用户。 对于在Facebook上营销/共享我的网站,必须进行预渲染。 如果Firebase不久不提供此功能,则我将不得不迁移到其他Web托管服务。

+1表示SEO功能

我们还向Divshot客户付款,因此Prerender支持对于我们是必要的。 Divshot上的Prerender支持不是理想的(因为共享后的production.blabla.divshot.io URL),但是如果Firebase上根本没有Prerender支持,我们将无法使用它。 谢谢。

同样,无论您使用的是prerender.io还是其他类似的解决方案,SEO都至关重要。 需要在divshot关闭之前在Firebase上解决此问题。

Yup仍然对Seo遇到麻烦

+1-付费的Divshot客户将需要Prerender支持才能迁移到Firebase。

Completley同意。 如果Firebase没有预渲染功能,则它不是Divshot的替代品。 我是Divshot付费用户。 随着两个月的Divshot通知关闭。 我应该在迁移到另一个服务上工作吗? 我是否需要花时间配置服务器? 还是继续专注于我在做什么? 这不是服务的主意吗? 不必处理服务器问题? 请解释说Firebase是12月14日的选择,还是我应该花点时间配置服务器。

Gents,Mike已经全面说明了此功能的状态:我们正在研究将JS预渲染引入Firebase Hosting的方法,但目前尚无任何共享的坚定计划。 (个人说明:我真的很想看到它发生)。

没有时间表。 我们和您一样想要它。

您必须自己决定应该做什么。 我们没有公开的路线图。 无论需求或查询的数量如何,我们都无法在任何时间轴上做出任何保证。 抱歉,这不是满意的蓬松答案,但希望现实的答案对您的计划更有用。

Ka加藤

很高兴看到您真正关心它:)谢谢大家!

@mbleigh / @katowulf有关将JS预渲染引入Firebase的计划的一个问题:Firebase当前提供的SEO支持如何更好地实现JS预渲染?

根据这个答案,Firebase自ng-conf 2015起就已经提供开箱即用的SEO。

因此,我仍然不愿意在Firebase上使用Prerender.io。

@douglascorrea对于Google SEO的改进是微不足道的,但是(事实证明)Google并不是唯一的爬虫:smile:

这样做的最大好处是希望为Facebook OpenGraph标签,Twitter卡和非Google搜索引擎提供更好支持的网站。

谢谢@mbleigh ,它使事情变得清晰起来,使我认为我们真的想要这种支持,或者像@drtriumph在他的评论中所说的某种替代方法。

我在寻找解决方案时,发现以下可能对其他读者有用的详细信息:

  • 2015年10月,Google不建议使用_escaped_fragment_和hashbang(!#)。 因此,对于Google而言,每个SPA都应使用html5 pushstate(angularjs上的html5mode)。 但是他们将继续支持hashbang(!#)并将其翻译成转义的片段一段时间。
  • Facebook和其他爬虫可能仍然需要escaped_fragment,Facebook自动将hashbang转换为_escaped_fragment表示法。 可能是其他爬虫所做的相同,因为这是Google先前的建议。
  • 由于Firebase尚不支持基于User-Agent的重定向,因此我们的希望仍然是爬虫将hasbangs(!#)转换为escape_fragament,如下所示:
    如果您的网址如下所示:
    http://www.example.com/#!/user/1
    然后像这样访问您的URL:
    http://www.example.com/?_escaped_fragment_=/user/1

因此,一会儿,解决这个问题的一个主意可能是:

  • 不要使用html5 pushstate(Angular上的html5模式),而应使用hashbang(!#)
  • 使用prerender.io为应用程序中所需的每个页面创建静态/缓存版本(如正常的prerender进程)。
  • 开发一个插件,该插件将缓存版本存储在以文件夹?_escaped_fragment_=开头的文件夹结构中,并创建以下文件夹:
    如果您的网址如下所示:
    http://www.example.com/#!/user/1
    生成的文件夹将是
    ?_escaped_fragment_= +- /user +- /1

其中1个文件将是实际的html文件。

  • 使用firebase-tools将该文件夹部署到您的根firebase文件夹中(此过程可以在cron作业中自动执行)。

我认为它将如何工作:

  • 搜寻器看到您的hashbang网址时,将尝试访问?_escaped_fragment_= URL。 由于这些文件夹上有实际的HTML文件,因此Firebase将提供服务,而不重定向到index.html,因此,搜寻器读取的HTML将是缓存的版本,而不是AngularJS。

为此,我们需要创建一个计划作业,为每个页面运行预渲染,保存该文件夹并执行Firebase部署。

由于Firebase部署不支持部分部署(同步部署或增量部署),因此我们应在负责此过程的服务器上维护部署的更新副本。

我将尝试进行设置,并通知您是否可行。

您能否允许我们像设置其他标头键一样设置“ X-Prerender-Token” ???
https://www.firebase.com/docs/hosting/guide/full-config.html
https://prerender.io/install-token

+1

@ srk9,请提交一个单独的问题,而不是重新使用此线程。

为什么关闭此问题? 我看不到解决方案。

@douglascorrea ,您的想法发生了什么?

谢谢,
-D

@bethuneco ,您好,很抱歉没有在此处发布结果。

实际上我本来要写一篇文章,但是后来我意识到此解决方案将包含很多“机械”,以使其能够在生产中使用,并且我对“推荐”它感到不自在,因为我不知道该如何做。它会大规模地运行。

但是基本上,正如我之前所描述的,我需要一个“部署/提交”服务器,对于每次部署,都要预先渲染/剪贴所有页面并将结果HTML存储在上述文件夹中(/?_ escaped_framgment_ / xxxx)。 这些“实际的/物理的” htmls将是我们的“呈现”页面。

因此,每次google / facebook / twitter搜寻器访问我们的页面并通过“?_escaped_fragment”前缀请求“转义的片段”时,它实际上将指向具有实际HTML的真实文件夹,然后这些HTML将被索引。
当实际用户访问应用程序时,他们将不会使用?_escaped_fragment,因此他们将收到动态页面。

问题是这种“解决方案”是我们需要继续为每个页面或附加页面生成HTML。 例如,如果您的应用程序是简单的CMS,则对于每个新的帖子/文章/页面,您都需要运行该过程以生成新的HTML页面。 但是,例如当我们谈论一个动态的社交网络时,问题将变得更大,在这种情况下,每个用户可以生成数百个“可渲染的”页面,那么您的渲染/内部爬网程序应该一直运行。 而且,在现实世界中,这可能是一个障碍。

这是一个非常“技巧性”的解决方案,可以在小型应用程序中使用,但不适用于真正的大型应用程序,因为当爬网程序运行时我们实际上是在生成HTML,而不是自动将爬网程序重定向到我们的预渲染服务,该服务会在线进行预渲染(例如正常的预渲染过程是)。

因此,到目前为止,我们应该使用Nginx服务器作为静态服务器来进行预渲染,或者使用Divshot竞争对手(如https://www.netlify.com/)为单页应用程序提供现成的Prerender 。

@douglascorrea

感谢您的扩展解释。 您是第一个提到Netlify的人,因此我将对此进行调查。

没错,预渲染所有内容仅适用于小型站点。 幸运的是,我的应用程序很小(最多约1200页),因此可以正常工作。

最简单的解决方案(也是Google所避免的一种解决方案)是渲染Java脚本,并在检测到机器人用户代理时提供HTML。 Google已经展示了在浏览器之外进行渲染,因此从技术上来讲这并不困难。 对于他们来说,这在战略上具有挑战性,因为它似乎可以帮助广告业务中的竞争对手。

如果我有工作,我会在这里发布更新。

让我在这里为可能感到困惑的任何人提供一些说明:

Firebase Hosting是否支持服务器上的JS预呈现? 不,不是。 我们希望支持服务器端预渲染,这是我们的长期规划,但是目前尚无具体日期或时间表。 我们知道这是一个痛点,特别是对于那些使用Facebook共享或Twitter卡的人,我们希望将来能够分享更多有关此的信息。

您不能仅支持X-Prerender-Token吗? 不,那是行不通的。 预渲染必须在?_escaped_fragment_= URL上提供实际的已渲染内容_,这意味着它不仅是标头,还必须是服务器必须知道并正确处理的内容。 没有我们所希望的一半解决方案。

什么样的预渲染是可能的? 目前,您唯一可以做的真正的“呈现”是静态站点编译。 通常,这可以通过Jekyll之类的工具来完成,但是当然可以在本地使用无头浏览器来“呈现”动态网站。 您必须详尽地呈现每个URL,然后进行部署,因此,目前这并不是一个奇妙的用例。 还要注意,用?_escaped_fragment_命名的文件名是不可能的,因为CDN会删除查询参数,并且通常不支持这种用例。

Google采取这种策略性措施来阻止其他搜寻器崩溃吗? 不,绝对不是。 我们强烈希望支持通过预渲染Firebase Hosting带来的优势。 这只是时间和资源的问题。

由于社交媒体标签/替代性SEO问题,我不得不从Firebase托管中切换。 当非技术人员注意到我们的链接上没有互联网上其他所有人的漂亮照片时,这是一个交易突破。

您可以使用phantomjs和预渲染中间件进行预渲染。 它是开源的并且可以正常工作,但是我选择了prerender.io来避免操作。 第一次请求时有点慢,但是您可以通过抢先请求每个页面来缓存页面。

也可以请求所有页面,因为这样您就可以对它进行一些测试,解析html以确保标记和内容正确呈现。

有一个很大的警告。 Prerender不适用于实时Firebase数据。 怎么可能 Firebase数据是实时的,连接是持久的。 Prerender是一次性的,连接已关闭。 由于无法计算请求,因此无法判断页面何时完成渲染。

我有几个想法可以解决此问题:

  1. 每个.on("value") firebase订阅都发出GET请求。 是预渲染请求时跳过订阅。 如果是普通用户,则跳过GET请求。 这不适用于.on("child_*")事件。
  2. 将主条目文件顶部的全局prerender标志设置为false ,然后在每个页面组件加载数据后将标志设置为true 。 通过适当的设计,通常会有一个_loading state_,_error state_和_success state_,因此在错误/成功状态帮助器方法中,将标志设置为true

这很痛苦,但是只有少数动态页面无法正确呈现,需要特殊处理。 我仍然认为静态收益大于成本。

@mbleigh期待你们将来会想到什么。 无论如何,我确定加入google肯定会退后一步,前进两步。

真的希望有一些解决方法。 我需要后端的唯一原因也是Twitter卡和opengraph。 当然,后端还为单页应用程序提供了其他好处,例如同构渲染,但这真是太好了。 Twitter和OG标签对于需要共享的任何应用程序都很重要。

可能会存在某种类似于重写的规则,该规则会命令Firebase后端从数据库中提供该对象或该对象/ html?

这样的对象可以预先准备好,因为每次共享都从以下位置开始:访问URL或首先通过“共享”按钮。

碰碰..我只是被Firebase惊呆了,然后意识到我无法使用它,阅读了这些评论。
因为我还需要类似Prerender的服务才能工作。 那么,这方面的发展如何?

一起把它带到谷歌! 您是freegin的搜索引擎! :笑:

认真地。 这太重要了。 这可能只是该死的最重要的事情。

我知道这是在开玩笑,但是要指出一点,这句话是针对Google搜索还是针对Google Firebase? 其中只有一个是搜索引擎,只有其中一个提供Firebase Hosting(尽管预编译网页并不完全是它们的职责范围,尽管Hosting显然具有附加值,可以与提供此功能的工具一起更好地工作)。

在相关的内部整理记录中,它也与Firebase工具(即此OSS问题跟踪器)无关。 我会确保将您的投票添加到优先级讨论中; 邮件列表可能是将来与核心功能请求联系的最佳位置。

最重要的是,我们没有忘记这一点。 这对我们仍然很重要。 与集成Google Cloud Functions并通过分析,崩溃报告和测试实验室提供扎实的见解相比,它的重要性要小一些,但仍然很重要。

在接下来我们讨论优先级时,我将再次提出。 非常感谢您在反馈中加入您的声音。 ☼☼☼

感谢您在firebase @katowulf上的努力!
这是唯一让我无法将firebase用作ng1应用程序的“主机”的唯一功能。

您并不孤单。 其他人也遇到了相同的限制。 请注意,由于Google现在可以为JavaScript生成的内容建立索引,并且有一些特殊的条款可以为Firebase内容建立索引,因此加载到您网页中的未经身份验证的Firebase数据应该已经被建立索引了。 但是,全面的预编译器支持正在兴起。

@katowulf就像提示一样(如果您还不知道或没有看到),但是主要的问题不是Google搜寻器。 我想人们已经知道,如果使用Prerender之类的东西。 诸如LinkedIn,Facebook,Twitter等其他爬虫不满意。 他们想要静态内容

@samvloeberghs但是,我认为Google提供此支持的含义是其他人可能会效仿。 因此,我打算暗示这是朝着正确的方向迈出这一一步的第一步(并且至少今天它可以与Google一起使用)。

FB / LinkedIn / Twitter不太可能会跟随Google像我们期望的那样快速前进。 后面总会有一个主要参与者,我们根本不能忽略它。 另一方面,谷歌正在通过开发NG2来解决该问题,NG2将使用Angular Universal进行服务器端编译:)👍

急救! 等等,您是说机器学习不能解决所有这些问题吗?

为了提供我的2美分,我发现客户似乎对社交媒体卡的重视程度至少与SEO一样高。 从最近的项目来看,Twitter / Facebook已经成为品牌通过共享网站链接来提升自己的主要方式。

显然,SEO仍然很关键,但是攻击社交媒体卡会是一个更简单/短期的解决方案吗? 由于网卡只是元标记,您能否在firebase.json中定义结构(类似于安全规则)? 然后,Firebase可以为twitter / facebook爬虫注入正确的meta标签,尽管我确信这不是那么简单。

无论如何,非常感谢您的出色工作和社区的支持。 期待一些更令人兴奋的Firebase功能(云功能👍!)。

@katowulf ,我的评论比其他任何事情都更有力……你们正在做一些了不起的工作! 我将把更多的兴趣引向整个Google。 但是,我确实认为Firebase是Google *的新部门,应该拥有整个“ SPA / PWA-SEO页面呈现”问题。

我对此的想法是...

无论Google向世界推出什么产品,都应能与我们今天使用的所有平台完美兼容,并成为能有效工作并反映其原始产品Google搜索的示例。

SPA已经存在了一段时间。.Google有两个[Angular]和[Polymer]。 在其中实现SEO(元标记/ OpenGraph /架构)是一个主要的黑匣子(除非您是后端忍者)。 好消息是Google搜索开始处理JS,但这绝对只是成功的一半(也许更少)。

作为后端即服务(BaaS)的Firebase似乎是完美的新Google *组,可以真正使整个SPA页面呈现变得顺畅。 我知道你们会解决这个问题,但是我强烈认为这应该属于关键/最优先的功能。

想象一下阅读此标题...

火星礼物...
开箱即用的适用于所有单页应用程序(SPA)和渐进式Web应用程序(PWA)的全新和改进的SEO!

开发人员会蜂拥而至:+1:

只是想快速发出提示音,所以我们肯定已经将其告知我们。 这很重要,但是其他很多事情也是如此(如加藤列举的)。 我们对解决此问题的一些好方法有一些想法,但是它们有一些依赖关系,我们必须首先解决。 尝试保持耐心,并知道这绝对在我们的脑海中!

好吧,这令人失望。 我现在发现自己正在寻找Firebase替代品...

已经快三年了...

这事有进一步更新吗.. ?

既然Firebase拥有divshot,现在应该行不通吗? 更新PLZ!

我们非常了解对这种功能的需求,因此在此处提供一些更好的解决方案是我们的优先考虑。 我仍然没有任何时间表可以宣布,但是我们并没有忘记你们。

+1

:( :( :(

我们得出了类似的结论。 你还看到了什么? ;)

我只是使用Firebase Functions作为共享链接端点,然后使用JavaScript重定向一个链接。

您可能已经看到或可能没有看到,但是Cloud Functions现在已与Firebase Hosting集成

这可以被视为我们使用Firebase Hosting进行服务器端渲染的规范解决方案。 请享用!

@mbleigh好的,所以如果我有一个带有如下元数据的全局头文件,目前不会在前端复制它。 如果我安装了Cloud功能,那么我仅需要打开此功能。

<meta name="description" content="{{ pageDescription }}">

太好了,谢谢您的更新。

2017年5月17日下午5:39,“ Michael Bleigh” [email protected]写道:

您可能看过或未看过,但是现在集成了Cloud Functions
使用Firebase托管https://firebase.google.com/docs/hosting/functions
!!!

这可以被视为我们对服务器端渲染的规范解决方案
与Firebase托管。 请享用!

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-302268864
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbtWCdygdw4ozixK5_XcL2Dlznp4Jks5r65M-gaJpZM4CtPYG

我意识到这可能不是这些评论的最佳问题,但是Google搜索我的问题确实使我想到了它,而且似乎有一些积极的讨论,请原谅我!

我很想解决在Firebase上托管的SPA中为社交网站呈现开放​​图形模板的问题,这是通过用户代理实现负载平衡的能力。

我希望能够使用云功能从memcache / cloudsql中提取一些模板数据,并将模板标签呈现到请求的社交平台,但对于所有其他客户端,则回落到静态托管。 这样,我们就不需要为所有请求提供完整的服务器端渲染。

@cdharris总共,ATM将所有请求重写为我尝试使用window.location进行静态重定向的其他重定向(用于客户端/访问者)的功能,出于我的SEO目的,它不起作用,也许为了社会目的。

@mbleigh是否有任何选项可以重写来自爬网程序/社交的请求,以区别于客户端/访问者? 我已经使用_escaped_fragment_以及其他glob表达式进行了测试...没什么= /预先感谢

在firebase函数中做出退货决定可以起作用。 我们可以说:需求来自Facebot吗? 然后返回这些打开的图形标签。 如果不是,则返回index.html。 但是,如何从firebase函数返回darn index.html?

fs.readFileSync('./ index.htm')

2017年9月13日,上午4:34,“ Birowsky” [email protected]写道:

在firebase函数中做出内容决定是可行的。 我们可以说:
需求来自Facebot吗? 然后返回这些打开的图形标签。 如果不,
返回index.html。 但是,我该如何从
firebase功能?

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329140134
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbrXQNbVMhRmeZQTbx3Z3vi0c1HXTks5sh728gaJpZM4CtPYG

@megamindbrian是否暗示这些功能可以访问托管文件? 它记录在任何地方吗? 还是谢谢!

是。 这就是我记得使用它的方式,这是我尝试查找文档的好问题。

2017年9月13日上午7:09,“ Birowsky” [email protected]写道:

@megamindbrian https://github.com/megamindbrian是否暗示
功能可以访问托管文件? 它记录在任何地方吗?
谢谢,反正!

-
您收到此邮件是因为有人提到您。

直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329179741
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbobjixHUterg61PAFmLc9v72C7kyks5sh-IogaJpZM4CtPYG

这里一个
https://stackoverflow.com/questions/42960506/how-can-i-read-and-write-to-firebase-storage-from-within-cloud-functions-for-fir

2017年9月13日上午7:09,“ Birowsky” [email protected]写道:

@megamindbrian https://github.com/megamindbrian是否暗示
功能可以访问托管文件? 它记录在任何地方吗?
谢谢,反正!

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329179741
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbobjixHUterg61PAFmLc9v72C7kyks5sh-IogaJpZM4CtPYG

这个使用一个临时目录,但我认为它也可以处理文件
您已与项目一起上传。 这可能是一成不变的,这就是为什么
该示例正在卸载文件以将其保存在其他位置
https://firebase.google.com/docs/storage/extend-with-functions

2017年9月13日上午7:12,“ Brian Cullinan” [email protected]写道:

这里是一个https://stackoverflow.com/questions/42960506/how-can-i-
从杉木的云函数中读取并写入Firebase存储

2017年9月13日上午7:09,“ Birowsky” [email protected]写道:

@megamindbrian https://github.com/megamindbrian是否暗示
功能可以访问托管文件? 它记录在任何地方吗?
谢谢,反正!

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329179741
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbobjixHUterg61PAFmLc9v72C7kyks5sh-IogaJpZM4CtPYG

抱歉,对于功能在概念上如何连接到托管文件,我仍然看不到适当的介绍。 如果您愿意解释,我为您提供了一些要点: https :

我可以看到自己用代码示例来回答这个问题,但目前尚不清楚
在您的函数中,您可以使用文件中的内容进行响应
你的项目? 这不是重定向。
我将挖掘更多代码。

2017年9月13日上午7:18,“ Birowsky” [email protected]写道:

抱歉,我仍然看不到有关功能的正确介绍
从概念上讲已连接到托管文件。 如果您愿意解释,我会
一些要点: https :

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329182385
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbnCSoaKUuVKUnfha5A-4K-p76kZ3ks5sh-QygaJpZM4CtPYG

@megamindbrian我刚尝试fs.readFileSync('./index.html')但不幸的是,文件不存在。 我也希望在一些隐式生成的存储桶中找到托管文件,没有运气。 您将如何进行?

如果将Hosting public目录嵌套在functions目录中,则该目录将可用。

@Birowsky是的,这是我从云函数(例如index.js)读取文件的方式:

const page = fs.readFileSync(__dirname + '/facebook-meta.html').toString();

但是,如果您的项目布局是:

project/
project/src (<- actual source of app)
project/functions ( <- firebase functions)
project/dist (<- build output)

您需要将相关文件从/ dist复制到/ functions

这个问题有3年(到目前为止),到目前为止还算不上运气吗???

可能意味着Google将在支持所有人的中间放弃火力基地
我们的应用程序。

我们针对此类问题的官方解决方案是使用Cloud Functions
对需要静态可见的内容进行服务器端渲染
搜寻器:

https://firebase.google.com/docs/hosting/functions

这是一种更强大,更通用的解决方案,可用于
很酷的东西!

如果您强烈感觉仍有遗漏,请给我们
详细的用例,以便我们考虑如何解决! :)

2017年9月14日星期四,下午3:57 Brian Cullinan [email protected]
写道:

可能意味着Google放弃了火力支持,
我们的应用程序。

2017年9月14日星期四,下午3:52,tofanelli [email protected]
写道:

这个问题有3年(到目前为止),到目前为止还算不上运气吗???

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
<
https://github.com/firebase/firebase-tools/issues/33#issuecomment -329630338

或使线程静音
<
https://github.com/notifications/unsubscribe-auth/AX5XbhBSDSl6TStSv7M02Dx0brb9MOPbks5sia44gaJpZM4CtPYG

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329631266
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAAD_iI6L-yu3RTECI88a2y_ZOzIxdDQks5sia9rgaJpZM4CtPYG

@mbleigh可以在

是的,如果我理解正确的话。 你以前有麻烦吗?

2017年9月14日星期四,下午6:38 Brian Cullinan [email protected]
写道:

@mbleigh https://github.com/mbleigh能否在云服务器上使用云功能
firebase的根目录了吗?

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-329653711
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAAD_g7BV3TMM_5nVX92_-3ai_mZHfHBks5sidUvgaJpZM4CtPYG

@mbleigh

这是一个更强大,更通用的解决方案,可用于各种酷炫的事物!

SSR使我们的系统更加复杂😢
我认为预渲染并非总是如此,而是经常更酷💡
例如,Facebook OGP,Twitter卡,非Google的SEO

@mbleigh @megamindbrian谢谢您的留言。 我已经进行了托管,将每个请求定向到我的函数并响应index.html ,该托管在functions/build/index.html托管给客户端。 但是我不知道如何确认来自FaceBot的请求吗? 我曾尝试使用Facebook调试工具来访问网站的网址,但我想会触发云功能,但事实并非如此。 我对后端开发不熟悉,您能给我一些提示吗? 谢谢。

使用Facebooks工具时,请确保使用读取内容的按钮
预览附近,例如“获取新副本”。

在2017年10月17日星期二上午8:29,Jude [email protected]写道:

@mbleigh https://github.com/mbleigh @megamindbrian
https://github.com/megamindbrian谢谢您的留言。 我有
使我的主机将每个请求定向到我的功能和响应
在functions / build / index.html中托管给客户端的index.html。 但
我不知道如何确认来自FaceBot的请求? 我试过了
使用Facebook调试工具访问我的网站的网址,我认为
云功能将被触发,但不是。 我不熟悉
后端开发,能否给我一些提示? 谢谢。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-337266581
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbrCQ3mowcUnJjWYWsaiScoN1y4l0ks5stMfcgaJpZM4CtPYG

-
机密通知:此电子邮件的内容以及任何
附件仅供收件人使用,并且可能包含
机密和/或特权信息,并可能受到法律保护
从披露。 然后与技术公司,机器人,黑客,
政府机构和营销商。 此消息的安全性为无,
并且可以随时在Instagram上共享。 如果可以的话
请回答。 确实没有任何安全或隐私的地方。 如果
您不同意您可能想去露营并与人们面对面交谈
就像过去一样

您的Firebase日志中是否有任何内容,例如“函数执行已开始”?

在2017年10月17日星期二上午8:37,Brian Cullinan [email protected]
写道:

使用Facebooks工具时,请确保使用显示以下内容的按钮
预览附近的内容,例如“获取新副本”。

在2017年10月17日星期二上午8:29,Jude [email protected]写道:

@mbleigh https://github.com/mbleigh @megamindbrian
https://github.com/megamindbrian谢谢您的留言。 我有
使我的主机将每个请求定向到我的功能和响应
在functions / build / index.html中托管给客户端的index.html。 但
我不知道如何确认来自FaceBot的请求? 我试过了
使用Facebook调试工具访问我的网站的网址,我认为
云功能将被触发,但不是。 我不熟悉
后端开发,能否给我一些提示? 谢谢。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-337266581
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbrCQ3mowcUnJjWYWsaiScoN1y4l0ks5stMfcgaJpZM4CtPYG

-
机密通知:此电子邮件的内容以及任何
附件仅供收件人使用,并且可能包含
机密和/或特权信息,并可能受到法律保护
从披露。 然后与技术公司,机器人,黑客,
政府机构和营销商。 此消息的安全性为无,
并且可以随时在Instagram上共享。 如果可以的话
请回答。 确实没有任何安全或隐私的地方。 如果
您不同意您可能想去露营并与人们面对面交谈
就像过去一样

-
机密通知:此电子邮件的内容以及任何
附件仅供收件人使用,并且可能包含
机密和/或特权信息,并可能受到法律保护
从披露。 然后与技术公司,机器人,黑客,
政府机构和营销商。 此消息的安全性为无,
并且可以随时在Instagram上共享。 如果可以的话
请回答。 确实没有任何安全或隐私的地方。 如果
您不同意您可能想去露营并与人们面对面交谈
就像过去一样

如果我使用浏览器访问网站,则会触发

@judewang看看https://firebase.google.com/docs/hosting/functions#when_is_cached_content_served

对于快速测试,您可以尝试向测试的URL添加一些随机查询参数。

因此,最初的问题是如何使用prerender。 此解决方案不能解决预渲染集成问题,但可以解决单个页面应用程序的开放图。

  1. 在我的构建脚本中,我将public/index.html复制到functions/hosting/index.html
  2. firebase.json我添加了一个重写规则,以指向名为“主机”的云函数
"hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function": "host"
      }
    ]
  }
  1. 我定义了一个名为host的云函数。 在大多数情况下,这只会返回我复制到functions/hosting/index.htmlindex.html文件,但是如果代理是已知的开放图解析器之一,我将基于路线。
exports.host = functions.https.onRequest((req, res) => {
  var userAgent = req.headers['user-agent'];
  if (userAgent.startsWith('facebookexternalhit/1.1') ||
    userAgent === 'Facebot' ||
    userAgent.startsWith('Twitterbot')){

    //getOpenGraph() parses the path, and gets some data from the firebase database to construct open graph data.
    // eg: <meta property="og:description" content="My super cool webpage." /> <meta property="og:title"...

    res.status(200).send(getOpenGraph(req.path));
  }
  else{
    //optional - turn on caching: res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
    res.status(200).send(fs.readFileSync('./hosting/index.html').toString());
  }
});

我认为就是这样。 希望这对某些人有所帮助!

我不得不说这令人失望,新的竞争者对此感到失望,例如https://www.netlify.com/features/ ,这无疑使它对于需要SEO /社交集成的Web应用程序更具吸引力。

Firebase正在将其杀死以用于移动/本地响应,我真的很喜欢将它作为一个平台,但这对于IMO Web应用程序来说是一个很大的缺陷。

通常,我们发现需要预渲染的内容也是服务器端渲染最好的内容(出于性能和首次加载的原因)。 因此,通用预渲染不在我们的近期规划中。

话虽如此,我们正在听有关希望功能集成更灵活以允许“有时”执行功能的反馈。 由于Firebase托管严重依赖CDN缓存,因此从技术上来说,很难实现这种灵活性。 我们将继续听取反馈,并尝试找到使平台更适合您的用例的方法。 :微笑:

Firebase中的UI,用于将功能直接连接到域的前面
名称将解决我的用例。

https://us-central1-...dsaflk; sdafkljsdafkl; jsdf;
lkjsadfkljasdfkljsdaflk.cloudfunctions.net

2018年1月5日星期五,下午3:33,Michael Bleigh [email protected]
写道:

一般而言,我们发现需要预渲染的内容也是
最好通过服务器端渲染(为了提高性能和
首次加载的原因)。 通用预渲染不在我们的近期规划中
为此原因。

话虽这么说,我们正在听有关希望获得
功能集成更加灵活,允许“有时”功能
执行。 由于Firebase托管严重依赖于这种CDN缓存
灵活性很难从技术上实现。 我们将继续
听取反馈并尝试找到使平台更好地适合的方法
您的用例。 😄

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/33#issuecomment-355683821
或使线程静音
https://github.com/notifications/unsubscribe-auth/AX5XbtVDQSPOIAZFyozujQQUektf2WM1ks5tHqM8gaJpZM4CtPYG

-
“我学过工程学”

机密通知:此电子邮件的内容以及任何
附件仅供收件人使用,并且可能包含
机密和/或特权信息,并可能受到法律保护
从披露。 然后与技术公司,机器人,黑客,
政府机构和营销商。 此消息的安全性为无,
并且可以随时在Instagram上共享。 如果可以的话
请回答。 确实没有任何安全或隐私的地方。 如果
您不同意您可能想去露营并与人们面对面交谈
就像过去一样

@mbleigh的立场不是有点反对无服务器的精神,而是使用像Firebase这样的BaaS / FaaS提供程序吗? 在过去几年中,随着SPA趋势的发展,这是一个相当普遍的用例,以至于它被netlify和roast之类的竞争对手解决了。 尽管它们较小,但对于托管主机来说,这样做是有意义的,它提供了更快的加载时间以及关键的可发现性和可共享性。

与其为客户增加可选的预渲染服务,或者至少不为客户增加额外的开发和维护开销,与第三方服务(例如prerender.io)集成的能力将是一项巨大的进步。

Firebase确实是一个很棒的平台,但似乎更面向移动设备,对于我来说,托管是它唯一乏味的部分。

感谢您的及时答复。

@mbleigh

通常,我们发现需要预渲染的内容也是服务器端渲染最好的内容(出于性能和首次加载的原因)。

除了@Pushplaybang的论点外,我

单页面应用程序或应用程序的某些部分必须诉诸某种程度的客户端渲染,但不幸的是,包括Google自己的爬网程序,还无法很好地索引此类页面。 经过数月的失败尝试后,我不得不求助于PrerenderIO,以使google正确地索引我的网站,这迫使我保留基于express.js服务器的方法,____________。

考虑一个网站,该网站具有/product/**.html页面,该页面根据客户端检测到的深层url呈现任何产品。 这种设计的基本原理是,从UX角度来看,即使是考虑到浏览器和CDN缓存,加载产品的实际单独页面也不如加载另一个产品的数据并在更改url时呈现那样平滑。 客户在电子商务网站上进行团购时,大部分时间都花在了产品页面上,并经常通过“相关产品”链接或页面内Ajax搜索链接导航到其他产品。

我们被荒谬的(IMHO)_escaped_fragment_机制所困扰,以免我们因伪装而受到惩罚... Google很难找到能够为这个普遍存在的问题提供整洁解决方案的工程师吗?

我什至在文档__unjustifiable__中甚至根本没有网站/ Webapp索引部分。
移动应用可能会主导消费市场,但B2B呢? 大多数办公室部门都在台式计算机上运行。 为台式机网站建立索引以使其到达研发或采购部门并不是一件容易的事,这对B2B供应商业务而言至关重要。

如果Firebase / Google对此不感兴趣,因为在闪亮的小工具上运行的炫彩应用程序可带来更多收益,那么不胜感激。 四年来对忠实的技术采用者做出回避性的回答是对任何人的智慧的侮辱。

兰蒂? 是的,但是我必须证明额外的基础架构会花费更多的开发时间和对我的客户的爬虫行为。

这个问题公开的四年似乎有点愚蠢。 @cleverplatypus-无法完全同意您的观点。

总的来说,这个问题领域并不是我们一直在考虑的问题,但是我们仍然没有针对转义片段预渲染的任何立即计划。

我认识到肯定有很多时候静态单页应用程序可以受益于预渲染; 但是,我仍然相信,在大多数(但不是全部)情况下,这些类型的网站可以通过服务器端呈现(可以从任何URL引导SPA)更好地服务。

我们的目标是使Firebase Hosting成为一个出色的平台,以提供各种Web体验。 尽管我很欣赏此主题中提供的坦率和慷慨的反馈,但我们的资源确实有限,我们必须优先考虑我们认为会对整体客户群产生最大影响的工作。 如果您想帮助我们改变对自己优先考虑的功能的优先级的看法,最好的方法是提出功能请求-提出这些

我将关闭此线程,因为我认为对话没有任何余地,但是我鼓励任何未通过我们的Cloud Functions集成提供良好服务的人提出功能请求以进行预渲染,以便我们可以直接看到需求量有多大!

感谢您使用Firebase Hosting,所有😸

此页面是否有帮助?
0 / 5 - 0 等级