What Apollo Client Does
- Normalized cache — entities deduped by
__typename:id - Query hooks —
useQuery,useMutation,useSubscription,useLazyQuery,useFragment - Optimistic UI — local cache updates before server confirms
- Pagination — fetchMore with offset or cursor-based
- Local state — client-side schema and resolvers
- SSR — server-rendered queries with hydration
- Subscriptions — GraphQL subscriptions via WebSocket
- Codegen — TypeScript types from schema
Architecture
Queries execute through a link chain (auth, error, retry, http). Responses are normalized into the InMemoryCache. Components subscribe to cache via hooks and re-render on cache changes. Mutations can update cache via refetchQueries, update(), or optimistic responses.
Self-Hosting
Client-only library.
Key Features
- Normalized caching by
__typename:id - Optimistic UI updates
- Pagination helpers
- Local state management
- SSR support
- WebSocket subscriptions
- Apollo DevTools browser extension
- Multi-framework (React, Vue, Angular)
- TypeScript codegen integration
Comparison
| Client | Cache | Type Safety | Bundle | Subscriptions |
|---|---|---|---|---|
| Apollo Client | Normalized | Codegen | ~32KB | Yes |
| URQL | Document | Codegen | ~10KB | Yes |
| Relay | Normalized + compiler | Compile-time | ~20KB | Yes |
| TanStack Query + gql | Document | Manual | ~12KB | Manual |
| SWR + gql | Document | Manual | ~5KB | Manual |
FAQ
Q: Apollo vs URQL? A: Apollo has the most features and the smartest caching, but a larger bundle. URQL is lighter with a simpler API, well-suited to smaller apps.
Q: Can I use it without a GraphQL server?
A: Yes. apollo-link-rest wraps REST endpoints as GraphQL, or you can use Apollo's client-side state management for local data.
Q: Do I need codegen?
A: Strongly recommended. graphql-codegen generates types from your schema and operations, eliminating runtime type errors.
Sources & Credits
- Docs: https://www.apollographql.com/docs/react
- GitHub: https://github.com/apollographql/apollo-client
- License: MIT