Falcor和GraphQL有什么区别?

Gaj*_*jus 155 graphql falcor relayjs

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

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

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

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

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

Gaj*_*jus 127

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

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

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

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


Ove*_*Tim 78

我现在已经用两个库编写了应用程序,我可以同意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的基础github存储库(https://github.com/facebook/relay/pulse)比FalcorJS的github存储库(https://github.com/netflix/falcor/pulse)更加活跃.当我第一次拉开Facebook回购时,示例被打破了.我打开了一个github问题,并在几小时内修复.另一方面,我在FalcorJS上开设的github问题在两周内没有得到官方回应.


Yas*_*our 24

GraphQL背后的工程师之一Lee Byron在hashnode上做了一个AMA,当被问到这个问题时,这是他的回答:

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

编辑:Falcor确实可以批量请求,使得关于网络使用的评论不准确.感谢@PrzeoR

  • 不是 - >""另一方面,Falcor经常进行多次往返以收集额外的数据.这实际上只是系统简单性和网络控制之间的权衡."".只需检查Falcor Batch功能,它与继电器相同甚至更好. (4认同)

Prz*_*eoR 21

更新:我在帖子中找到了非常有用的评论,我希望与您分享作为主要内容的补充内容: 在此输入图像描述

关于缺少示例,您可以找到有用的awesome-falcorjs repo,有不同的Falcor CRUD用法示例:https: //github.com/przeor/awesome-falcorjs ...其次,有一本名​​为" 掌握全栈反应开发 "包括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 - 你定义SIMPLE路由(例如route:'_ 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参考

  • 中继

  • 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.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.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类型
  • 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叶子场选择
  • 5.3Arguments
  • 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响应格式
  • 7.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图形实现是完成你的全栈开发项目的最佳方式.

  • 我认为这是一个很好的答案,到目前为止,技术的学习曲线不一定是主观的,可以很容易地衡量,这里提供的事实可以提取出明确的结论.在现实世界中,认真的专业人士会考虑这些事实.这毕竟是一个悬而未决的问题,显然可以从这样的答案中受益. (14认同)
  • 主观回答.不包括技术比较.更适合作为评论. (13认同)
  • @GajusKuizinas主观答案?查看这两个文档;-)我只是说Falcor的学习速度越来越快-这是事实;-)我也一直在研究这两个方面-从长远来看,即使FB做得很好,简单也能取胜炒作;-) (2认同)
  • 这仅仅是一种意见,它根本不回答这个问题. (2认同)
  • 我同意@MorgenCheng的投票!最近几周,我一直在进行评估GraphQL / Relay,Cashay,Redux和现在的Falcor的巡回赛,我100%同意PrzeoR。Relay和GraphQL是很棒的技术,但是它们需要更多的脑力,而且对于新手来说更难理解。涉及大量的学习。Falcor的缺点是缺乏基于CRUD的完整应用程序的示例。我很想看到PostgreSQL和RethinkDB项目吐出JsonGraph。 (2认同)

Gia*_*yen 5

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

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

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

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

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

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

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