Falcor和GraphQL有什么区别?

GraphQL由一个types系统,查询语言和执行语义,静态validation和types自省组成,每个概述如下。 为了引导您了解这些组件,我们编写了一个示例来说明各种GraphQL。

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

Falcor允许您通过虚拟JSONgraphics将所有远程数据源表示为单个域模型。 无论数据在哪里,无论是在客户端的内存中,还是在服务器上的networking上,都采用相同的方式进行编码。

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

Falcor和GraphQL(在Relay中)有什么区别?

我看过Angular Air Episode 26:FalcorJS和Angular 2 , Jafar Husain回答了GraphQL与FalcorJS的比较。 这是总结(释义):

  • FalcorJS和GraphQL正在解决同样的问题(查询数据,pipe理数据)。
  • 重要的区别是GraphQL是一种查询语言,而FalcorJS则不是。
  • 当你问FalcorJS资源时,你非常明确地要求有限的一系列值。 FalcorJS确实支持范围,比如genres[0..10] 。 但它不支持开放式查询,例如genres[0..*]
  • GraphQL的设置基于:给我所有的logging在哪里真正的,由此等等。在这个意义上说,GraphQL查询语言比FalcorJS更强大。
  • 使用GraphQL,您拥有强大的查询语言,但是您必须在服务器上解释该查询语言。

Jafar认为,在大多数应用程序中,从客户端到服务器的查询types共享相同的形状。 因此,像get和set这样具有特定和可预测的操作暴露了更多机会来利用caching。 而且,很多开发人员都熟悉使用REST架构中的简单路由器来映射请求。

最终的讨论解决了GraphQL自带的function是否超过了复杂性。

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

  • 可能最大的实际区别是,大多数的例子和大概在GraphQL上完成的工作都集中在集成GraphQL与Relay – Facebook的系统上,以将ReactJS小部件与他们的数据需求集成在一起。 另一方面,FalcorJS倾向于与小部件系统分开行动,这意味着它可能更容易集成到非React / Relay客户端,并且在与小部件匹配的小部件数据依赖性方面自动执行更less。
  • FalcorJS在客户端集成方面灵活的一面是它可以对服务器如何行动非常有见地。 FalcorJS实际上确实有一个直接的“通过HTTP调用这个查询”的能力 – 尽pipeJafar Husain似乎没有太多的讨论 – 一旦包含了这些,客户端库对服务器信息的反应方式是非常相似的,除了GraphQL / Relay增加了一层configuration。 在FalcorJS中,如果您要为影片返回一个值,那么您的返回值会更好地表示“影片”,而在GraphQL中,即使查询返回“影片”,您也应该将其描述为“影片” ”。 这是Gajus提到的权力与复杂度权衡的一部分。
  • 在实际的基础上,GraphQL和Relay似乎更加发达。 Jafar Husain提到下一个版本的Netflix前端将至less部分运行在FalcorJS上,而Facebook团队已经提到他们已经在生产中使用了一些版本的GraphQL / Relay堆栈超过3年。
  • GraphQL和Relay的开源开发者社区似乎正在蓬勃发展。 在GraphQL和Relay上有很多很好的支持项目,而我个人在FalcorJS上发现的很less。 另外,用于Relay的基础github存储库( https://github.com/facebook/relay/pulse )比用于FalcorJS的github存储库( https://github.com/netflix/falcor/pulse )活跃得多。 当我第一次拉Facebook的回购,这个例子被打破了。 我打开了一个github的问题,并在几个小时内修复。 另一方面,我在FalcorJS上打开的github问题在两周内没有正式回复。

更新:我发现我的post下非常有用的评论,我想与你分享作为主要内容的补充: 在这里输入图像说明

关于缺乏的例子,你可以find真棒falcorjs回购用户,有不同的例子,法尔的CRUD用法: https : //github.com/przeor/awesome-falcorjs …第二件事,有一本书叫“ 掌握Full Stack React Development “(包括Falcor)(学习如何使用它的好方法):

在这里输入图像说明

原装邮编如下:

与Relay / GraphQL相比,FalcorJS( https://www.facebook.com/groups/falcorjs/ )的效率要简单得多。

GraphQL + Relay的学习曲线是巨大的: 在这里输入图像说明

在我的简短总结:去法尔科。 在您的下一个项目中使用Falcor,直到您有足够的预算和大量学习时间,然后使用RELAY + GRAPHQL。

GraphQL + Relay具有巨大的API,您必须高效。Falcor拥有小的API,并且很容易掌握熟悉JSON的任何前端开发人员。

如果你有一个资源有限的AGILE项目 – >然后去FalcorJS!

我的主观意见:FalcorJS是500%+在全栈JavaScript中更容易高效。

我还在我的项目上发布了一些FalcorJS入门套件(+更多完整的falcor的示例项目): https ://www.github.com/przeor

更多的技术细节:

1)当你使用Falcor时,你可以在前端和后端都使用:

从'falcor'importfalcor;

然后build立你的模型。

你还需要两个在后端使用简单的库: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 – 容器 – 路由 – 根容器 – 就绪状态 – 变异 – networking层 – 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.6专用标记
  • 2.1.7logging令牌
  • 2.1.8Punctuators
  • 2.1.9Names
  • 2.2查询文档
  • 2.2.1Operations
  • 2.2.2select集
  • 2.2.3Fields
  • 2.2.4Arguments
  • 2.2.5字段别名
  • 2.2.6Fragments
  • 2.2.6.1types条件
  • 2.2.6.2内联片段
  • 2.2.7input值
  • 2.2.7.1Int值
  • 2.2.7.2浮动值
  • 2.2.7.3Boolean值
  • 2.2.7.4string值
  • 2.2.7.5Enum值
  • 2.2.7.6列表值
  • 2.2.7.7input对象值
  • 2.2.8Variables
  • 2.2.8.1片段内variables的使用
  • 2.2.9inputtypes
  • 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对象typesvalidation
  • 3.1.3Interfaces
  • 3.1.3.1接口typesvalidation
  • 3.1.4Unions
  • 3.1.4.1联盟typesvalidation
  • 3.1.5Enums
  • 3.1.6input对象
  • 3.1.7Lists
  • 3.1.8Non-空
  • 3.2Directives
  • 3.2.1@skip
  • 3.2.2@include
  • 3.3开始types
  • 4Introspection
  • 4.1总则
  • 4.1.1命名约定
  • 4.1.2Documentation
  • 4.1.3Deprecation
  • 4.1.4types名称自省
  • 4.2模式的自省
  • 4.2.1“__Type”types
  • 4.2.2types种类
  • 4.2.2.1Scalar
  • 4.2.2.2Object
  • 4.2.2.3Union
  • 4.2.2.4Interface
  • 4.2.2.5Enum
  • 4.2.2.6input对象
  • 4.2.2.7List
  • 4.2.2.8Non空
  • 4.2.2.9列表和非空
  • 4.2.3 __Fieldtypes
  • 4.2.4 __InputValuetypes
  • 5Validation
  • 5.1Operations
  • 5.1.1命名操作定义
  • 5.1.1.1操作名称唯一性
  • 5.1.2匿名操作定义
  • 5.1.2.1唯一的匿名操作
  • 5.2Fields
  • 5.2.1对象,接口和联合types的字段select
  • 5.2.2字段select合并
  • 5.2.3Leaf字段select
  • 5.3Arguments
  • 5.3.1参数名称
  • 5.3.2论证的唯一性
  • 5.3.3参数值types的正确性
  • 5.3.3.1兼容的值
  • 5.3.3.2必需的参数
  • 5.4Fragments
  • 5.4.1片段声明
  • 5.4.1.1片段名称唯一性
  • 5.4.1.2片段扩展types的存在
  • 5.4.1.3复合types上的片段
  • 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.1input对象字段唯一性
  • 5.6Directives
  • 5.6.1指令被定义
  • 5.7Variables
  • 5.7.1变化的唯一性
  • 5.7.2可变的默认值被正确input
  • 5.7.3variables是inputtypes
  • 5.7.4所有variables的使用定义
  • 5.7.5使用的所有variables
  • 5.7.6允许所有的variables使用
  • 6Execution
  • 6.1评估请求
  • 6.2variablesvariables
  • 6.3评估操作
  • 6.4评估select集
  • 6.5评估分组字段集
  • 6.5.1字段条目
  • 6.5.2正常评估
  • 6.5.3系列执行
  • 6.5.4error handling
  • 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.1广告代币
  • B.2专用标记
  • B.3查询文档

这是你的select:

简单的甜蜜和短暂的loggingFalcor JS VERSUS巨大的企业级工具,具有GraphQL和Relay的长期和高级文档

正如我之前所说,如果您是掌握使用JSON的前端开发人员,那么来自Falcor团队的JSONgraphics实现是完成您的全栈开发项目的最佳方式。

LeeQL是GraphQL的工程师之一,在hashnode上做了一个AMA ,这个问题是他在回答这个问题时的回答:

  • Falcor返回Observables,GraphQL只是值。 对于Netflix如何使用Falcor,这对他们来说是很有意义的。 他们提出了多个请求,并在数据准备好的情况下呈现数据,但这也意味着客户端开发人员必须直接使用Observable。 GraphQL是一个请求/响应模型,并返回JSON,这是轻而易举的使用。 中继join了一些Falcor提出的dynamic主义,同时只使用普通的价值。
  • types系统。 GraphQL是根据types系统定义的,这使得我们可以build立许多有趣的工具,如GraphiQL,代码生成器,错误检测等。Falcor更加dynamic化,这本身是有价值的,但是限制了这种事情
  • networking使用。 GraphQL最初devise用于在低端networking上的低端设备上运行Facebook的新闻源,因此,为了最大限度地减less延迟,您可以在单个networking请求中声明所需的一切。 另一方面,Falcor经常执行多次往返来收集额外的数据。 这实际上只是系统简单性和networking控制之间的一个折衷。 对于Netflix,他们也处理非常低端的设备(例如Roku棒),但是假设networking将足够stream式传输video。

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

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

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

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

无论何时我们需要为用户提供数据,我们最终都会得到一些喜欢的东西:客户端 – >查询 – > {一层将查询转换成数据操作} – >数据。

经过与GraphQL,Falcor和JSON API(甚至ODdata)的斗争之后,我写了自己的数据查询层 。 使用GraphQL更简单,更容易学习,更加等效。

检查出来在:
https://github.com/giapnguyen74/nextql

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

Interesting Posts