FalcorとGraphQLの違いは何ですか?


163

GraphQLは、型システム、クエリ言語と実行セマンティクス、静的検証、および型イントロスペクションで構成されています。これらの各コンポーネントについて説明するために、GraphQLのさまざまな部分を説明するために設計された例を作成しました。

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

Falcorでは、すべてのリモートデータソースを仮想JSONグラフを介して単一のドメインモデルとして表すことができます。クライアントのメモリ内にあるか、サーバー上のネットワーク上にあるかに関係なく、データがどこにあっても同じ方法でコーディングします。

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

FalcorとGraphQL(Relayのコンテキスト)の違いは何ですか?


5
ジャファルはリレー/ GraphQLとFalcor / JSONグラフの違いを語るこのポッドキャストをチェックアウトyoutu.be/WL54eYbTJUw?t=53m55s
gdi2290

回答:


131

私は、閲覧しているFalcorJSと角2:角度エアエピソード26 ジャファルフサインがどのように答えるGraphQLは、と比較FalcorJSを。これは要約です(言い換え):

  • FalcorJSとGraphQLは同じ問題(データのクエリ、データの管理)に取り組んでいます。
  • 重要な違いは、GraphQLはクエリ言語であり、FalcorJSはそうでないことです。
  • FalcorJSにリソースを要求する場合、有限の一連の値を非常に明示的に要求します。FalcorJSは、範囲などをサポートしていgenres[0..10]ます。ただし、オープンエンドのクエリはサポートされていませんgenres[0..*]
  • GraphQLは、ベースで設定されています。trueですべてのレコードを取得し、これで並べ替えます。この意味で、GraphQLクエリ言語はFalcorJSよりも強力です。
  • GraphQLには強力なクエリ言語がありますが、サーバー上でそのクエリ言語を解釈する必要があります。

Jafar氏は、ほとんどのアプリケーションでは、クライアントからサーバーに送信されるクエリのタイプは同じ形を共有していると主張しています。したがって、getやsetなどの特定の予測可能な操作を行うと、キャッシュを活用する機会が増えます。さらに、開発者の多くは、RESTアーキテクチャーで単純なルーターを使用してリクエストをマッピングすることに慣れています。

最後の議論では、GraphQLに付属するパワーが複雑さを上回っているかどうかについて解決します。


82

現在、両方のライブラリーを使用してアプリを作成しており、Gajusの投稿のすべてに同意できますが、フレームワークの使用において最も重要ないくつかの異なる点を発見しました。

  • おそらく最大の実用的な違いは、GraphQLのこの時点までに行われたほとんどの例と作業は、GraphQLをRelayと統合することに集中していることです-FacebookのシステムでReactJSウィジェットとデータ要件を統合します。一方、FalcorJSは、ウィジェットシステムとは別に動作する傾向があります。つまり、React / Relay以外のクライアントに統合する方が簡単であり、ウィジェットデータの依存関係とウィジェットを自動的に照合するという点で、自動的に効率が低下します。
  • FalcorJSがクライアント側の統合に柔軟であることの裏側は、サーバーがどのように動作する必要があるかについて非常に意見が分かれることです。FalcorJSは実際には「Call this Query over HTTP」機能を備えていますが、Jafar Husainはそれについてあまり話していないようですが、これらを含めると、クライアントライブラリがサーバー情報に反応する方法は非常に似ていますが、 GraphQL / Relayは設定のレイヤーを追加します。FalcorJSでは、映画の値を返す場合、戻り値は「映画」と言う方がよいのに対し、GraphQLでは、クエリが「映画」を返しても、クライアント側のデータストアに「映画」として配置する必要があると説明できます。 '。-これは、ガジュスが述べたパワーと複雑さのトレードオフの一部です。
  • 実際には、GraphQLとRelayはより開発されているようです。Jafar Husainは、Netflixフロントエンドの次のバージョンが少なくとも部分的にFalcorJSで実行されると述べたのに対し、Facebookチームは、本番環境であるバージョンのGraphQL / Relayスタックを3年以上使用していると述べました。
  • GraphQLとRelayを中心としたオープンソース開発者コミュニティが活発になっているようです。私が個人的にFalcorJSの周りをほとんど見つけなかったのに対し、GraphQLとリレーの周りには多くのよくサポートされたサポートプロジェクトがあります。また、Relayのベースgithubリポジトリ(https://github.com/facebook/relay/pulse)は、FalcorJSのgithubリポジトリ(https://github.com/netflix/falcor/pulse)よりもはるかにアクティブです。私が最初にFacebookリポジトリをプルしたとき、例は壊れていました。私はgithubの問題を開き、それは数時間以内に修正されました。一方、FalcorJSで公開したgithubの問題は、2週間の間に公式な返答がありませんでした。

1
GraphQL(2012)は、React and Relayよりずっと前にあったため、最初のポイントは完全に正確ではない可能性があります。
Burgi

君の言う通りかもね。私はfacebookerではないので、歴史について話すことはできません。私のコメントは、facebookのドキュメンテーションと講演の現在の状態からさらに来ています。これらはコンパニオン(facebook.github.io/react/blog/2015/02/20/…)として世界に紹介され、どちらもかなり前に戻ってきました。2015年の初めに付けられたコメントで、Relayについての漠然とした手振りが3年前に見られたので、両方とも数年間社内で開発されてから、外部に提示された可能性があります。しかし、私は確かに特別な知識を持っていません。
OverclockedTim

25

GraphQLのエンジニアの1人であるLee Byron がhashnodeAMAを実行しました。この質問に対する彼の回答は次のとおりです。

  • FalcorはObservables、GraphQLだけの値を返します。NetflixがFalcorをどのように使用したかったかについては、これは彼らにとって非常に理にかなっています。それらは複数のリクエストを作成し、準備が整った状態でデータを提示しますが、クライアント開発者がObservableを直接操作する必要があることも意味します。GraphQLはリクエスト/レスポンスモデルであり、JSONを返します。これは非常に簡単に使用できます。リレーは、Falcorが提示するダイナミズムの一部を追加し、プレーンな値のみを使用して維持します。
  • 型システム。GraphQLは型システムの観点から定義されており、それにより、GraphiQL、コードジェネレーター、エラー検出などの多くの興味深いツールを構築できます。Falcorははるかに動的であり、それ自体は価値がありますが、実行する機能を制限しますこの種のもの。
  • ネットワークの使用状況。GraphQLはもともと、さらにローエンドのネットワーク上のローエンドデバイスでFacebookのニュースフィードを操作するために設計されていたため、レイテンシを最小限に抑えるために、1つのネットワークリクエストで必要なすべてを宣言できるように、非常に長くなっています。一方、Falcorは、追加のデータを収集するために複数のラウンドトリップを実行することがよくあります。これは、システムのシンプルさとネットワークの制御との間のトレードオフにすぎません。Netflixの場合、非常にローエンドのデバイス(Rokuスティックなど)も処理しますが、ネットワークはビデオをストリーミングするのに十分なものであると想定されています。

編集:Falcorは確かにバッチリクエストを行うことができるため、ネットワークの使用に関するコメントが不正確になります。@PrzeoRのおかげで


4
NOT TRUE-> "" "一方、Falcorは、追加のデータを収集するために複数のラウンドトリップを実行することがよくあります。これは、システムのシンプルさとネットワークの制御との間のトレードオフにすぎません。" "" Falcor Batchの機能を確認するだけで、Relayと同じかそれよりも優れています。
PrzeoR 2016

1
@PrzeoR訂正ありがとうございます!投稿を編集しました!
YasserKaddour

:あなたは歓迎:-)ここでは詳細はFalcorJSチェックに関連しているreactjs.co/2016/02/03/...
PrzeoR

素晴らしい記事は確かに素晴らしいです。残念ながら私はScala開発者であり、Scalaや他の言語でのFalcor実装はありませんが、SangriaはScalaの優れたGraphQL実装です
YasserKaddour


21

更新:私の投稿の下に、メインコンテンツの補足として非常に役立つコメントを見つけました。 ここに画像の説明を入力してください

例の欠如に関しては、awesome-falcorjsリポジトリが有用であることがわかります。FalcorのCRUDの使用にはさまざまな例があります。https//github.com/przeor/awesome-falcorjs ...次に、「Falcorも含むフルスタックReact開発の習得(使用方法を学ぶ良い方法):

ここに画像の説明を入力してください

以下の元の投稿:

FalcorJS(https://www.facebook.com/groups/falcorjs/)は、Relay / GraphQLと比較して、効率がはるかに簡単です。

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をインポートします。

そして、それに基づいてモデルを構築します。

...あなたがバックエンドで使い方が簡単で2つのライブラリも必要です。)falcor発現する-あなたは(例:一度それを使用app.use(「/ model.json」、FalcorServer.dataSourceRoute(()=>新しい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よりもはるかに簡単なドキュメントを参照したり、「falcorjs(netflix falcor)に注意する必要がある理由」の記事を確認したりすることもできます

2)Relay / GraphQLは、巨大なエンタープライズツールのようです。

たとえば、別々に話している2つの異なるドキュメントがあるとします。

a)リレー:https : //facebook.github.io/relay/docs/tutorial.html-コンテナ-ルート-ルートコンテナ-レディステート-ミューテーション-ネットワークレイヤー-バベルリレープラグイン-GRAPHQL

  • GraphQLリレー仕様
  • オブジェクトの識別
  • 接続
  • 突然変異
  • 参考文献
  • APIリファレンス

  • リレー

  • リレーコンテナ
  • 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.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.1Int値
  • 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.8Non-Null
  • 3.2ディレクティブ
  • 3.2.1 @スキップ
  • 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リストと非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.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.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グラフの実装が、フルスタックの開発プロジェクトを行うための最良の方法です。


13
主観的な答え。技術的な比較は含まれません。コメントとしてより適切です。
Gajus

2
@GajusKuizinas主観的な答え?両方のドキュメントを確認してください;-)私はFalcorの方が学習が速くて速いと言っています-それは事実です;-)また、両方で作業してきました-FBが素晴らしいことをしているとしても、単純化は長期的には勝つでしょう誇大広告での仕事;-)
PrzeoR 2016年

2
それは単なる意見であり、質問にはまったく答えません。
のMichałMiszczyszyn

14
これは素晴らしい答えだと思います。要するに、テクノロジーの学習曲線は必ずしも主観的ではなく、簡単に測定できます。ここでは、明確な結論を導き出すことができるように、事実を提示しています。現実の世界では、真面目な専門家がこれらの事実を考慮に入れています。結局のところ、これは未解決の質問であり、このような答えから明らかに利益を得ます。
bmaggi 2016年

2
私は賛成票@MorgenChengに同意します!私は過去2週間、GraphQL / Relay、Cashay、Redux、そして今はFalcorを評価するラウンドを行っており、PrzeoRに100%同意しています。RelayとGraphQLは素晴らしいテクノロジーですが、より多くの頭脳力が必要であり、初心者にとって簡単に理解することはできません。かなりの量の学習が関わっています。Falcorの欠点は、完全なCRUDベースのアプリの例がないことです。そして、PostgreSQLとRethinkDBのプロジェクトがJsonGraphを吐き出すのを見たいです。
Dom

5

つまり、Falcor、GraphQL、Restfulは同じ問題を解決します-データを効果的にクエリ/操作するためのツールを提供します。

それらがどのように異なるかは、データの表示方法にあります。

  • Falcorはあなたに彼らのデータを非常に大きな仮想JSONツリーと考えてもらいgetset、およびcallを使用しますをてデータの読み取りと書き込みを行います。
  • GraphQLは、データを事前定義された型付きオブジェクトのグループと見なして、クエリミューテーションを使用することを求めていますてデータの読み取りと書き込みを行うことを求めています。
  • Restfulは、データをリソースのグループとして考えることを望み、HTTP動詞を使用してデータの読み取りと書き込みを行います。

ユーザーにデータを提供する必要があるときはいつでも、クライアント->クエリ-> {クエリをデータオペレーションに変換するレイヤー}->データのような結果になります。

GraphQL、Falcor、JSON API(さらにはODdata)に取り組んだ後、独自のデータクエリレイヤーを作成しました。それは、より簡単で、学習しやすく、GraphQLと同等です。

https://github.com/giapnguyen74/nextqlで確認して
ください。

また、リアルタイムのクエリ/変異のためにfeatherjsと統合します。 https://github.com/giapnguyen74/nextql-feathers


2

OK、単純ですが重要な違いから始めましょう。GraphQLはクエリベースですが、Falcorそうではありません!

しかし、彼らはどのようにあなたを助けますか?

基本的に、どちらもデータの管理とクエリに役立ちますが、GraphQLにはreq / resモデルがあり、データをJSONとして返します。基本的に、GraphQLのアイデアは、1つの目標ですべてのデータを取得するための単一のリクエストを持っています...また、正確な要求があることで正確な応答が得られるので、低速のインターネットや3Gネットワ​​ークなどのモバイルデバイスで実行できるものがあります...したがって、多くのモバイルユーザーがいる場合や、何らかの理由で要求を減らして応答を速くしたい場合、GraphQLを使用してください ... Faclorこれからそれほど遠くないので、読んでください...

一方、Falcor by Netflixは、通常、すべてのデータを取得するために追加のリクエスト(通常は複数回)を必要とします。ただし、Falcorは単一の要求にデータを改善しようとしていますが... -範囲などの定義済みクエリヘルパー...

しかし、より明確にするために、それらのそれぞれがどのように自己紹介するかを見てみましょう:

APIのクエリ言語であるGraphQL

GraphQLは、APIのクエリ言語であり、既存のデータでこれらのクエリを実行するためのランタイムです。GraphQLは、API内のデータの完全で理解可能な説明を提供し、クライアントが必要なものだけを正確に要求できるようにし、APIを長期間にわたって簡単に進化させ、強力な開発者ツールを有効にします。

GraphQLクエリをAPIに送信して、必要なものを正確に取得します。GraphQLクエリは常に予測可能な結果を​​返します。GraphQLを使用するアプリは、サーバーではなく取得するデータを制御するため、高速で安定しています。

GraphQLクエリは、1つのリソースのプロパティだけでなく、それらの間の参照をスムーズにたどります。典型的なREST APIは複数のURLからロードする必要がありますが、GraphQL APIはアプリが必要とするすべてのデータを単一のリクエストで取得します。遅いモバイルネットワーク接続でも、GraphQLを使用するアプリは高速です。

GraphQL APIは、エンドポイントではなく、タイプとフィールドの観点から整理されています。単一のエンドポイントからデータのすべての機能にアクセスします。GraphQLはタイプを使用して、アプリが可能なことのみを要求し、明確で役立つエラーを提供するようにします。アプリは型を使用して、手動の解析コードを記述することを回避できます。


Falcor、効率的なデータ取得のためのJavaScriptライブラリ

Falcorでは、すべてのリモートデータソースを仮想JSONグラフを介して単一のドメインモデルとして表すことができます。クライアントのメモリ内にあるか、サーバー上のネットワーク上にあるかに関係なく、データがどこにあっても同じ方法でコーディングします。

JavaScriptのようなパス構文により、必要なときに必要なだけ多くのデータまたは少ないデータに簡単にアクセスできます。get、set、callなどの使い慣れたJavaScript操作を使用してデータを取得します。データを知っていれば、APIも知っています。

Falcorは自動的にグラフ内の参照をトラバースし、必要に応じてリクエストを行います。Falcorはすべてのネットワーク通信を透過的に処理し、日和見的にバッチ処理および重複除外要求を処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.