Falcor和GraphQL有什么区别?


163

GraphQL由类型系统,查询语言和执行语义,静态验证和类型自省组成,下面分别概述。为了指导您完成所有这些组件,我们编写了一个示例,旨在说明GraphQL的各个部分。

- https://github.com/facebook/graphql

Falcor允许您通过虚拟JSON图将所有远程数据源表示为单个域模型。无论数据位于何处,无论是在客户端的内存中还是在服务器的网络中,都可以用相同的方式进行编码。

- http://netflix.github.io/falcor/

Falcor和GraphQL(在Relay的情况下)有什么区别?


5
看看这个播客,Jafar谈论了Relay / GraphQL和Falcor / JSON Graph youtu.be/WL54eYbTJUw?t=53m55s
gdi2290

Answers:


131

我已经看到了角空集26:FalcorJS和角2,其中贾法尔·侯赛因回答如何GraphQL比较FalcorJS。这是摘要(措辞):

  • FalcorJS和GraphQL正在解决相同的问题(查询数据,管理数据)。
  • 重要的区别是GraphQL是查询语言,而FalcorJS不是。
  • 当您向FalcorJS请求资源时,您非常明确地要求提供有限的一系列值。FalcorJS确实支持范围之类的东西,例如genres[0..10]。但是它不支持开放式查询,例如genres[0..*]
  • GraphQL是基于设置的:给我所有记录,包括真实,按此排序等。从这个意义上讲,GraphQL查询语言比FalcorJS更强大。
  • 使用GraphQL,您可以使用强大的查询语言,但是您必须在服务器上解释该查询语言。

Jafar认为,在大多数应用程序中,从客户端到服务器的查询类型具有相同的形式。因此,具有诸如get和set之类的特定且可预测的操作会暴露出更多利用缓存的机会。此外,许多开发人员都熟悉使用REST体系结构中的简单路由器映射请求。

最终讨论围绕GraphQL附带的功能是否胜过复杂性解决。


82

现在,我已经使用两个库编写了应用程序,我可以同意Gajus帖子中的所有内容,但是发现一些不同的东西对我自己使用框架来说最重要。

  • 可能最大的实际差异是,到现在,在GraphQL上的大多数示例和大概完成的工作都集中在集成GraphQL和Relay-Facebook的系统,用于将ReactJS小部件与其数据要求进行集成。另一方面,FalcorJS倾向于与窗口小部件系统分开工作,这意味着既可以更轻松地集成到非React / Relay客户端中,又可以在将窗口小部件数据依赖项与窗口小部件匹配方面自动为您做更少的事情。
  • FalcorJS在客户端集成方面的灵活性是它的另一面是,对于服务器需要如何操作,可以非常自以为是。FalcorJS实际上确实具有直截了当的“通过HTTP调用此查询”功能-尽管Jafar Husain似乎并没有太多谈论它-并且一旦添加了这些功能,客户端库对服务器信息的反应方式就非常相似,除了GraphQL / Relay添加了一层配置。在FalcorJS中,如果您要返回电影的值,则返回值最好说为“电影”,而在GraphQL中,您可以描述为即使查询返回“电影”,也应将其放在客户端数据存储区中作为“电影” '。-这是Gajus提到的权衡复杂性的一部分。
  • 在实际基础上,GraphQL和Relay似乎更加发达。Jafar Husain提到,下一代Netflix前端版本将至少部分在FalcorJS上运行,而Facebook团队则提到,他们已经在生产中使用某些版本的GraphQL / Relay堆栈已有3年以上。
  • 围绕GraphQL和Relay的开源开发人员社区似乎正在蓬勃发展。围绕GraphQL和Relay的项目有很多参与度很好的支持项目,而我个人发现有关FalcorJS的项目很少。同样,Relay(https://github.com/facebook/relay/pulse)的基础github存储库比FalcorJS(https://github.com/netflix/falcor/pulse)的github存储库活跃得多。当我第一次提取Facebook存储库时,这些例子就被打破了。我打开了一个github问题,并在几个小时内将其修复。另一方面,我在FalcorJS上打开的github问题在两周内没有得到官方回复。

1
GraphQL(2012)早于React和Relay,所以您的第一点可能并不完全准确。
Burgi 2015年

你可能是对的。我不是Facebook使用者,所以我无法真正谈论历史。我的评论更多来自Facebook文档和讲座的当前状态。他们作为同伴被介绍给世界(facebook.github.io/react/blog/2015/02/20/…),并且都可以追溯到很早以前。在2015年初的评论中,我已经看到一些关于Relay的模糊手法,这可以追溯到3年前,因此这两种技术都有可能在内部开发了几年,然后才向外界展示。但是我当然没有特别的知识。
OverclockedTim 2015年

25

GraphQL背后的工程师之一Lee Byron在hashnode上进行了AMA,这是在被问到这个问题时的答案:

  • Falcor返回Observables,而GraphQL只是值。对于Netflix想要使用Falcor的方式,这对他们来说很有意义。它们发出多个请求并在准备就绪时显示数据,但这也意味着客户端开发人员必须直接使用Observable。GraphQL是一个请求/响应模型,并返回JSON,使用起来很简单。中继增加了Falcor所提供的一些动态性,同时仅使用普通值进行维护。
  • 类型系统。GraphQL是根据类型系统定义的,这使我们能够构建许多有趣的工具,例如GraphiQL,代码生成器,错误检测等。Falcor的动态性强得多,它本身具有价值,但会限制其执行能力这种事情。
  • 网络使用率。GraphQL最初旨在在甚至更低端网络上的低端设备上运行Facebook的新闻提要,因此它竭尽全力允许您在单个网络请求中声明所需的一切,以最大程度地减少延迟。另一方面,Falcor通常执行多次往返以收集其他数据。这实际上只是系统的简单性和网络控制之间的折衷。对于Netflix,它们还处理非常低端的设备(例如Roku Stick),但假设网络将足以传输视频。

编辑:Falcor确实可以批量处理请求,从而使有关网络使用情况的评论不准确。感谢@PrzeoR


4
不正确->“”“另一方面,Falcor通常执行多次往返以收集其他数据。这实际上只是系统的简单性与网络控制之间的折衷。”“” 只需检查Falcor Batch功能,它与Relay中的功能相同甚至更好。
PrzeoR

1
@PrzeoR谢谢您的纠正!我编辑了帖子!
YasserKaddour '16

欢迎您:-)与FalcorJS有关的内容,请在此处查看更多详细信息:reactjs.co/2016/02/03/…–
PrzeoR

伟大的文章确实Falcor是伟大的,可惜我Scala的开发人员并没有在斯卡拉和其他语言为此事Falcor实现,但是有桑格利亚 Scala中的优秀GraphQL实现
YasserKaddour

还有其他替代方案可以使用redux,例如apollo-clientcashay
YasserKaddour

21

更新:我在帖子下找到了非常有用的评论,作为主要内容的补充,我想与您分享: 在此处输入图片说明

对于缺少示例的情况,您可以找到很棒的awesome-falcorjs存储库,其中有Falcor的CRUD用法的不同示例:https : //github.com/przeor/awesome-falcorjs ...第二件事,有一本书叫做“ 《精通全栈React开发》(也包括Falcor)(学习如何使用它的好方法):

在此处输入图片说明

以下原始帖子:

与Relay / GraphQL相比,FalcorJS(https://www.facebook.com/groups/falcorjs/)更简单有效。

GraphQL + Relay的学习曲线很大: 在此处输入图片说明

在我的简短摘要中:选择Falcor。在下一个项目中使用Falcor,直到您有大量预算并为团队提供大量学习时间,然后使用RELAY + GRAPHQL。

GraphQL + Relay具有巨大的API,您必须高效地使用它。Falcor具有较小的API,对于熟悉JSON的任何前端开发人员而言,它都很容易掌握。

如果您有一个资源有限的AGILE项目->然后选择FalcorJS!

我的主观意见:FalcorJS在全栈javascript中更容易提高效率500%以上。

我还在我的项目上发布了一些FalcorJS入门工具包(以及更多全栈falcor的示例项目):https ://www.github.com/przeor

欲了解更多技术细节:

1)使用Falcor时,可以同时在前端和后端使用:

从“ falcor”进口falcor;

然后建立您的模型

...您还需要两个易于在后端使用的库:a)falcor-express-您只需使用一次(例如app.use('/ model.json',FalcorServer.dataSourceRoute(()=> new NamesRouter ())))。来源:https : //github.com/przeor/falcor-netflix-shopping-cart-example/blob/master/server/index.js

b)falcor-router-在此处定义简单路由(例如,路由:'_view.length')。来源:https : //github.com/przeor/falcor-netflix-shopping-cart-example/blob/master/server/router.js

就学习曲线而言,Falcor是小菜一碟。

您还可以查看比FB的lib简单得多的文档,并查看文章“ 为什么要关心falcorjs(netflix falcor) ”。

2)Relay / GraphQL更像是一个巨大的企业工具。

例如,您有两个不同的文档,分别讨论:

a)中继:https : //facebook.github.io/relay/docs/tutorial.html-容器-路由-根容器-就绪状态-突变-网络层-Babel中继插件-GRAPHQL

  • GraphQL继电器规格
  • 对象识别
  • 连接
  • 变异
  • 进一步阅读
  • API参考

  • 中继

  • 中继容器
  • 中继路由
  • Relay.RootContainer
  • 中继QL
  • 中继突变
  • Relay.PropTypes
  • 中继存储
  • 介面

  • 中继网络层

  • RelayMutationRequest
  • 中继查询请求

b)GrapQL:https://facebook.github.io/graphql/

  • 2语言
  • 2.1原始文本
  • 2.1.1Unicode
  • 2.1.2空白
  • 2.1.3线路终结器
  • 2.1.4评论
  • 2.1.5无关紧要的逗号
  • 2.1.6词汇令牌
  • 2.1.7被忽略的令牌
  • 2.1.8标点器
  • 2.1.9名称
  • 2.2查询文件
  • 2.2.1操作
  • 2.2.2选择集
  • 2.2.3字段
  • 2.2.4参数
  • 2.2.5字段别名
  • 2.2.6片段
  • 2.2.6.1类型条件
  • 2.2.6.2内联片段
  • 2.2.7输入值
  • 2.2.7.1整数值
  • 2.2.7.2浮点值
  • 2.2.7.3布尔值
  • 2.2.7.4字符串值
  • 2.2.7.5枚举值
  • 2.2.7.6清单值
  • 2.2.7.7输入对象值
  • 2.2.8变量
  • 2.2.8.1片段内的变量用法
  • 2.2.9输入类型
  • 2.2.10指令
  • 2.2.10.1片段指令
  • 3类型系统
  • 3.1类型
  • 3.1.1标量
  • 3.1.1.1内置标量
  • 3.1.1.1.1整数
  • 3.1.1.1.2浮动
  • 3.1.1.1.3字符串
  • 3.1.1.1.4布尔
  • 3.1.1.1.5ID
  • 3.1.2对象
  • 3.1.2.1对象字段参数
  • 3.1.2.2对象字段弃用
  • 3.1.2.3对象类型验证
  • 3.1.3接口
  • 3.1.3.1接口类型验证
  • 3.1.4联盟
  • 3.1.4.1联合类型验证
  • 3.1.5枚举
  • 3.1.6输入对象
  • 3.1.7列表
  • 3.1.8非空
  • 3.2指令
  • 3.2.1 @跳过
  • 3.2.2@include
  • 3.3开始类型
  • 4自省
  • 4.1一般原则
  • 4.1.1命名约定
  • 4.1.2文档
  • 4.1.3弃用
  • 4.1.4类型名称自省
  • 4.2架构自省
  • 4.2.1“ __ Type”类型
  • 4.2.2类型种类
  • 4.2.2.1标量
  • 4.2.2.2对象
  • 4.2.2.3联盟
  • 4.2.2.4接口
  • 4.2.2.5枚举
  • 4.2.2.6输入对象
  • 4.2.2.7列表
  • 4.2.2.8非空
  • 4.2.2.9合并列表和非空
  • 4.2.3 __Field类型
  • 4.2.4 __InputValue类型
  • 5验证
  • 5.1操作
  • 5.1.1命名操作定义
  • 5.1.1.1操作名称唯一性
  • 5.1.2匿名操作定义
  • 5.1.2.1匿名操作
  • 5.2字段
  • 5.2.1在对象,接口和联合类型上的字段选择
  • 5.2.2字段选择合并
  • 5.2.3叶场选择
  • 5.3参数
  • 5.3.1参数名称
  • 5.3.2参数唯一性
  • 5.3.3自变量值类型正确性
  • 5.3.3.1兼容值
  • 5.3.3.2必需参数
  • 5.4片段
  • 5.4.1片段声明
  • 5.4.1.1片段名称唯一性
  • 5.4.1.2片段扩展类型存在
  • 5.4.1.3复合类型上的片段
  • 5.4.1.4必须使用片段
  • 5.4.2片段传播
  • 5.4.2.1定义片段传播目标
  • 5.4.2.2碎片散布不得形成周期
  • 5.4.2.3可能会散布碎片
  • 5.4.2.3.1对象在对象范围内传播
  • 5.4.2.3.2对象范围中的抽象传播
  • 5.4.2.3.3对象在抽象范围内传播
  • 5.4.2.3.4摘要范围内的摘要传播
  • 5.5值
  • 5.5.1输入对象字段唯一性
  • 5.6指令
  • 5.6.1指令已定义
  • 5.7变量
  • 5.7.1变量唯一性
  • 5.7.2正确键入可变的默认值
  • 5.7.3变量是输入类型
  • 5.7.4定义所有变量用途
  • 5.7.5使用的所有变量
  • 5.7.6允许所有变量使用
  • 6执行
  • 6.1评估请求
  • 6.2强制变量
  • 6.3评估操作
  • 6.4评估选择集
  • 6.5评估分组的字段集
  • 6.5.1字段条目
  • 6.5.2正常评估
  • 6.5.3串行执行
  • 6.5.4错误处理
  • 6.5.5可空性
  • 7回应
  • 7.1序列化格式
  • 7.1.1JSON序列化
  • 7.2响应格式
  • 7.2.1数据
  • 7.2.2错误
  • 附录:符号约定
  • A.1上下文无关的语法
  • A.2词汇和句法语法
  • A.3语法符号
  • A.4语法语义
  • A.5算法
  • B附录:语法摘要
  • B.1被忽略的令牌
  • B.2词汇代币
  • B.3查询文件

这是你的选择:

简单而简短的Falcor JS VERSUS简短文档,具有GraphQL&Relay的长而高级文档,是大型企业级工具

正如我之前所说,如果您是一位掌握使用JSON想法的前端开发人员,那么Falcor团队的JSON图形实现是完成全栈开发项目的最佳方法。


13
主观答案。不包括技术比较。作为评论更合适。
加茹斯

2
@GajusKuizinas主观答案?查看两者的文档;-)我只是说Falcor的学习速度越来越快-这是事实;-)我也一直在研究这两者-从长远来看,即使FB做得很好,简单也能取胜炒作;-)
PrzeoR

2
这只是一种意见,根本无法回答问题。
米哈尔Miszczyszyn

14
我认为这是一个很好的答案,至此,技术的学习曲线不一定是主观的,可以很容易地进行度量,此处提供了事实,以便可以得出清晰的结论。在现实世界中,认真的专业人员会考虑这些事实。毕竟这是一个悬而未决的问题,显然可以从诸如此类的答案中受益。
bmaggi '16

2
我同意@MorgenCheng的投票!最近几周,我一直在进行评估GraphQL / Relay,Cashay,Redux和现在的Falcor的巡回赛,我100%同意PrzeoR。Relay和GraphQL是很棒的技术,但是它们需要更多的脑力,而且对新手更难理解。涉及大量的学习。Falcor的缺点是缺乏基于CRUD的完整应用程序的示例。而且我很想看到PostgreSQL和RethinkDB项目吐出JsonGraph。
Dom

5

简而言之,Falcor或GraphQL或Restful解决了相同的问题-提供有效地查询/操作数据的工具。

它们的不同之处在于它们如何呈现数据:

  • Falcor希望您将其数据视为一个非常大的虚拟JSON树,并使用getsetcall来读取,写入数据。
  • GraphQL希望您将其数据视为一组预定义的类型化对象,并使用查询变异来读取和写入数据。
  • Restful希望您将其数据视为一组资源,并使用HTTP动词来读取和写入数据。

每当我们需要为用户提供数据时,我们都会得到类似的结果:客户端->查询-> {一层将查询转换为数据操作}->数据。

在使用GraphQL,Falcor和JSON API(甚至是ODdata)后,我编写了自己的数据查询层。它更简单,更容易学习,并且与GraphQL等效。

在以下位置查看:
https //github.com/giapnguyen74/nextql

它还与featherjs集成在一起以进行实时查询/突变。 https://github.com/giapnguyen74/nextql-feathers


2

好的,从一个简单但重要的区别开始,GraphQL是基于查询的,而Falcor不是!

但是他们如何帮助您呢?

基本上,它们都可以帮助我们管理和查询数据,但是GraphQL有一个req / res Model并将数据作为JSON返回,基本上GraphQL的想法是有一个请求就可以将所有数据为一个目标。此外,可以通过发出确切的请求来获得准确的响应,因此可以在低速互联网和移动设备(例如3G网络)上运行...因此,如果您有很多移动用户,或者出于某些原因,您希望请求减少而响应更快,请使用GraphQL ...尽管Faclor距离本文不太远,所以请继续阅读...

在另一方面,Falcor通过Netflix公司,通常有额外的要求(通常超过一次)来获取所有数据沉绵他们试图把它提高到一个单一的REQ ... Falcor较为有限的查询和没有预定义的查询助手,例如范围等。

但是,为了更清楚一点,让我们看看它们各自如何自我介绍:

GraphQL,API的查询语言

GraphQL是API的查询语言,是用于使用现有数据来完成这些查询的运行时。GraphQL为您的API中的数据提供完整且易于理解的描述,使客户能够准确地询问他们所需的内容,仅此而已,使随着时间的推移更容易开发API并启用强大的开发人员工具。

将GraphQL查询发送到您的API,即可准确获取所需信息,仅此而已。GraphQL查询始终返回可预测的结果。使用GraphQL的应用程序快速且稳定,因为它们控制获取的数据而不是服务器。

GraphQL查询不仅可以访问一种资源的属性,还可以平滑地遵循它们之间的引用。虽然典型的REST API需要从多个URL进行加载,但是GraphQL API可以在单个请求中获取应用程序需要的所有数据。即使在缓慢的移动网络连接下,使用GraphQL的应用程序也可以快速运行。

GraphQL API按照类型和字段(而不是端点)进行组织。从单个端点访问数据的全部功能。GraphQL使用类型来确保Apps仅询问可能的情况,并提供清晰有用的错误。应用可以使用类型来避免编写手动解析代码。


Falcor,一个用于高效获取数据的JavaScript库

Falcor允许您通过虚拟JSON图将所有远程数据源表示为单个域模型。无论数据位于何处,无论是在客户端的内存中还是在服务器的网络中,都可以用相同的方式进行编码。

类似JavaScript的路径语法使您可以在需要时轻松访问所需的数据。您可以使用熟悉的JavaScript操作(如get,set和call)来检索数据。如果知道数据,就知道您的API。

Falcor自动遍历图形中的引用并根据需要发出请求。Falcor透明地处理所有网络通信,机会地对请求进行批处理和重复数据删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.