GraphQL由类型系统,查询语言和执行语义,静态验证和类型内省组成,每个都在下面概述。为了指导您完成这些组件,我们编写了一个示例来说明GraphQL的各个部分。
- https://github.com/facebook/graphql
Falcor允许您通过虚拟JSON图表将所有远程数据源表示为单个域模型。无论数据位于何处,无论是在客户端的内存中还是通过服务器上的网络,您都可以采用相同的方式编码。
- http://netflix.github.io/falcor/
Falcor和GraphQL有什么区别(在Relay的背景下)?
我已经看过Angular Air Episode 26: FalcorJS and Angular 2,其中Jafar Husain回答GraphQL与FalcorJS的比较。这是摘要(释义):
genres[0..10]
。但它不支持开放式查询,例如genres[0..*]
。Jafar认为,在大多数应用程序中,从客户端到服务器的查询类型共享相同的形状。因此,具有特定且可预测的操作(如get和set)会暴露更多利用缓存的机会。此外,许多开发人员熟悉使用REST架构中的简单路由器映射请求。
最后的讨论解决了GraphQL带来的功能是否超过了复杂性。
我现在已经用两个库编写了应用程序,我可以同意Gajus帖子中的所有内容,但在我自己使用框架时发现了一些最重要的东西。
图形搜索背后的工程师之一Lee Byron做了一个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
更新:我发现我的帖子中非常有用的评论,我想与你分享作为主要内容的补充:
关于缺乏示例,你可以找到有用的真棒-falcorjs repo,有不同的Falcor CRUD用法的例子:https://github.com/przeor/awesome-falcorjs ......第二件事,有一本名为“Mastering Full Stack React Development”的书,其中也包括Falcor(学习的好方法)如何使用它):
以下原始帖子:
与Relay / GraphQL相比,FalcorJS(https://www.facebook.com/groups/falcorjs/)更加高效。
在我的简短摘要中:去找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
b)GrapQL:https://facebook.github.io/graphql/
这是你的选择:
简单的甜蜜和简短记录Falcor JS VERSUS巨大的企业级工具,具有GraphQL和Relay等长而高级的文档
正如我之前所说,如果你是一个掌握使用JSON概念的前端开发人员,那么Falcor团队的JSON图形实现是完成你的全栈开发项目的最佳方式。
简而言之,Falcor或GraphQL或Restful解决了同样的问题 - 提供了一种有效查询/操作数据的工具。
它们的不同之处在于它们如何呈现数据:
每当我们需要为用户提供数据时,我们最终会得到以下内容:客户端 - >查询 - > {层转换查询到数据操作} - >数据。
在使用GraphQL,Falcor和JSON API(甚至是ODdata)之后,我编写了自己的data query layer。它更简单,更容易学习,与GraphQL更相同。
请查看: https://github.com/giapnguyen74/nextql
它还与featherjs集成,用于实时查询/变异。 https://github.com/giapnguyen74/nextql-feathers
好吧,从一个简单但重要的区别开始,GraphQL是一个基于查询而Falcor不是!
但是他们如何帮助你呢?
基本上,它们都帮助我们管理和查询数据,但GraphQL有一个req / res模型并将数据作为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按类型和字段组织,而不是端点。从单个端点访问数据的全部功能。 GraphQL使用类型来确保应用程序仅询问可能的内容并提供明确且有用的错误。应用程序可以使用类型来避免编写手动解析代码。
Falcor,一个用于高效数据获取的JavaScript库
Falcor允许您通过虚拟JSON图表将所有远程数据源表示为单个域模型。无论数据位于何处,无论是在客户端的内存中还是通过服务器上的网络,您都可以采用相同的方式编码。
类似JavaScript的路径语法可以在您需要时轻松访问所需数据。您可以使用熟悉的JavaScript操作(如get,set和call)检索数据。如果您了解自己的数据,就会知道自己的API。
Falcor会自动遍历图表中的引用,并根据需要发出请求。 Falcor透明地处理所有网络通信,机会性地批处理和重复数据删除请求。