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提到的权力与复杂性权衡的一部分 .
6 回答
我已经查看了Angular Air Episode 26: FalcorJS and Angular 2,其中Jafar Husain回答了GraphQL与FalcorJS的比较 . 这是摘要(释义):
FalcorJS和GraphQL正在解决同样的问题(查询数据,管理数据) .
重要的区别是GraphQL是一种查询语言而FalcorJS不是 .
当您向FalcorJS询问资源时,您非常明确地要求有限的一系列值 . FalcorJS确实支持范围之类的事情,例如:
genres[0..10]
. 但它不支持开放式查询,例如genres[0..*]
.GraphQL基于以下设置:给我所有记录,其中为true,按此顺序等 . 从这个意义上说,GraphQL查询语言比FalcorJS更强大 .
使用GraphQL,您可以使用强大的查询语言,但必须在服务器上解释该查询语言 .
Jafar认为,在大多数应用程序中,从客户端到服务器的查询类型共享相同的形状 . 因此,具有特定且可预测的操作(如get和set)会暴露更多利用缓存的机会 . 此外,许多开发人员熟悉使用REST架构中的简单路由器映射请求 .
最后的讨论解决了GraphQL带来的功能是否超过了复杂性 .
我现在已经用两个库编写了应用程序,我可以同意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问题在两周内没有得到官方回应 .
Lee Byron GraphQL背后的工程师之一做了一个AMA on hashnode,当被问到这个问题时,这是他的回答:
编辑: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/)更加高效 .
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 - 你可以在那里定义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图形实现是完成你的全栈开发项目的最佳方式 .
简而言之,Falcor或GraphQL或Restful解决了同样的问题 - 提供了一种有效查询/操作数据的工具 .
它们的不同之处在于它们如何呈现数据:
Falcor希望您将他们的数据视为一个非常大的虚拟JSON树,并使用 get , set 和 call 来读取,写入数据 .
GraphQL希望您将其数据视为一组预定义的类型对象,并使用 queries 和 mutations 来读取,写入数据 .
Restful希望您将其数据视为一组资源,并使用HTTP谓词来读取,写入数据 .
每当我们需要为用户提供数据时,我们最终会得到以下内容:客户端 - >查询 - > {层转换查询到数据操作} - >数据 .
在使用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 Model 并将数据作为 JSON 返回,基本上 GraphQL 中的想法是只有一个请求将所有数据都放在一个目标中...而且,有确切的响应通过提出确切的要求,可以在低速互联网和移动设备(如3G网络)上运行...因此,如果您有许多移动用户或出于某些原因,您希望获得更少的请求和更快的响应,请使用 GraphQL ......虽然 Faclor 离这不太远,所以请继续阅读......
另一方面,Netflix的 Falcor 通常会有额外的请求(通常不止一次)来检索你的所有数据,尽管他们试图将它改进为单个请求... Falcor 对于查询更有限并且没有预先 - 范围等等的定义查询助手......
但是为了更多的澄清,让我们看看每个人如何介绍自己: