首页 文章

Falcor和GraphQL有什么区别?

提问于
浏览
148

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

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

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

6 回答

  • 119

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

    • FalcorJS和GraphQL正在解决同样的问题(查询数据,管理数据) .

    • 重要的区别是GraphQL是一种查询语言而FalcorJS不是 .

    • 当您向FalcorJS询问资源时,您非常明确地要求有限的一系列值 . FalcorJS确实支持范围之类的事情,例如: genres[0..10] . 但它不支持开放式查询,例如 genres[0..*] .

    • GraphQL基于以下设置:给我所有记录,其中为true,按此顺序等 . 从这个意义上说,GraphQL查询语言比FalcorJS更强大 .

    • 使用GraphQL,您可以使用强大的查询语言,但必须在服务器上解释该查询语言 .

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

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

  • 76

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

    • 可能最大的实际区别在于,大多数示例以及可能在GraphQL上完成的工作都集中在将GraphQL与Relay集成 - Facebook的系统用于将ReactJS小部件与其数据需求集成 . 另一方面,FalcorJS倾向于与窗口小部件系统分开操作,这意味着它可以更容易地集成到非React / Relay客户端,并且在与窗口小部件匹配窗口小部件数据依赖性方面它将自动减少 .

    • FalcorJS在客户端集成方面具有灵活性的另一面是它可以非常自以为是服务器需要采取行动 . FalcorJS确实有一个直接的"Call this Query over HTTP"能力 - 虽然Jafar Husain没有't seem to talk about it very much - and once you include those, the way the client libraries react to server information is quite similar except that GraphQL/Relay adds a layer of configuration. In FalcorJS, if you are returning a value for movie, your return value better say '电影', whereas in GraphQL, you can describe that even though the query returns '电影', you should put that in the client side datastore as '电影' . - 这是Gajus提到的权力与复杂性权衡的一部分 .

    • 在实际的基础上,GraphQL和Relay似乎更加发达 . Jafar Husain已经提到下一版本的Netflix前端将至少部分运行在FalcorJS上,而Facebook团队已经提到他们已经在 生产环境 中使用某些版本的GraphQL / Relay堆栈超过3年 .

    • 围绕GraphQL和Relay的开源开发者社区似乎正在蓬勃发展 . 围绕GraphQL和Relay有大量参与人数众多的支持项目,而我个人发现很少有FalcorJS . 此外,Relay(https://github.com/facebook/relay/pulse)的基本github存储库比FalcorJS(https://github.com/netflix/falcor/pulse)的github存储库活跃得多 . 当我第一次拉开Facebook回购时,示例被打破了 . 我打开了一个github问题,并在几小时内修复 . 另一方面,我在FalcorJS上开设的github问题在两周内没有得到官方回应 .

  • 21

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

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

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

  • 1

    更新:我在帖子中找到了非常有用的评论,我希望与您分享作为主要内容的补充内容:
    enter image description here

    关于缺乏示例,你可以找到有用的真棒-falcorjs repo,有不同的Falcor CRUD用法的例子:https://github.com/przeor/awesome-falcorjs ......第二件事,有一本名为“Mastering Full Stack React Development”的书,其中也包括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的前端开发人员 .

    如果你有一个资源有限的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简单得多的文档,并查看文章“why you should care about 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

    • 接口

    • RelayNetworkLayer

    • RelayMutationRequest

    • RelayQueryRequest

    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.6Lexical Tokens

    • 2.1.7Ignored Tokens

    • 2.1.8Punctuators

    • 2.1.9名字

    • 2.2Query文档

    • 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.1Int值

    • 2.2.7.2浮动值

    • 2.2.7.3Boolean Value

    • 2.2.7.4String Value

    • 2.2.7.5Enum值

    • 2.2.7.6清单 Value

    • 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.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.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.5Enums

    • 3.1.6输入对象

    • 3.1.7列表

    • 3.1.8Non-Null

    • 3.2指令

    • 3.2.1@skip

    • 3.2.2@include

    • 3.3启动类型

    • 4内省

    • 4.1一般原则

    • 4.1.1命名约定

    • 4.1.2文档

    • 4.1.3Deprecation

    • 4.1.4类型名称内省

    • 4.2Schema Introspection

    • 4.2.1 "__Type"类型

    • 4.2.2Type种类

    • 4.2.2.1标量

    • 4.2.2.2对象

    • 4.2.2.3联盟

    • 4.2.2.4接口

    • 4.2.2.5Enum

    • 4.2.2.6输入对象

    • 4.2.2.7列表

    • 4.2.2.8非空

    • 4.2.2.9组合列表和非空

    • 4.2.3 __Field类型

    • 4.2.4 __InputValue类型

    • 5Validation

    • 5.1操作

    • 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.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.5Values

    • 5.5.1输入对象字段唯一性

    • 5.6指令

    • 5.6.1定义了指令

    • 5.7Variables

    • 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可侵犯性

    • 7Response

    • 7.1序列化格式

    • 7.1.1JSON序列化

    • 7.2响应格式

    • 7.2.1数据

    • 7.2.2错误

    • 附录:符号约定

    • A.1无文字语法

    • A.2Lexical和Syntactical Grammar

    • A.3Grammar表示法

    • A.4Grammar语义学

    • A.5算法

    • 附录:语法摘要

    • B.1Ignored Tokens

    • B.2Lexical Tokens

    • B.3查询文件

    这是你的选择:

    Simple sweet and short documented Falcor JS VERSUS Huge-enterprise-grade tool with long and advanced documentation as GraphQL&Relay

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

  • 18

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

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

    • Falcor希望您将他们的数据视为一个非常大的虚拟JSON树,并使用 getsetcall 来读取,写入数据 .

    • GraphQL希望您将其数据视为一组预定义的类型对象,并使用 queriesmutations 来读取,写入数据 .

    • Restful希望您将其数据视为一组资源,并使用HTTP谓词来读取,写入数据 .

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

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

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

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

  • 5

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

    但他们如何帮助你呢?

    基本上,他们都帮助我们管理和查询数据,但是 GraphQL 有一个 req/res Model 并将数据作为 JSON 返回,基本上 GraphQL 中的想法是只有一个请求将所有数据都放在一个目标中...而且,有确切的响应通过提出确切的要求,可以在低速互联网和移动设备(如3G网络)上运行...因此,如果您有许多移动用户或出于某些原因,您希望获得更少的请求和更快的响应,请使用 GraphQL ......虽然 Faclor 离这不太远,所以请继续阅读......

    另一方面,Netflix的 Falcor 通常会有额外的请求(通常不止一次)来检索你的所有数据,尽管他们试图将它改进为单个请求... Falcor 对于查询更有限并且没有预先 - 范围等等的定义查询助手......

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

    GraphQL,API的查询语言GraphQL是API的查询语言,是使用现有数据完成这些查询的运行时 . GraphQL提供了API中数据的完整且易于理解的描述,使客户能够准确地询问他们需要什么,仅此而已,使API随着时间的推移更容易发展,并支持强大的开发人员工具 . 将GraphQL查询发送到您的API并获得您需要的内容,仅此而已没什么 . GraphQL查询始终返回可预测的结果 . 使用GraphQL的应用程序快速而稳定,因为它们控制着所获得的数据,而不是服务器 . GraphQL查询不仅可以访问一个资源的属性,还可以平滑地跟踪它们之间的引用 . 虽然典型的REST API需要从多个URL加载,但GraphQL API可以在一个请求中获取您的应用所需的所有数据 . 即使在慢速移动网络连接上,使用GraphQL的应用也可以快速完成 . GraphQL API按类型和字段组织,而不是 endpoints . 从单个 endpoints 访问数据的全部功能 . GraphQL使用类型来确保应用程序仅询问可能的内容并提供明确且有用的错误 . 应用程序可以使用类型来避免编写手动解析代码 .

    Falcor,一个用于高效数据获取的JavaScript库Falcor允许您通过虚拟JSON图表将所有远程数据源表示为单个域模型 . 无论数据位于何处,无论是在客户端的内存中还是通过服务器上的网络,您都可以采用相同的方式编码 . 类似JavaScript的路径语法可以在您需要时轻松访问所需数据 . 您可以使用熟悉的JavaScript操作(如get,set和call)检索数据 . 如果您了解自己的数据,就会知道自己的API . Falcor会自动遍历图表中的引用,并根据需要发出请求 . Falcor透明地处理所有网络通信,机会性地批处理和重复数据删除请求 .

相关问题