Episode 26 membandingkan alternatif client GraphQL: URQL dengan sistem exchanges, Relay dengan compiler dan fragment colocation, kombinasi React Query dengan graphql-request, hingga panduan memilih berdasarkan bundle size, learning curve, dan kebutuhan aplikasi.

Apollo Client bukan satu-satunya pilihan. Episode 26 membahas tiga alternatif populer — URQL, Relay, dan React Query — agar kalian bisa memilih client yang tepat untuk kebutuhan masing-masing project.
Kita akan membedah filosofi dan setup URQL dengan sistem exchanges-nya, pendekatan compiler dan fragment colocation Relay, kombinasi React Query dengan graphql-request, lalu menutup dengan perbandingan menyeluruh.
URQL dibangun di atas filosofi "sekecil mungkin tapi bisa dikembangkan". Bundle size-nya kecil dan hampir semua perilaku bisa dimodifikasi lewat exchanges — middleware terstruktur yang memproses setiap operasi. Install dengan npm install urql graphql:
import { Client, cacheExchange, fetchExchange, Provider } from "urql";
const client = new Client({
url: "http://localhost:4000",
exchanges: [cacheExchange, fetchExchange],
});
function App() {
return <Provider value={client}>{/* komponen */}</Provider>;
}Setiap exchange menangani satu tanggung jawab: cacheExchange untuk cache, fetchExchange untuk jaringan, dedupExchange untuk menghapus duplikasi. Kalian bisa menyusun urutan sendiri, bahkan menulis exchange kustom:
import { useQuery, gql } from "urql";
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) { id username }
}
`;
function Profile({ id }) {
const [result] = useQuery({ query: GET_USER, variables: { id } });
if (result.fetching) return <p>Memuat...</p>;
return <p>{result.data?.user.username}</p>;
}URQL menawarkan dua cache: document cache (sederhana, cocok untuk UI kecil) dan normalized cache (mirip Apollo, dengan type policies). Pilih sesuai kompleksitas data kalian.
Relay adalah client paling disiplin. Setiap komponen mendeklarasikan fragment-nya sendiri di samping data yang dipakai — ini disebut fragment colocation — lalu Relay compiler mengubah query menjadi artefak yang dioptimasi:
npm install relay-runtime react-relay
npm install -D relay-compilerfragment UserCard_user on User {
id
username
avatar
}import { graphql, useFragment } from "react-relay";
function UserCard({ userRef }) {
const user = useFragment(
graphql`
fragment UserCard_user on User {
id
username
}
`,
userRef
);
return <div>{user.username}</div>;
}Relay unggul untuk aplikasi besar dengan data sangat terhubung — feed kompleks, React Native berskala besar — karena compiler menjamin query selalu konsisten dan pagination dengan Relay spec (episode 12) sangat matang. Trade-off-nya: learning curve tinggi dan kerja sama dengan server (harus memakai Relay spec) membuat Relay kurang fleksibel untuk API generik.
Pendekatan minimalis: pakai React Query untuk state server dan graphql-request sebagai client GraphQL tipis:
npm install @tanstack/react-query graphql-requestimport { useQuery } from "@tanstack/react-query";
import { GraphQLClient, gql } from "graphql-request";
const client = new GraphQLClient("http://localhost:4000");
function useUser(id) {
return useQuery({
queryKey: ["user", id],
queryFn: () =>
client.request(
gql`
query GetUser($id: ID!) {
user(id: $id) { id username }
}
`,
{ id }
),
});
}React Query menangani caching, retry, dan stale time dengan cara yang agnostik transport — tidak terikat ekosistem GraphQL. Kelebihannya: fleksibel, mudah dipakai juga untuk REST. Kekurangannya: tanpa normalisasi cache, data duplikat antar query tidak otomatis disinkronkan.
| Aspek | Apollo | URQL | Relay |
|---|---|---|---|
| Bundle size | Besar | Kecil | Sedang |
| Learning curve | Sedang | Rendah | Tinggi |
| Normalized cache | Ya | Opsional | Ya |
| Compiler | Tidak | Tidak | Ya (wajib) |
| Ekosistem Apollo | Sangat terintegrasi | Mandiri | Mandiri |
Tidak ada pilihan yang salah mutlak — yang penting sesuaikan dengan ukuran tim, kompleksitas data, dan kebutuhan bundle size.
Inti yang harus dibawa pulang:
Di episode 27 selanjutnya kalian akan mempelajari integrasi GraphQL dengan Next.js — API routes untuk Apollo Server, SSR dengan getServerSideProps dan hydration, SSG dengan getStaticProps dan ISR, App Router dengan Server Components, autentikasi dengan cookies, hingga deployment ke Vercel. Full-stack GraphQL dengan Next.js akan kalian kuasai!