【问题标题】:Falcor 和 GraphQL 有什么区别?
【发布时间】:2015-11-10 12:38:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: graphql relayjs falcor


【解决方案1】:

我查看了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 的强大功能是否胜过复杂性。

【讨论】:

    【解决方案2】:

    我现在已经使用这两个库编写了应用程序,并且我同意 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 已经两周没有官方回复了。

    【讨论】:

    • GraphQL (2012) 早在 React 和 Relay 之前就已经存在了,所以你的第一点可能并不完全准确。
    • 你可能是对的。我不是facebooker,所以我不能真正谈论历史。我的评论更多来自 facebook 的文档和谈话的当前状态。他们作为同伴被介绍给世界(facebook.github.io/react/blog/2015/02/20/…),并且都可以追溯到很长一段时间。我在 2015 年初的 cmets 中看到了一些关于 Relay 可以追溯到 3 年的模糊手势,因此两者可能都是在内部开发了几年之后才向外界展示的。但我当然没有什么特别的知识。
    【解决方案3】:

    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

    【讨论】:

    • NOT TRUE -> """另一方面,Falcor 经常执行多次往返以收集额外的数据。这实际上只是系统简单性和网络控制之间的权衡."""。只需检查 Falcor Batch 功能,它与 Relay 中的功能相同甚至更好。
    • @PrzeoR 感谢您的指正!我编辑了帖子!
    • 欢迎您 :-) 与 FalcorJS 相关的更多详细信息请点击此处:reactjs.co/2016/02/03/…
    • 很棒的文章 Falcor 确实很棒,不幸的是我是一名 Scala 开发人员,在 Scala 和任何其他语言中都没有 Falcor 实现,但是有 Sangria Scala 中的优秀 GraphQL 实现
    • 还有其他使用 redux 的中继替代方案,例如 apollo-clientcashay
    【解决方案4】:

    更新:我在我的帖子下发现了非常有用的评论,我想与您分享,作为对主要内容的补充:

    关于缺少示例,您可以找到 awesome-falcorjs 存储库 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 的前端开发人员都非常容易掌握。

    如果你有一个资源有限的敏捷项目 -> 那就选择 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 简单得多的文档,还可以查看文章“why you should care about falcorjs (netflix falcor)”。

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

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

    a) 中继:https://facebook.github.io/relay/docs/tutorial.html - 容器 - 路线 - 根容器 - 就绪状态 - 突变 - 网络层 - Babel 中继插件 - 图形

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

    • 中继

    • 中继容器
    • Relay.Route
    • Relay.RootContainer
    • Relay.QL
    • Relay.Mutation
    • Relay.PropTypes
    • Relay.Store
    • 接口

    • 中继网络层

    • RelayMutationRequest
    • 中继查询请求

    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片段内的变量使用
    • 2.2.9输入类型
    • 2.2.10 指令
    • 2.2.10.1片段指令
    • 3Type 系统
    • 3.1类型
    • 3.1.1标量
    • 3.1.1.1内置标量
    • 3.1.1.1.1Int
    • 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@include
    • 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.1 上下文无关语法
    • A.2 词法和句法语法
    • A.3 语法符号
    • A.4 语法语义
    • A.5 算法
    • B 附录:语法摘要
    • B.1忽略的令牌
    • B.2 词法标记
    • B.3查询文档

    这是你的选择:

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

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

    【讨论】:

    • 主观回答。不包括技术比较。更适合作为评论。
    • @GajusKuizinas 主观回答?检查两者的文档 ;-) 我只是说 Falcor 的学习速度越来越快 - 这是事实 ;-) 我也一直在使用两者 - 从长远来看,即使 FB 做得很好,简单也会赢得胜利炒作;-)
    • 这只是一种观点,根本无法回答问题。
    • 我认为这是一个很好的答案,直截了当,技术的学习曲线不一定是主观的,可以很容易地衡量,这里提供了事实,以便可以得出明确的结论。在现实世界中,严肃的专业人士会考虑这些事实。这毕竟是一个悬而未决的问题,显然可以从这样的答案中受益。
    • 我同意@MorgenCheng,赞成!过去几周我一直在评估 GraphQL/Relay、Cabay、Redux 和现在的 Falcor,我 100% 同意 PrzeoR。 Relay 和 GraphQL 是很棒的技术,但它们需要更多的脑力,而且对于新手来说更难掌握。涉及大量的学习。 Falcor 的缺点是缺乏完整的基于 CRUD 的应用程序的示例。而且我很想看到 PostgreSQL 和 RethinkDB 项目吐出 JsonGraph。
    【解决方案5】:

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

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

    • Falcor 希望您将他们的数据视为一个非常大的虚拟 JSON 树,并使用 getsetcall 来读取、写入数据。
    • GraphQL 希望您将他们的数据视为一组预定义的类型对象,并使用 queriesmutations 来读取、写入数据。
    • 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

    【讨论】:

    • 短而锋利。谢谢
    • 我同意你的意见。
    【解决方案6】:

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

    但是他们如何帮助你呢?

    基本上,它们都帮助我们管理和查询数据,但 GraphQL 有一个 req/res 模型,并将数据返回为 JSON ,基本上 GraphQL 中的想法是有一个单一的请求来获取一个目标中的所有数据......此外,通过有一个确切的请求来获得准确的响应,所以在低速互联网上运行的东西和移动设备,例如 3G 网络...因此,如果您有很多移动用户,或者出于某些原因希望减少请求并加快响应速度,请使用 GraphQL... 而 Faclor 离这里不远,所以请继续阅读...

    另一方面,Netflix 的 Falcor 通常有额外的请求(通常不止一次)来检索您的所有数据,即使他们试图将其改进为单个请求... Falcor 对查询的限制更大,并且没有预定义的查询助手,例如 range 等...

    但为了更清楚,让我们看看他们每个人是如何自我介绍的:

    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 透明地处理所有网络 通信、机会性批处理和重复数据删除请求。

    【讨论】:

    • 我很想知道 Falcor 贡献者是否改进了库,他们今天似乎对 github 也有同样的兴趣。
    猜你喜欢
    • 2018-10-08
    • 2021-04-25
    • 2021-06-24
    • 2020-05-28
    • 2021-08-07
    • 2020-02-23
    • 2021-03-24
    • 2017-11-26
    • 2018-11-20
    相关资源
    最近更新 更多