175

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

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

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

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

Falcor 和 GraphQL(在 Relay 的上下文中)有什么区别?

4

6 回答 6

134

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

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

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

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

于 2015-08-24T08:09:24.340 回答
81

我现在已经用这两个库编写了应用程序,并且我同意 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 issue 已经两周没有官方回复。
于 2015-09-21T18:48:14.060 回答
29

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

于 2016-05-13T05:49:53.323 回答
24

更新:我在我的帖子下发现了非常有用的评论,我想与您分享作为主要内容的补充: 在此处输入图像描述

关于缺少示例,您可以找到 awesome-falcorjs repo userful,有 Falcor 的 CRUD 用法的不同示例: https ://github.com/przeor/awesome-falcorjs ... 第二件事,有一本书叫“ Mastering Full Stack React Development ”,其中也包括 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 - 你在那里定义简单的路线(例如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 参考

  • 中继

  • 中继容器
  • 中继路由
  • 中继.RootContainer
  • 继电器.QL
  • 中继突变
  • Relay.PropTypes
  • 中继存储
  • 接口

  • 中继网络层

  • 中继突变请求
  • 中继查询请求

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

  • 2语言
  • 2.1源文本
  • 2.1.1Unicode
  • 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 Fragments 中的变量使用
  • 2.2.9输入类型
  • 2.2.10 指令
  • 2.2.10.1片段指令
  • 3型系统
  • 3.1类型
  • 3.1.1标量
  • 3.1.1.1内置标量
  • 3.1.1.1.1整数
  • 3.1.1.1.2浮点数
  • 3.1.1.1.3字符串
  • 3.1.1.1.4布尔值
  • 3.1.1.1.5ID
  • 3.1.2对象
  • 3.1.2.1对象字段参数
  • 3.1.2.2 对象字段弃用
  • 3.1.2.3对象类型验证
  • 3.1.3接口
  • 3.1.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.1@skip
  • 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枚举
  • 4.2.2.6输入对象
  • 4.2.2.7列表
  • 4.2.2.8非空
  • 4.2.2.9 结合 List 和 Non-Null
  • 4.2.3 __Field 类型
  • 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.2Fragment Spread类型存在
  • 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执行
  • 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.1JSON序列化
  • 7.2响应格式
  • 7.2.1数据
  • 7.2.2错误
  • A附录:符号约定
  • A.1 上下文无关语法
  • A.2词汇和句法语法
  • A.3 语法符号
  • A.4 语法语义
  • A.5算法
  • B附录:语法总结
  • B.1 被忽略的令牌
  • B.2 词法标记
  • B.3查询文件

这是你的选择:

简单而简短的 Falcor JS VERSUS 大型企业级工具,具有长而高级的文档,如 GraphQL&Relay

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

于 2016-03-14T14:15:46.900 回答
8

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

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

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

每当我们需要为用户提供数据时,我们都会得到一些喜欢的东西:客户端 -> 查询 -> {a layer translate query into data ops} -> 数据。

在与 GraphQL、Falcor 和 JSON API(甚至 ODdata)苦苦挣扎之后,我编写了自己的数据查询层。使用 GraphQL 更简单、更容易学习和更等效。

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

它还与 featherjs 集成以进行实时查询/变异。 https://github.com/giapnguyen74/nextql-feathers

于 2017-08-07T03:06:40.150 回答
2

好的,从一个简单但重要的区别开始,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 透明地处理所有网络通信、机会性地批处理和重复数据删除请求。

于 2018-01-01T20:54:34.633 回答