Falcor 和 GraphQL 有什么不同?

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

https://github.com/facebook/graphql

Falcor 允许您将所有远程数据源表示为一个 通过一个虚拟的 JSON 图形域模型 数据在哪里,是在客户端的内存中还是通过网络 在服务器上。

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

Falcor 和 GraphQL (就 Relay 而言)有什么不同?

30102 次浏览

我看了 Angular Air 第26集: FalcorJS and Angular 2,其中 贾法尔 · 侯赛因回答了 GraphQLFalcorJS的比较。下面是摘要(转述) :

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

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

最后的讨论解决了 GraphQL 的强大功能是否超过复杂性的问题。

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

  • 可能最大的实际差异是,大多数实例和可能在 GraphQL 上完成的工作都集中在将 GraphQL 与 Relay-Facebook 的系统集成在一起,以便将 ReactJS 小部件与它们的数据需求集成在一起。另一方面,FalcorJS 倾向于独立于小部件系统,这意味着它可能更容易集成到一个非 React/Relay 客户端,并且在匹配小部件数据依赖关系方面,它会自动为你做得更少。
  • FalcorJS 在客户端集成方面具有灵活性的另一面是,它可以对服务器需要如何操作非常固执己见。FalcorJS 实际上有一个直截了当的“通过 HTTP 调用这个查询”功能——尽管贾法尔 · 侯赛因似乎不怎么谈论它——一旦你包含了这些功能,客户端库对服务器信息的反应方式非常相似,除了 GraphQL/Relay 添加了一个配置层。在 FalcorJS 中,如果返回的是 film 的值,那么返回值最好是‘ film’,而在 GraphQL 中,即使查询返回的是‘ film’,也应该将其放在客户端数据存储中作为‘ film’。这是 Gajus 提到的权力与复杂性权衡的一部分。
  • 在实践的基础上,GraphQL 和 Relay 似乎更加发达。贾法尔 · 侯赛因提到,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 问题已经有两个星期没有得到官方的回应了。

更新: 我在我的文章下面发现了一条非常有用的评论,我想和你们分享,作为主要内容的补充: enter image description here

关于缺乏例子,你可以找到令人敬畏的 Falcorjs repo 用户,有一个 Falcors 的 CRUD 使用不同的例子: Https://github.com/przeor/awesome-falcorjs 第二件事,有一本名为“ 掌握全堆反应器的开发”的书,其中也包括 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 的前端开发人员来说都很容易掌握。

如果您有一个资源有限的敏捷项目-> 然后去 FalcorJS!

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

我还在我的项目中发布了一些 FalcorJS 入门工具包(+ 更多的 Falcors 示例项目) : https://www.github.com/przeor

更多技术细节:

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

从“ Falcor”进口 Falcor;

然后建立你的模型。

你还需要两个在后端使用简单的库: A) falcor-Express ——使用一次(例如: Use (’/model. json’,FalcorServer.dataSourceRoute (() = > new NamesRouter ())))来源: http://github.com/przeor/falcor-netflix-shop-car-example/blob/master/server/index.js”> 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

就学习曲线而言,法尔考是小菜一碟。

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

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

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

A)继电器: < a href = “ https://facebook.github.io/Relit/docs/Tutorial.html”> https://facebook.github.io/Relay/docs/tutorial.html - 集装箱 - 路线 - 根部容器 准备状态 变异 - 网络层 - Babel Relay 插件 - GRAPHQL

  • 继电器规范
  • 目标识别
  • 联系
  • 变异
  • 进一步阅读
  • API 参考资料

  • 继电器

  • RelayContainer
  • 继电器,路线
  • Relay RootContainer
  • 继电器 QL
  • 接力,变异
  • 继电器,道具类型
  • 继电器,商店
  • 接口

  • 中继网络层

  • 继电器突变请求
  • RelayQueryRequest

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

  • 2语言
  • 2.1源文本
  • 2.1.1 Unicode
  • 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片段指令
  • 3Type 系统
  • 3.1类别
  • 3.1.1标量
  • 3.1.1. 内置的标量
  • 3.1.1
  • 3.1.1.2浮动
  • 3.1.1.3字符串
  • 3.1.1.4布尔值
  • 3.1.1.5 ID
  • 3.1.2物体
  • 3.1.2.1对象字段参数
  • 3.1.2.2对象字段弃用
  • 3.1.2.3对象类型验证
  • 3.1.3接口
  • 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
  • 3.2.2@包括
  • 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 Enum
  • 4.2.2.6输入对象
  • 4.2.2.7名单
  • 4.2.2.8非空
  • 4.2.2.9合并列表与非空
  • 4.2.3 _ _ 字段类型
  • 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.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.1 JSON 序列化
  • 7.2回应格式
  • 7.2.1数据
  • 7.2.2错误
  • 附录: 表示法公约
  • 上下文无关语法
  • 词汇和句法语法
  • A. 3语法符号
  • 语法语义学
  • A. 5算法
  • 附录: 语法摘要
  • 被忽略的代币
  • 词汇标记
  • B. 3查询文件

这是你的选择:

简单甜蜜和短文档 Falcor JS VERSUS 巨大的企业级工具与长期和先进的文档作为 GraphQL & Relay

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

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

  • Falcor 返回 Observables,GraphQL 只返回值。对于 Netflix 希望如何使用 Falcor,这对他们来说意义重大。他们会发出多个请求,并在数据准备就绪时提供数据,但这也意味着客户端开发人员必须直接与 Observables 合作。GraphQL 是一个请求/响应模型,并返回 JSON,这非常容易使用。Relay 在只使用普通值进行维护的同时,又增加了 Falcor 所提供的一些动态性。
  • 类型系统。GraphQL 是根据类型系统定义的,这使我们能够构建许多有趣的工具,比如 GraphhiQL、代码生成器、错误检测等等。法尔科更有活力,这本身就很有价值,但限制了他做这种事情的能力。
  • 网络使用情况。GraphQL 最初是为了在低端网络的低端设备上运行 Facebook 的新闻订阅而设计的,所以它在很大程度上允许你在一个网络请求中声明所有你需要的东西,以便最小化延迟。另一方面,Falcor 经常执行多次往返以收集额外的数据。这实际上只是在简单的系统和网络控制之间的一种权衡。对于 Netflix,他们也处理非常低端的设备(如 Roku stick) ,但假设网络足够好,可以播放视频。

编辑: Falcor 确实可以 批处理请求,这使得关于网络使用的评论不准确

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

它们的不同之处在于它们呈现数据的方式:

  • Falcor 希望你把他们的数据想象成一个非常大的虚拟 JSON 树,并使用 走开准备好了打电话来读写数据。
  • GraphQL 希望您将它们的数据视为一组预定义的类型化对象,并使用 查询突变来读写数据。
  • Restful 希望您将它们的数据视为一组资源,并使用 HTTP 谓词来读写数据。

每当我们需要为用户提供数据时,我们都会得到一些类似的结果: client-> query-> { a Layer shift query into data ops }-> data。

在与 GraphQL、 Falcor 和 JSON API (甚至 ODdata)斗争之后,我编写了自己的 数据查询层数据查询层。它更简单、更容易学习,并且与 GraphQL 更相当。

你可在以下网址查阅:
Https://github.com/giapnguyen74/nextql

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

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

但他们怎么帮你?

基本上,他们都帮助我们管理和查询数据,但 GraphQL有一个 Req/res 模型和返回的数据作为 JSON,基本上在 GraphQL的想法是有一个单一的请求,以获得所有的数据在一个目标... 同时,有一个准确的请求准确的响应,所以有些东西运行在低速互联网和移动设备,如3G 网络... 所以,如果你有许多移动用户或出于某些原因,你希望有更少的请求和更快的响应,使用 GraphQL... 虽然 发色是不太远,所以读下去..。

另一方面,Netflix 的 法尔考通常有额外的请求(通常不止一次)来检索所有的数据,尽管他们试图将其改进为一个单一的请求... ... 法尔考对于查询来说更加有限,并且没有预定义的查询帮助程序,比如 range 等等。.

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

GraphQL,API 的查询语言

GraphQL 是用于 API 的查询语言和用于实现的运行时 这些查询与您的现有数据 API 中数据的可理解描述,为客户端提供 只要求他们需要的东西,仅此而已 随着时间的推移更容易发展 API,并支持强大的开发人员工具。

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

GraphQL 查询不仅访问一个资源的属性,而且 也可以顺利地跟踪它们之间的引用 需要从多个 URL 加载时,GraphQLAPI 将获取您的所有数据 应用程序需要在一个单一的请求。应用程序使用 GraphQL 可以快速甚至 慢速移动网络连接。

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


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

Falcor 允许您将所有远程数据源表示为一个 通过一个虚拟的 JSON 图形域模型 数据在哪里,是在客户端的内存中还是通过网络 在服务器上。

类似于 JavaScript 的路径语法使得访问起来非常容易 当你需要的时候,你可以检索你的数据 使用熟悉的 JavaScript 操作,如 get、 set 和 call 知道你的数据,你知道你的 API。

Falcor 将自动遍历图中的引用并使 根据需要请求。 Falcor 透明地处理所有网络 通信,机会批处理和欺骗请求。