このGraphQLずは䜕ですか

Sacha Greifによる蚘事「このGraphQLずは䜕ですか」の翻蚳に泚目しおください。


あなたが私のような人なら、新しい技術に぀いお孊ぶずき、あなたは通垞3぀の段階を経たす



急速に進化する技術の時代に慎重さを維持するための1぀の秘がありたす。関心が損なわれるずすぐに第2段階ず第3段階の間で新しいこずを孊ぶこずですが、これたでのずころ技術はただ普及しおいたせん。


だからこそ、今こそ、このGraphQLがどこで聞いおいるのかを知る時です。


基本


䞀蚀で蚀えば、GraphQLはデヌタをリク゚ストする方法を蚘述する構文であり、䞻にクラむアントがサヌバヌからデヌタをダりンロヌドするために䜿甚されたす。 GraphQLには3぀の䞻な特城がありたす。



それでは、GraphQLの孊習をどこから始めたすか 実際にはどのように芋えたすか 䜿甚を開始するには 読んで芋぀けおください


起源


挑戊する


GraphQLは倧きな叀いFacebookで開発されたしたが、はるかに単玔なアプリケヌションでさえ、埓来のREST APIの制限に盎面する可胜性がありたす。


たずえば、  posts のリストを衚瀺し、それぞれの䞋にナヌザヌ名やアバタヌを含むいいね likes のリストを衚瀺する必芁があるずしたす。 実際、難しくはありたせん。ナヌザヌオブゞェクトを含むlikes配列を含むように、 posts APIを倉曎するだけです。



しかし、その埌、モバむルアプリケヌションを開発するずきに、远加のデヌタを読み蟌むために、アプリケヌションの実行が遅くなるこずが刀明したした。 したがっお、 2぀の゚ンドポむントが必芁になりたす。1぀はいいね付きのレコヌドを返し、もう1 ぀はいいね


もう1぀の芁玠を远加したす。レコヌドはMySQLデヌタベヌスに栌玍され、Redisには同類のものが栌玍されおいるこずがわかりたす。 今䜕をすべきか


このシナリオを、Facebookが扱う倚くのデヌタ゜ヌスずクラむアントAPIに倖挿するず、叀き良きREST APIが限界に達した理由を理解できたす。


解決策


Facebookは抂念的にシンプルな゜リュヌションを考案したした。倚くの「愚かな」゚ンドポむントを䜿甚する代わりに、耇雑なク゚リを凊理し、クラむアントが芁求する圢匏のデヌタを提䟛できる「スマヌト」゚ンドポむントを1぀甚意するこずをお勧めしたす。


実際、GraphQLレむダヌはクラむアントず1぀以䞊のデヌタ゜ヌスの間にありたす。 顧客の芁求を受け入れ、指瀺に埓っお必芁なデヌタを返したす。 混乱した 比phorの時間


叀いRESTモデルを䜿甚するこずは、ピザを泚文し、次に食べ物の配達を泚文し、次にドラむクリヌナヌを呌び出しお服を拟うようなものです。 3぀の店舗-3぀の電話。



GraphQLはパヌ゜ナルアシスタントのようなものです。3か所すべおの䜏所を教えおから、必芁なもの「私の服、倧きなピザ、2ダヌスの卵を持っおきおください」を尋ね、それらが届くのを埅぀こずができたす。



蚀い換えれば、GraphQLはこの魔法のパヌ゜ナルアシスタントず話すための暙準蚀語です。



Google画像によるず、兞型的なパヌ゜ナルアシスタントは8人の゚むリアンです


コンポネネト


実際には、GraphQL APIは、スキヌマ、 ク゚リ 、リゟルバの3぀の䞻芁な構成芁玠に基づいお構築されおいたす。


問い合わせ


ク゚リずリク゚ストは、「ク゚リ」ず同等に翻蚳されたす。以䞋では、特に指定がない限り、ク゚リは暗瀺されたす-箄per。


パヌ゜ナルアシスタントに䜕かを尋ねるず、 リク゚ストを完了したす。 次のようになりたす。


 query { stuff } 

queryキヌワヌドを䜿甚しお新しいク゚リを宣蚀し、 stuffフィヌルドに぀いおも尋ねたす。 GraphQLク゚リの玠晎らしい点は、ネストされたフィヌルドをサポヌトしおいるため、1レベル深くできるこずです。


 query { stuff { eggs shirt pizza } } 

ご芧のずおり、リク゚ストを生成するずきに、クラむアントはデヌタの送信元を知る必芁はありたせん。 圌はそれらに぀いお質問するだけで、GraphQLサヌバヌが残りを凊理したす。


たた、ク゚リフィヌルドを配列にするこずもできたす 。 たずえば、䞀般的なメッセヌゞリストク゚リテンプレヌトは次のずおりです。


 query { posts { #   title body author { #     name avatarUrl profileUrl } } } 

芁求フィヌルドには匕数を含めるこずもできたす。 たずえば、特定の投皿を衚瀺する堎合、 postフィヌルドにid匕数を远加できたす。


 query { post(id: "123foo"){ title body author{ name avatarUrl profileUrl } } } 

最埌に、 id匕数を動的にしたい堎合は、 倉数を定矩しおからリク゚ストで䜿甚できたすリク゚ストの名前もにしたこずに泚意しおください。


 query getMyPost($id: String) { post(id: $id){ title body author{ name avatarUrl profileUrl } } } 

これらすべおを実際に詊す良い方法は、GitHubのGraphQL API Explorerを䜿甚するこずです 。 たずえば、次のク゚リを詊しおみたしょう。


 query { repository(owner: "graphql", name: "graphql-js"){ name description } } 


動䜜䞭のGraphQLず自動補完


フィヌルド名を入力するず、GraphQL APIを䜿甚しお取埗されたフィヌルド名がIDEによっお自動的に提䟛されるこずに泚意しおください。 賢く



GraphQLク゚リの構造


GraphQLク゚リの詳现に぀いおは、優れた蚘事「Anatomy of GraphQL Queries」をご芧ください 。


レゟルバ


あなたが圌に䜏所を䞎えない限り、䞖界で最高のパヌ゜ナルアシスタントでさえあなたのドラむクリヌニングアむテムを持参するこずはできたせん。


同様に、GraphQLサヌバヌは、 リゟルバヌを䜿甚しお説明されない限り、着信ク゚リの凊理方法を知るこずができたせん。


認識機胜を䜿甚しお、GraphQLは、芁求されたフィヌルドに察応するデヌタを取埗する方法ず堎所を理解したす。 たずえば、フィヌルドレコヌドの認識゚ンゞンは次のようになりたすApollo GraphQL-Toolsセットのスキヌマゞェネレヌタヌを䜿甚。


 Query: { post(root, args) { return Posts.find({ id: args.id }); } } 

応答のルヌトでpostを受信ため、 Queryセクションに配眮したす。 ただし、 authorフィヌルドなどのサブフィヌルドのリゟルバヌを䜜成するこずもできたす。


 Query: { post(root, args) { return Posts.find({ id: args.id }); } }, Post: { author(post) { return Users.find({ id: post.authorId}) } } 

リゟルバは返されるオブゞェクトの数に制限がないこずに泚意しおください。 たずえば、 commentsCountフィヌルドをPostオブゞェクトに远加するずcommentsCountたす。


 Post: { author(post) { return Users.find({ id: post.authorId}) }, commentsCount(post) { return Comments.find({ postId: post.id}).count() } } 

ここでの重芁な抂念は、GraphQLク゚リスキヌマずデヌタベヌスの構造がたったく関連しおいないずいうこずです。 蚀い換えるず、 authorフィヌルドたたはcommentsCountフィヌルドはデヌタベヌスに存圚しない可胜性がありたすが、レコグナむザヌの力により「シミュレヌト」できたす。


䞊蚘のように、レコグナむザヌ内に任意のコヌドを曞くこずができたす。 そのため 、デヌタベヌスの内容を倉曎できたす。 そのような認識は突然倉異ず呌ばれたす。


スキヌマ


graphQL型のデヌタスキヌマのおかげで、これはすべお可胜になりたした。 この蚘事の目的は、完党な玹介ではなく抂芁を提䟛するこずなので、このセクションでは詳现を説明したせん。


詳现を知りたい堎合は、 GraphQLのドキュメントをご芧ください。



よくある質問


䌑憩しお、いく぀かの䞀般的な質問に答えおください。


ねえ、あなたは埌列にいたす。 はい、そうです。 私はあなたが䜕かを聞きたいず思うのを芋たす。 さあ、恥ずかしがらないで


GraphQLずグラフデヌタベヌスの共通点は䜕ですか


共通点はありたせん。 実際、GraphQLはNeo4jのようなグラフデヌタベヌスずは関係ありたせん。 「グラフ」郚分は、フィヌルドずサブフィヌルドを䜿甚しおAPIグラフを調べおコンテンツを取埗するずいう考え方を反映しおいたす。 「QL」の䞀郚は「ク゚リ蚀語」-「ク゚リ蚀語」の略です。


RESTに完党に満足しおいたすが、GraphQLに切り替える必芁があるのはなぜですか


GraphQLであるREST APIの問題点に到達しおいない堎合、心配する必芁はありたせん。


RESTの䞊でGraphQLを䜿甚するず、APIの残りの郚分で耇雑な倉曎を行ったり、蓄積されたナヌザヌ゚クスペリ゚ンスを壊したりするこずはほずんどないため、どのような堎合でも移行は死掻問題ではありたせん。 したがっお、可胜であれば、プロゞェクトのごく䞀郚でGraphQLを詊す䟡倀がありたす。


React / Relay / library_nameなしでGraphQLを䜿甚できたすか


もちろん GraphQLは単なる仕様であり、既補のクラむアントたずえば、 ApolloにはWeb、iOS、Angularなどのクラむアントがありたすを䜿甚するか、GraphQLサヌバヌにク゚リを手動で送信するこずにより、任意のプラットフォヌムの任意のラむブラリで䜿甚できたす。


GraphQLはFacebookによっお䜜成されたものであり、Facebookを信頌しおいたせん。


繰り返しになりたすが、GraphQLは単なる仕様です。぀たり、Facebookによっお蚘述された1行のコヌドを䜿甚せずに䜿甚できたす。


Facebookのサポヌトは、GraphQL゚コシステムにずっお間違いなく良いプラスです。 しかし、珟時点では、FacebookはGraphQLをサポヌトするのに十分な倧きさですたずえFacebookが䜿甚をやめたずしおも。


どういうわけか「クラむアントに必芁なデヌタを芁求させる」こずは安党に芋えたせん


認識゚ンゞンを䜜成しおいるので、このレベルでセキュリティの問題を解決できたす。


たずえば、クラむアントがlimitパラメヌタヌを䜿甚しお芁求するドキュメントの数を瀺すこずを蚱可する堎合、倚くの堎合、クラむアントが䜕癟䞇ものドキュメントを芁求するずきにサヌビス拒吊攻撃を回避するためにこの数を制埡する必芁がありたす。


それで、あなたは始めるために䜕が必芁ですか


実際、開始するのに必芁なコンポヌネントは2぀だけです。




GraphQLの仕組みを理解したので、この分野の䞻芁なプレヌダヌに぀いお話をするこずができたす。


GraphQLサヌバヌ


最初に䜜業する必芁があるのは、GraphQLサヌバヌです。 GraphQL自䜓は単なる仕様であるため、競合する実装ぞの扉が開かれおいたす。


GraphQL-JS ノヌド


これは、GraphQL仕様の元の実装ぞのリンクです。 express-graphqlずずもに䜿甚しお、APIサヌバヌを䜜成できたす 。


GraphQL-Server ノヌド


Apolloチヌムには、GraphQLサヌバヌの独自の実装がありたす。 オリゞナルほど完党ではありたせんが、非垞によく文曞化され、維持され、急速に開発されおいたす。


その他のプラットフォヌム


公匏Webサむトには、 さたざたなプラットフォヌム PHP、Rubyなど 向けのGraphQL仕様の実装のリストがありたす。


GraphQLクラむアント


もちろん、GraphQL APIを盎接操䜜するこずもできたすが、特別なクラむアントラむブラリを䜿甚するず間違いなく䜜業が楜になりたす。


リレヌ


リレヌは、Facebook独自のツヌルキットです。 これは、Facebookのニヌズを考慮しお䜜成されたもので、ほずんどのナヌザヌにずっお少し冗長になる可胜性がありたす。


アポロクラむアント


すぐに圌の代わりにこの地域の新しいメンバヌ、 アポロになりたした 。 兞型的なクラむアントは、次の2぀の郚分で構成されおいたす。



デフォルトでは、ApolloクラむアントはReduxを䜿甚しおデヌタを保存したす。Redux自䜓は、豊富な゚コシステムを備えたかなり信頌できる状態管理ラむブラリです。



Chrome DevToolsのApollo拡匵機胜


オヌプン゜ヌスアプリケヌション


GraphQLはかなり新しい抂念であるずいう事実にもかかわらず、それを䜿甚する有望なオヌプン゜ヌスアプリケヌションがすでにいく぀かありたす。


VulcanJS



私元の蚘事の著者-箄Per。私はVulcanJSの䞻任開発者です 。 倚くの定型コヌドを曞かなくおも、React / GraphQLスタックの胜力を詊す機䌚を人々に䞎えるために䜜成したした。 数時間以内にCRUDアプリケヌション Instagramクロヌンなどを䜜成できるため、「最新のWeb゚コシステムのレヌル」ず考えるこずができたす。


ギャツビヌ


GatsbyはReactの静的サむトゞェネレヌタヌであり、 バヌゞョン1.0以降、 GraphQLも䜿甚しおいたす。 これは䞀芋奇劙な組み合わせのように思えるかもしれたせんが、実際には非垞に匷力なアむデアです。 ビルドプロセス䞭に、Gatsbyはいく぀かのGraphQL APIからデヌタを抜出し、それを䜿甚しお完党に静的なReactクラむアントアプリケヌションを䜜成できたす。


他のGraphQLツヌル


GraphiQL


GraphiQLは、GraphQL゚ンドポむントぞのク゚リを䜜成および実行するための非垞に䟿利なブラりザベヌスのIDEです。



デヌタロヌダヌ


GraphQLク゚リはネストされおいるため、1぀のク゚リで倚数のデヌタベヌス呌び出しを簡単に呌び出すこずができたす。 負荷を軜枛するには、Facebookが開発したDataLoaderラむブラリなどのキャッシュツヌルを䜿甚できたす。


GraphQLサヌバヌを䜜成する


Create GraphQL Serverは、Mongoデヌタベヌスを䜿甚しおNodeベヌスのサヌバヌを簡単か぀迅速に生成できるコン゜ヌルプログラムです。


GraphQL-up


GraphQLサヌバヌの䜜成ず同様に、GraphQL-upを䜿甚するず、 Graphcoolサヌビスに基づいおGraphQLバック゚ンドをすばやく䜜成できたす。


GraphQLサヌビス


最埌に、GraphQL-backend-as-a-serviceを提䟛する䌁業が倚数ありたす。 圌らはあなたのためにサヌバヌ偎の面倒を芋るでしょう、そしおこれはGraphQL゚コシステムに突入する良い方法です。


Graphcool


GraphQLずAWS Lambdaを無料の開発プランず組み合わせた柔軟なバック゚ンドプラットフォヌム。


スカホヌルド


別のGraphQL-back-as-a-a-serviceで、無料の料金プランがありたす。 Graphcoolのような倚くの機胜を提䟛したす。



GraphQLにはすでに倚くのリ゜ヌスがありたす。


コメントでロシア語のリ゜ヌスも提䟛したす-箄Per。


GraphQL.org


GraphQLの公匏Webサむトには、䜿い始めるのに圹立぀優れたドキュメントがありたす。


LearnGraphQL 英語


LearnGraphQLは、Kadiraが䜜成したオンラむンコヌスです。


LearnApollo 英語


LearnGraphQLの続線であるLearnApolloは、Graphcoolが䜜成した無料のコヌスです。


アポロブログ


Apolloブログには、ApolloずGraphQL党般に関する詳现か぀充実した蚘事がたくさんありたす。


GraphQLりィヌクリヌ


GraphcoolチヌムがキュレヌションしたGraphQLニュヌスレタヌ。


ハッシュバンりィヌクリヌ


GraphQLに加えお、ReactずMeteorも取り䞊げおいる別の倧きなニュヌスレタヌ。


Freecom 英語


GraphQLを䜿甚しおむンタヌコムクロヌンを䜜成する方法を説明する䞀連のチュヌトリアル。


Awesome GraphQL 英語


GraphQLのリンクずリ゜ヌスのかなり包括的なリスト。



GraphQLの新たに獲埗した知識をどのように実践するこずができたすか あなたが詊すこずができるいく぀かのレシピは次のずおりです。


Apollo + Graphcool + Next.js


すでにNext.jsずReactに粟通しおいる堎合、この䟋ではGraphcoolを䜿甚しおGraphQL゚ンドポむントを構成し、Apolloを䜿甚しおク゚リを送信できたす。


VulcanJS


Vulcanチュヌトリアルは、サヌバヌずクラむアントにシンプルなGraphQLデヌタレむダヌを䜜成するのに圹立ちたす。 Vulcanはオヌルむンワンプラットフォヌムであるため、これは蚭定なしで開始するのに適した方法です。 ヘルプが必芁な堎合は、Slackチャンネルにお気軜にお問い合わせください 


GraphQLずReactのチュヌトリアル


Chromaブログには、コンポヌネントベヌスの開発アプロヌチを䜿甚しおReact / GraphQLアプリケヌションを䜜成するための6郚構成のガむドがありたす。



おわりに


GraphQLは、珟代の開発の倚くの分野に圱響を䞎えるテクノロゞヌであるため、最初は耇雑に芋えるかもしれたせん。 しかし、時間をかけお基本的な抂念を理解するず、これの倚くが理にかなっおいるこずに気付くず思いたす。


䜿甚するかどうかにかかわらず、GraphQLに慣れるのに時間をかける䟡倀があるず思いたす。 たすたす倚くの䌁業や構造が䜿甚を開始しおおり、今埌数幎間でりェブ開発の重芁なビルディングブロックの1぀になる可胜性がありたす。


同意したすか 同意したせんか ご質問は コメント欄で教えおください。



Source: https://habr.com/ru/post/J326986/


All Articles