Falcor和GraphQL有什么区别?

问题描述 投票:150回答:6

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

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

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

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

Falcor和GraphQL有什么区别(在Relay的背景下)?

graphql relayjs falcor
6个回答
123
投票

我已经看过Angular Air Episode 26: FalcorJS and Angular 2,其中Jafar Husain回答GraphQLFalcorJS的比较。这是摘要(释义):

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

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

最后的讨论解决了GraphQL带来的功能是否超过了复杂性。


77
投票

我现在已经用两个库编写了应用程序,我可以同意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问题在两周内没有得到官方回应。

22
投票

图形搜索背后的工程师之一Lee Byron做了一个AMA on hashnode,当被问到这个问题时,这是他的回答:

  • Falcor返回Observables,GraphQL只是值。对于Netflix如何使用Falcor,这对他们来说很有意义。他们在准备就绪时发出多个请求并显示数据,但这也意味着客户端开发人员必须直接使用Observables。 GraphQL是一个请求/响应模型,并返回JSON,这很容易使用。 Relay补充了Falcor在保持仅使用普通值时所呈现的一些动态。
  • 输入系统。 GraphQL是根据类型系统定义的,这使我们能够构建许多有趣的工具,如GraphiQL,代码生成器,错误检测等.Falcor更具动态性,这本身就很有价值,但限制了它的能力。这种事。
  • 网络使用情况GraphQL最初设计用于在甚至低端网络上的低端设备上运行Facebook的新闻源,因此它可以让您在单个网络请求中声明所需的所有内容,以最大限度地减少延迟。另一方面,Falcor经常进行多次往返以收集额外数据。这实际上只是系统简单性和网络控制之间的权衡。对于Netflix,他们还处理非常低端的设备(例如Roku棒),但假设网络将足以流式传输视频。

编辑:Falcor确实可以batch requests,使得关于网络使用的评论不准确。感谢@PrzeoR


20
投票

更新:我发现我的帖子中非常有用的评论,我想与你分享作为主要内容的补充:enter image description here

关于缺乏示例,你可以找到有用的真棒-falcorjs repo,有不同的Falcor CRUD用法的例子:https://github.com/przeor/awesome-falcorjs ......第二件事,有一本名​​为“Mastering Full Stack React Development”的书,其中也包括Falcor(学习的好方法)如何使用它):

enter image description here

以下原始帖子:

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

GraphQL + Relay的学习曲线是巨大的:enter image description here

在我的简短摘要中:去找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 - 你定义SIMPLE路由(例如route:'_ view.length')。资料来源:https://github.com/przeor/falcor-netflix-shopping-cart-example/blob/master/server/router.js

Falcor在学习曲线方面是小菜一碟。

您还可以看到比FB的lib简单得多的文档,并查看文章“why you should care about falcorjs (netflix falcor)”。

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

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

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

  • GraphQL中继规范
  • 物体识别
  • 连接
  • 突变
  • 进一步阅读
  • API参考
  • 中继
  • RelayContainer
  • Relay.Route
  • Relay.RootContainer
  • Relay.QL
  • Relay.Mutation
  • Relai.PropTypes
  • relay.store
  • INTERFACES
  • RelayNetworkLayer
  • RelayMutationRequest
  • RelayQueryRequest

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

  • 2Language
  • 2.1源文本
  • 2.1.1Unicode
  • 2.1.2白色空间
  • 2.1.3线路终结器
  • 2.1.4Comments
  • 2.1.5无关紧要的逗号
  • 2.1.6Lexical Tokens
  • 2.1.7Ignored Tokens
  • 2.1.8Punctuators
  • 2.1.9Names
  • 2.2查询文档
  • 2.2.1Operations
  • 2.2.2选择集
  • 2.2.3Fields
  • 2.2.4Arguments
  • 2.2.5字段别名
  • 2.2.6Fragments
  • 2.2.6.1类型条件
  • 2.2.6.2内联碎片
  • 2.2.7输入值
  • 2.2.7.1Int值
  • 2.2.7.2浮动值
  • 2.2.7.3Boolean Value
  • 2.2.7.4串值
  • 2.2.7.5Enum值
  • 2.2.7.6列表值
  • 2.2.7.7输入对象值
  • 2.2.8Variables
  • 2.2.8.1碎片内的可变使用
  • 2.2.9输入类型
  • 2.2.10Directives
  • 2.2.10.1片段指令
  • 3类型系统
  • 3.1Types
  • 3.1.1Scalars
  • 3.1.1.1内置标量
  • 3.1.1.1.1Int
  • 3.1.1.1.2Float
  • 3.1.1.1.3String
  • 3.1.1.1.4Boolean
  • 3.1.1.1.5ID
  • 3.1.2Objects
  • 3.1.2.1对象字段参数
  • 3.1.2.2对象字段弃用
  • 3.1.2.3对象类型验证
  • 3.1.3Interfaces
  • 3.1.3.1接口类型验证
  • 3.1.4Unions
  • 3.1.4.1联盟类型验证
  • 3.1.5Enums
  • 3.1.6输入对象
  • 3.1.7Lists
  • 3.1.8Non零
  • 3.2Directives
  • 3.2.1@skip
  • 3.2.2@include
  • 3.3开始类型
  • 4Introspection
  • 4.1一般原则
  • 4.1.1命名约定
  • 4.1.2Documentation
  • 4.1.3Deprecation
  • 4.1.4类型名称内省
  • 4.2Schema内省
  • 4.2.1“__ Type”类型
  • 4.2.2类型种类
  • 他们4.2.2.1sc
  • 4.2.2.2Object
  • 4.2.2.3Union
  • 4.2.2.4Interface
  • 4.2.2.5Enum
  • 4.2.2.6输入对象
  • 4.2.2.7List
  • 4.2.2.8Non零
  • 4.2.2.9组合列表和非空
  • 4.2.3 __Field类型
  • 4.2.4 __InputValue类型
  • 5Validation
  • 5.1Operations
  • 5.1.1命名操作定义
  • 5.1.1.1操作名称唯一性
  • 5.1.2匿名操作定义
  • 5.1.2.1单独匿名操作
  • 5.2Fields
  • 5.2.1对象,接口和联合类型的字段选择
  • 5.2.2场地选择合并
  • 5.2.3叶子场选择
  • G. Arjomants
  • 5.3.1Argument名称
  • 5.3.2Argument唯一性
  • 5.3.3Argument值类型正确性
  • 5.3.3.1兼容的值
  • 5.3.3.2所需参数
  • 5.4Fragments
  • 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.5Values
  • 5.5.1输入对象字段唯一性
  • 5.6Directives
  • 5.6.1定义了指令
  • 5.7Variables
  • 5.7.1可变的唯一性
  • 5.7.2变量默认值输入正确
  • 5.7.3变量是输入类型
  • 5.7.4定义的所有变量用途
  • 5.7.5使用的所有变量
  • 5.7.6允许使用所有可变用法
  • 6Execution
  • 6.1评估请求
  • 6.2强制变量
  • 6.3评估运营
  • 6.4评估选择集
  • 6.5评估分组字段集
  • 6.5.1场地条目
  • 6.5.2正常评估
  • 6.5.3序列执行
  • 6.5.4错误处理
  • 6.5.5Nullability
  • 7Response
  • 7.1序列化格式
  • 7.1.1JSON序列化
  • 7.2响应格式
  • sht.2.1data
  • 7.2.2Errors
  • 附录:符号约定
  • A.1无文字语法
  • A.2语法和句法语法
  • A.3Grammar表示法
  • A.4Grammar语义学
  • A.5Algorithms
  • 附录:语法摘要
  • B.1Ignored Tokens
  • B.2Lexical Tokens
  • B.3查询文档

这是你的选择:

简单的甜蜜和简短记录Falcor JS VERSUS巨大的企业级工具,具有GraphQL和Relay等长而高级的文档

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


5
投票

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

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

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

每当我们需要为用户提供数据时,我们最终会得到以下内容:客户端 - >查询 - > {层转换查询到数据操作} - >数据。

在使用GraphQL,Falcor和JSON API(甚至是ODdata)之后,我编写了自己的data query layer。它更简单,更容易学习,与GraphQL更相同。

请查看: https://github.com/giapnguyen74/nextql

它还与featherjs集成,用于实时查询/变异。 https://github.com/giapnguyen74/nextql-feathers


1
投票

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

但是他们如何帮助你呢?

基本上,它们都帮助我们管理和查询数据,但GraphQL有一个req / res模型并将数据作为JSON返回,基本上GraphQL中的想法只有一个请求将所有数据放在一个目标中......此外,通过确切的请求得到确切的响应,所以可以在低速互联网和移动设备上运行,比如3G网络...所以如果你有很多移动用户或者出于某种原因你想要更少的请求和更快的响应,使用GraphQL ...虽然Faclor离这不太远,所以请继续阅读......

另一方面,Netflix的Falcor,通常有额外的请求(通常不止一次)来检索你的所有数据,尽管他们试图将它改进到单个请求... Falcor对查询的限制更多而且没有预先 - 范围等等的定义查询助手......

但是为了进一步澄清,让我们看看每个人如何介绍自己:

GraphQL,API的查询语言

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

将GraphQL查询发送到您的API并获得您所需要的内容,仅此而已。 GraphQL查询始终返回可预测的结果。使用GraphQL的应用程序快速而稳定,因为它们控制着他们获得的数据,而不是服务器。

GraphQL查询不仅可以访问一个资源的属性,还可以顺利地访问它们之间的引用。虽然典型的REST API需要从多个URL加载,但GraphQL API可以在单个请求中获取您的应用程序所需的所有数据。即使在慢速移动网络连接上,使用GraphQL的应用也可以快速完成。

GraphQL API按类型和字段组织,而不是端点。从单个端点访问数据的全部功能。 GraphQL使用类型来确保应用程序仅询问可能的内容并提供明确且有用的错误。应用程序可以使用类型来避免编写手动解析代码。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.