Falcor和GraphQL有什么区别?

时间:2015-08-17 19:02:05

标签: graphql relayjs falcor

  

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

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

  

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

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

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

6 个答案:

答案 0 :(得分: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带来的功能是否超过了复杂性。

答案 1 :(得分: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问题在两周内没有得到官方回应。

答案 2 :(得分:22)

Lee Byron GraphQL背后的工程师之一做了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

答案 3 :(得分:20)

更新:我在帖子中发现了一个非常有用的评论,我希望与您分享,作为主要内容的补充内容: enter image description here

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

enter image description here

以下是ORGINAL POST:

与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入门套件(+更多全栈式的示例项目):https://www.github.com/przeor

更多技术细节:

1)当您使用Falcor时,您可以在前端和后端使用它们:

从falcor&#39 ;;

导入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路线(例如 路线:' _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 Relay插件 - GRAPHQL

  • GraphQL中继规范
  • 对象识别
  • 连接
  • 的突变
  • 进一步阅读
  • API REFERENCE

  • 继电器

  • RelayContainer
  • Relay.Route
  • Relay.RootContainer
  • Relay.QL
  • Relay.Mutation
  • Relay.PropTypes
  • Relay.Store
  • INTERFACES

  • RelayNetworkLayer

  • RelayMutationRequest
  • RelayQueryRequest

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

  • 2Language
  • 2.1Source Text
  • 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.2Query Document
  • 2.2.1Operations
  • 2.2.2选择集
  • 2.2.3Fields
  • 2.2.4Arguments
  • 2.2.5Field Alias
  • 2.2.6Fragments
  • 2.2.6.1类型条件
  • 2.2.6.2内联碎片
  • 2.2.7输入值
  • 2.2.7.1Int Value
  • 2.2.7.2浮动值
  • 2.2.7.3Boolean Value
  • 2.2.7.4String Value
  • 2.2.7.5Enum Value
  • 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片段指令
  • 3Type系统
  • 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.1Object Field Arguments
  • 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 Introspection
  • 4.2.1" __ Type"型
  • 4.2.2Type Kinds
  • 4.2.2.1Scalar
  • 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 Type
  • 4.2.4 __InputValue Type
  • 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叶片栏位选择
  • 5.3Arguments
  • 5.3.1Argument Names
  • 5.3.2Argument Uniqueness
  • 5.3.3Argument Values Type Correctness
  • 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 Coercing Variables
  • 6.3评估运营
  • 6.4评估选择集
  • 6.5评估分组字段集
  • 6.5.1字段条目
  • 6.5.2正常评估
  • 6.5.3序列执行
  • 6.5.4错误处理
  • 6.5.5Nullability
  • 7Response
  • 7.1Serialization Format
  • 7.1.1JSON序列化
  • 7.2Response Format
  • 7.2.1Data
  • 7.2.2Errors
  • 附录:符号约定
  • A.1Context-Free Grammar
  • A.2Lexical和Syntactical Grammar
  • A.3Grammar Notation
  • A.4Grammar Semantics
  • A.5Algorithms
  • BAppendix:语法摘要
  • B.1Ignored Tokens
  • B.2Lexical Tokens
  • B.3查询文件

这是您的选择:

简单的简短记录Falcor JS VERSUS巨大的企业级工具,包含GraphQL& Relay

的高级和高级文档

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

答案 4 :(得分:5)

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

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

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

每当我们需要为用户提供数据时,我们最终会得到以下内容:客户端 - >查询 - > {a layer translate query into data ops} - >数据

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

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

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

答案 5 :(得分:1)

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

但是他们如何帮助你?

基本上,他们都帮助我们管理和查询数据,但 GraphQL req / res模型并将数据返回为 JSON ,基本上 GraphQL 中的想法只有一个请求将所有数据放在一个目标中...而且,通过提出确切的请求得到确切的响应,所以可以在低速互联网上运行移动设备,如3G网络......因此,如果您有许多移动用户或出于某些原因,您希望获得更少的请求和更快的响应,请使用 GraphQL ...而 Faclor 与此并不太远,请继续阅读......

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

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

  

GraphQL,API的查询语言

     

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

     

向您的API发送GraphQL查询并获得您需要的内容,   没有更多,也没有更少。 GraphQL查询总是返回   可预测的结果。使用GraphQL的应用程序快速而稳定,因为   他们控制所获得的数据,而不是服务器。

     

GraphQL查询不仅可以访问一个资源的属性,还可以访问   也顺利地遵循他们之间的参考。典型的REST API   需要从多个URL加载,GraphQL API可以获取您的所有数据   应用程序需要一个请求。使用GraphQL的应用程序可以快速开启   慢速移动网络连接。

     

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


  

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

     

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

     

类似JavaScript的路径语法可以轻松访问   如果你想要它,你想要的数据很少。您检索数据   使用熟悉的JavaScript操作,如get,set和call。如果你   了解您的数据,了解您的API。

     

Falcor会自动遍历图表中的参考文献并制作   请求。 Falcor透明地处理所有网络   通信,机会性批处理和重复数据删除请求。