- HOME >
- Jamstack用語集 >
- Apollo
Apollo
アポロ
Apollo を分かりやすく
Apolloとは何かというと、GraphQLクライアントの一つです。ちょっと待って、「GraphQLって何?」って思うかもしれませんね。GraphQLはFacebookが開発したデータ取得のためのクエリ言語で、RESTful APIとは異なるアプローチを提供します。
難しいですよね?例え話で説明してみます。
あなたがレストランに行って、メニューから料理を頼むとしましょう。RESTful APIの世界では、レストランはセットメニューしか提供していません。ビーフステーキのセットを頼むと、それに付いてくるサラダ、スープ、デザートも一緒に来ます。でも、あなたがサラダが嫌いだとしたらどうでしょう?残念ながら、それは選べません。それがセットなんですから。
ここでGraphQLとApolloが登場します。GraphQLのレストランでは、あなたが何を食べたいか具体的に指定できます。ビーフステーキだけ、それとデザート。サラダとスープはいらない、というように。これがGraphQLの力です。あなたが必要とするデータだけを取得できるんです。これは非常に効率的で、無駄なデータ転送を減らすわけです。
では、Apolloはどこに位置するのかというと、あなたとレストランの間に立つウェイターのようなものです。あなたが何を食べたいかをウェイターに伝えると、ウェイターがそれをキッチンスタッフに伝え、料理ができたらあなたのテーブルに運んできます。そして、何か問題があればウェイターが対応します。Apolloはそのような役割を果たします。要は、あなたがどのようなデータを必要としているかをGraphQLサーバーに伝え、結果を取得してくれるんですね。
Next.jsやJamstackでApolloを使用すると、非常に柔軟なデータ取得と効率的なパフォーマンスを得ることができます。あなたが作りたい料理(アプリケーション)に必要な材料(データ)だけを簡単に取得できるんです。それって素晴らしいと思いませんか?
少しまとめます。Apollo は、GraphQL を扱うためのクライアントライブラリです。GraphQL は、Facebook 社が提供するクエリ言語で、Web API の設計手法の 1 つです。GraphQL では、必要なデータだけを取得することができ、不要なデータを取得することがありません。Apollo を使うことにより、GraphQL のクエリとレスポンスを扱うことができます。
Apollo と React
Apollo は、React をはじめとした JavaScript フレームワークと連携することができます。React と Apollo を連携することにより、GraphQL からデータを取得し、React のコンポーネントに渡すことができます。
以下は、Next.js と TypeScript を使った Apollo の例です。
import { ApolloClient, InMemoryCache, gql } from '@apollo/client'
import { GetStaticProps } from 'next'
import { useState } from 'react'
type Post = {
id: string,
title: string,
body: string,
}
type Props = {
posts: Post[],
}
const client = new ApolloClient({
uri: '<https://jsonplaceholder.typicode.com/graphql>',
cache: new InMemoryCache(),
})
export const getStaticProps: GetStaticProps<Props> = async () => {
const { data } = await client.query({
query: gql`
query {
posts {
id
title
body
}
}
`,
})
return {
props: {
posts: data.posts,
},
}
}
const Posts = ({ posts }: Props) => {
const [selectedPostId, setSelectedPostId] = useState(posts[0].id)
const selectedPost = posts.find((post) => post.id === selectedPostId)
return (
<div>
<select value={selectedPostId} onChange={(e) => setSelectedPostId(e.target.value)}>
{posts.map((post) => (
<option key={post.id} value={post.id}>
{post.title}
</option>
))}
</select>
<h1>{selectedPost.title}</h1>
<p>{selectedPost.body}</p>
</div>
)
}
export default Posts
上記のコードは、JSONPlaceholder というサービスから GraphQL を使ってデータを取得し、React コンポーネントに渡しています。特に、getStaticProps
という関数を使って、ビルド時にデータを取得しています。このようにすることで、サイトの速度を向上させることができます。
Apollo は、GraphQL を扱うためのクライアントライブラリであり、React と連携することができます。GraphQL を使うことにより、必要なデータだけを取得することができ、不要なデータを取得することがありません。また、Next.js を使ってアプリケーションをビルドする場合には、getStaticProps
を使って、ビルド時にデータを取得することができます。