Apollo Client
业界领先的 GraphQL 客户端,为 TypeScript / JavaScript 应用提供强大的缓存、直观的数据获取 API 和全面的开发者工具。
Apollo Client 是由 Apollo Inc. 开发的开源 GraphQL 客户端库,集成规范化缓存、状态管理和开发者工具,支持 React/Vue/Angular 等主流框架。2025 年发布 4.0 版本,实现框架无关核心,包体积减少 20-30%,TypeScript 体验大幅提升。GitHub ~19,800 Stars,npm 周下载量约 140 万。
Apollo Client
业界领先的 GraphQL 客户端,为 TypeScript / JavaScript 应用提供强大的缓存、直观的数据获取 API 和全面的开发者工具。
技术简介说明
Apollo Client 是由 Apollo Inc.(前 Apollo GraphQL)开发和维护的开源 GraphQL 客户端库,自 2016 年发布以来一直是 GraphQL 生态中使用最广泛的客户端方案。它不仅是一个简单的数据获取工具,更是一个集成了规范化缓存(Normalized Cache)、状态管理、错误处理和开发者工具的全栈解决方案。Apollo Client 支持 React、Vue、Angular 等主流前端框架,并在 2025 年 9 月发布了具有里程碑意义的 4.0 大版本。
Apollo Client 4.0 是一次深度架构重构,核心变化包括:将 Observable 层从 zen-observable 迁移到 RxJS、实现 20–30% 的包体积缩减、引入命名空间类型(Colocated Types)强化 TypeScript 类型安全、以及将框架特定代码从顶层导出中完全剥离——顶层导出现在完全无 React 依赖,React 相关 hooks 迁移至 @apollo/client/react 子路径。这些变化使 Apollo Client 从一个"React GraphQL 库"转型为一个真正的框架无关的核心库。
截至 2026 年中,Apollo Client 在 GitHub 上拥有约 19,800 Stars,npm 周下载量约 140 万次,累计发布 265 个版本、13,500+ 次提交。Apollo 生态已从单一的客户端库扩展为涵盖 Apollo Server、Apollo Router(Rust 编写的高性能联邦网关)、Apollo Studio / GraphOS(云端图管理平台)以及新推出的 Apollo MCP Server(AI 就绪 API 编排)的完整体系。
基本信息
| 项目 | 详情 |
|---|---|
| 官网 | https://www.apollographql.com/docs/react/ |
| GitHub | https://github.com/apollographql/apollo-client |
| License | MIT |
| 最新版本 | @apollo/[email protected](2026 年 7 月 6 日) |
| 主要语言 | TypeScript(99.5%) |
| 维护者 | Apollo Inc. |
| 核心维护人员 | Jerel Miller (@jerelmiller)、Lenz Weber-Tronic (@phryneas)、Jeff Auriemma (@bignimbus) |
| GitHub Stars | ~19,800 ⭐ |
| npm 周下载量 | ~1,400,000 |
| 累计发布版本 | 265 |
| 总提交数 | 13,556 |
| Node.js 要求 | Node.js 20+(4.0 起) |
| 包管理器 | npm / pnpm / yarn |
快速上手
安装
# npm
npm install @apollo/client graphql
# pnpm
pnpm add @apollo/client graphql
# yarn
yarn add @apollo/client graphql注意:Apollo Client 4.0 起,
graphql和rxjs为 peer dependencies,需要单独安装。
# Apollo Client 4.x 额外需要
npm install rxjs基础配置
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client'
const client = new ApolloClient({
// GraphQL 服务端地址
link: new HttpLink({
uri: 'https://api.example.com/graphql',
// 可选:认证头
headers: {
authorization: `Bearer ${token}`,
},
}),
// 规范化缓存
cache: new InMemoryCache({
typePolicies: {
// 自定义类型策略
Query: {
fields: {
// 自定义字段合并策略
},
},
},
}),
// 开发模式下启用详细日志
connectToDevTools: process.env.NODE_ENV === 'development',
})React 集成——最小示例
import React from 'react'
import { ApolloProvider, useQuery, gql } from '@apollo/client/react'
import { client } from './apollo-client'
// GraphQL 查询定义
const GET_USERS = gql`
query GetUsers {
users {
id
name
email
}
}
`
// 数据展示组件
function UserList() {
const { data, loading, error, dataState } = useQuery(GET_USERS)
if (loading) return <p>加载中...</p>
if (error) return <p>错误: {error.message}</p>
return (
<ul>
{data.users.map((user) => (
<li key={user.id}>{user.name} - {user.email}</li>
))}
</ul>
)
}
// 应用入口——挂载 ApolloProvider
export default function App() {
return (
<ApolloProvider client={client}>
<UserList />
</ApolloProvider>
)
}Next.js 集成
Apollo 官方提供了 @apollo/client-integration-nextjs 包,支持 App Router 和 RSC(React Server Components):
npm install @apollo/client-integration-nextjs// app/providers.tsx
import { ApolloClient } from '@apollo/client-integration-nextjs'
export default function Providers({ children }) {
return (
<ApolloClient>
{children}
</ApolloClient>
)
}核心概念与架构
架构总览
┌─────────────────────────────────────────────────────┐
│ Apollo Client │
├──────────┬──────────┬───────────┬────────────────────┤
│ React │ Cache │ Link │ Local State │
│ Hooks │(InMemory │ (网络 │ (Reactive Vars │
│ │ Cache) │ 层) │ / TypePolicies) │
├──────────┴──────────┴───────────┴────────────────────┤
│ Core (框架无关) │
│ Observable (RxJS) · QueryManager · Error Classes │
├─────────────────────────────────────────────────────┤
│ gql / TypedDocumentNode / GraphQL │
└─────────────────────────────────────────────────────┘
InMemoryCache(规范化缓存)
Apollo Client 的核心优势之一是其 规范化缓存(Normalized Cache)。InMemoryCache 将查询结果按 __typename + id 拆解存储,使得不同查询返回的相同实体自动共享和更新:
import { InMemoryCache } from '@apollo/client'
const cache = new InMemoryCache({
// 类型策略——定义如何识别和合并实体
typePolicies: {
Book: {
// 主键字段(默认使用 id 或 _id)
keyFields: ['isbn'],
fields: {
// 自定义字段读取/合并逻辑
reviews: {
keyArgs: false,
merge(existing = [], incoming) {
return [...existing, ...incoming]
},
},
},
},
// 分页查询的合并策略
Query: {
fields: {
books: {
keyArgs: ['genre'],
merge(existing, incoming, { args }) {
// offset 分页
const merged = existing ? existing.slice() : []
const { offset = 0 } = args ?? {}
for (let i = 0; i < incoming.length; ++i) {
merged[offset + i] = incoming[i]
}
return merged
},
},
},
},
},
})Apollo Link(网络层)
Link 是 Apollo Client 的网络中间件系统,支持链式组合:
import { from, HttpLink } from '@apollo/client'
import { setContext } from '@apollo/client/link/context'
import { onError } from '@apollo/client/link/error'
import { RetryLink } from '@apollo/client/link/retry'
// 认证链路
const authLink = setContext((_, { headers }) => ({
headers: {
...headers,
authorization: `Bearer ${getToken()}`,
},
}))
// 错误处理链路
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.forEach(({ message, locations, path }) =>
console.error(`[GraphQL error]: ${message}`)
)
}
if (networkError) {
console.error(`[Network error]: ${networkError}`)
}
})
// 重试链路
const retryLink = new RetryLink({
attempts: { max: 3 },
delay: { initial: 300, max: 3000, jitter: true },
})
// HTTP 链路
const httpLink = new HttpLink({ uri: '/graphql' })
// 组合链路
const link = from([errorLink, authLink, retryLink, httpLink])GraphQL 文档与类型
Apollo Client 推荐使用 TypedDocumentNode 实现端到端类型安全:
import { TypedDocumentNode, gql } from '@apollo/client'
// 配合 GraphQL Code Generator 自动生成类型
type GetUsersQuery = {
__typename?: 'Query'
users: Array<{
__typename?: 'User'
id: string
name: string
email: string
}>
}
type GetUsersQueryVariables = {
first?: number
after?: string
}
const GET_USERS: TypedDocumentNode<GetUsersQuery, GetUsersQueryVariables> = gql`
query GetUsers($first: Int, $after: String) {
users(first: $first, after: $after) {
id
name
email
}
}
`核心特性
1. 规范化缓存(Normalized Cache)
按 __typename + id 自动拆解、存储和合并数据,不同查询共享实体引用,单次更新全局生效。支持自定义 typePolicies 控制分页合并、字段级别读写逻辑。
2. RxJS Observable 层(4.0 新)
从自研的 zen-observable 迁移到行业标准 RxJS,获得完整的操作符生态(switchMap、debounceTime、combineLatest 等)和 DevTools 支持。RxJS 作为 peer dependency 引入,减少内部耦合。
3. 框架无关核心(4.0 新)
顶层导出完全移除 React 依赖。React hooks(useQuery、useMutation、useSubscription)迁移至 @apollo/client/react 子路径,使 Apollo Client 可用于 Vue、Angular、Svelte 等任意框架。
4. 增强 TypeScript 类型(4.0 新)
引入 命名空间类型(Colocated Types),如 useQuery.Options、useMutation.Options,直接从 hook 访问配置类型。编译期强制必传变量、模块级增强的上下文类型定义,替代旧的泛型参数传递方式。
5. dataState 数据状态追踪(4.0 新)
新增 dataState 属性,精确追踪查询结果的四个阶段:
empty:无数据(初始状态)partial:缓存中有部分数据,正在请求完整数据streaming:数据正在流入(流式/增量传递场景)complete:完整数据已就绪
const { data, dataState } = useQuery(GET_POSTS)
// dataState: 'empty' | 'partial' | 'streaming' | 'complete'6. 包体积优化(4.0 新)
本地状态管理和 HTTP 链路配置改为可选导入,结合现代 ESM 构建和 tree-shaking,整体包体积减少 20–30%。目标浏览器设定为 2023 年基线,Node.js 20+。
7. 精细化错误类(4.0 新)
旧的单一错误对象被拆分为专用的错误类:ApolloError、网络错误、GraphQL 错误、解析错误等,每个类提供静态 .is() 方法用于 TypeScript 类型收窄:
import { isApolloError } from '@apollo/client'
try {
const { data } = await client.query({ query: GET_DATA })
} catch (err) {
if (isApolloError(err)) {
console.error('GraphQL errors:', err.graphQLErrors)
}
}8. 自动代码迁移(Codemod)
提供官方 codemod 工具,自动处理 v3 → v4 的导入路径更新和废弃 API 转换:
npx @apollo/client-codemod-migrate-3-to-4 src9. 开发者工具
- Apollo Client DevTools:浏览器扩展,支持查询检查、缓存浏览、Mutation 追踪
- Apollo Studio:云端图管理平台,提供 Schema 注册、操作追踪、性能分析
- Apollo Sandbox:Web 端 GraphQL 探索环境
10. 本地状态管理
通过 Reactive Variables 和 InMemoryCache 的 typePolicies 实现 GraphQL 原生的本地状态管理,无需额外的状态管理库:
import { makeVar, useReactiveVar } from '@apollo/client'
// 创建响应式变量
const themeVar = makeVar<'light' | 'dark'>('light')
// 在组件中使用
function ThemeToggle() {
const theme = useReactiveVar(themeVar)
return <button onClick={() => themeVar(theme === 'light' ? 'dark' : 'light')}>
当前主题: {theme}
</button>
}生态图
Apollo 已从单一的客户端库发展为覆盖 GraphQL 全生命周期的完整生态:
┌─────────────────────────────────────────────────────────────┐
│ Apollo 生态全景 │
├──────────────┬──────────────────────────────────────────────┤
│ │ │
│ 客户端层 │ Apollo Client (React / Vue / Angular) │
│ │ Apollo iOS (Swift) │
│ │ Apollo Kotlin │
│ │ │
├──────────────┼──────────────────────────────────────────────┤
│ │ │
│ 服务端层 │ Apollo Server (Node.js, 开源) │
│ │ Apollo Router (Rust, 联邦网关) │
│ │ │
├──────────────┼──────────────────────────────────────────────┤
│ │ │
│ 平台层 │ Apollo Studio / GraphOS │
│ │ (Schema 注册、操作追踪、性能分析) │
│ │ │
├──────────────┼──────────────────────────────────────────────┤
│ │ │
│ 工具层 │ Apollo Sandbox (GraphQL 探索) │
│ │ Apollo Rover CLI (Schema 管理) │
│ │ Apollo Codegen (类型生成) │
│ │ Apollo Client DevTools (浏览器扩展) │
│ │ │
├──────────────┼──────────────────────────────────────────────┤
│ │ │
│ 集成层 │ Apollo Connectors (REST → GraphQL 桥接) │
│ (2025-2026) │ Apollo MCP Server (AI 就绪 API 编排) │
│ │ @apollo/client-integration-nextjs │
│ │ React Router 7 / TanStack Start 集成 (开发中) │
│ │ │
└──────────────┴──────────────────────────────────────────────┘
生态组件说明
| 组件 | 说明 | 状态 |
|---|---|---|
| Apollo Client | GraphQL 客户端核心库,支持多框架 | ✅ 活跃维护(v4.2.6) |
| Apollo Server | 开源、规范兼容的 GraphQL 服务端 | ✅ 活跃维护 |
| Apollo Router | Rust 编写的高性能联邦超图路由 | ✅ 活跃维护 |
| Apollo Studio / GraphOS | 云端图管理与监控平台 | ✅ 商业运营 |
| Apollo MCP Server | 基于 Model Context Protocol 的 AI API 编排 | 🆕 2025 年中推出 |
| Apollo Connectors | 将现有 REST API 接入联邦图 | ✅ 活跃开发 |
| Apollo iOS | Swift 原生 GraphQL 客户端 | ✅ 活跃维护 |
| Apollo Kotlin | Kotlin/JVM GraphQL 客户端 | ✅ 活跃维护 |
| Apollo Rover CLI | Schema 管理和图操作命令行工具 | ✅ 活跃维护 |
| Apollo Sandbox | Web 端 GraphQL IDE / 探索环境 | ✅ 可用 |
适用场景
✅ 最适合
- 中大型 SPA / SSR 应用:需要规范化缓存、复杂数据流和状态管理的 GraphQL 应用
- 联邦架构(Federation):通过 Apollo Router + Apollo Studio 管理多个子图组成的超图
- 需要离线支持的应用:利用 InMemoryCache +
apollo3-cache-persist实现缓存持久化和离线数据访问 - 实时数据应用:内置 Subscription 支持,配合 WebSocket Link 实现实时数据推送
- 多框架项目:4.0 起核心框架无关,React / Vue / Angular 可共享核心逻辑
- 复杂数据交互场景:乐观更新、分页、无限滚动、文件上传等场景有成熟的内置方案
- 全栈 GraphQL 团队:当服务端也使用 Apollo Server 时,可获得端到端一致的 Schema 管理和监控体验
⚠️ 不太适合
- 极简项目:如果只是发几个 GraphQL 请求,
graphql-request或原生fetch更轻量 - 非 GraphQL 项目:Apollo Client 专为 GraphQL 设计,REST API 场景请用 TanStack Query 等
- 超小 bundle 敏感项目:尽管 4.0 已减重 20–30%,仍比 urql 和 graphql-request 大
开发与工程化
项目结构建议
src/
├── graphql/
│ ├── client.ts # Apollo Client 实例配置
│ ├── cache.ts # InMemoryCache 配置与 typePolicies
│ ├── links.ts # Link 链配置
│ ├── fragments/ # 可复用 GraphQL 片段
│ │ └── user.fragment.ts
│ ├── queries/ # 查询定义
│ │ └── users.query.ts
│ ├── mutations/ # 变更定义
│ │ └── createUser.mutation.ts
│ └── subscriptions/ # 订阅定义
│ └── newMessage.sub.ts
├── generated/ # GraphQL Code Generator 输出
│ └── graphql.ts
└── ...
代码生成(推荐配合使用)
# 安装 GraphQL Code Generator + Apollo Client 插件
npm install -D @graphql-codegen/cli @graphql-codegen/typed-document-node @graphql-codegen/typescript-operations @graphql-codegen/typescript# codegen.yml
schema: 'https://api.example.com/graphql'
documents: './src/graphql/**/*.ts'
generates:
./src/generated/graphql.ts:
plugins:
- typescript
- typescript-operations
- typed-document-node测试
import { MockedProvider } from '@apollo/client/testing'
import { render, screen } from '@testing-library/react'
import { GET_USERS } from './UserList'
const mocks = [
{
request: {
query: GET_USERS,
},
result: {
data: {
users: [
{ id: '1', name: 'Alice', email: '[email protected]', __typename: 'User' },
],
},
},
},
]
test('renders user list', async () => {
render(
<MockedProvider mocks={mocks} addTypename={false}>
<UserList />
</MockedProvider>
)
// 等待异步数据加载
expect(await screen.findByText('Alice')).toBeInTheDocument()
})推荐结合 MSW(Mock Service Worker) 进行更贴近真实环境的集成测试。
从 v3 迁移到 v4
# 自动迁移工具
npx @apollo/client-codemod-migrate-3-to-4 src主要迁移项:
- 添加
rxjs为 peer dependency - React hooks 导入路径变更为
@apollo/client/react - 适配新的
dataState属性(替代部分loading+data组合判断逻辑) - 更新自定义 Error 处理逻辑(使用新的错误类)
- Node.js 最低版本要求 20+
性能与安全
性能
| 指标 | 说明 |
|---|---|
| 包体积 | 4.0 版本减少 20–30%;本地状态和 HTTP 配置可选导入,改善 tree-shaking |
| 缓存命中 | InMemoryCache 规范化存储确保相同实体零重复请求 |
| 查询去重 | 相同的并发查询自动合并为单次网络请求 |
| 乐观更新 | Mutation 乐观 UI 更新无需等待服务端响应 |
| 增量渲染 | dataState: 'partial' 允许缓存优先展示,后台刷新 |
| SSR 支持 | getDataFromTree / renderToStringWithData 支持服务端预取 |
安全
| 方面 | 说明 |
|---|---|
| 认证集成 | 通过 Link 链灵活注入 Bearer Token、Cookie 等认证信息 |
| CSRF | 配合 HttpLink 的 credentials 选项控制跨域凭据 |
| XSS | GraphQL 查询使用模板字面量,避免字符串拼接注入风险 |
| Schema 治理 | 通过 Apollo Studio / Rover 进行 Schema 变更检查和兼容性验证 |
| 操作白名单 | Apollo Studio 支持 Persisted Queries(持久化查询),限制允许执行的操作集合 |
| 依赖安全 | RxJS 作为 peer dependency 引入,减少供应链攻击面 |
技术对比
Apollo Client vs 主流 GraphQL 客户端
| 特性 | Apollo Client 4.x | urql | Relay | graphql-request |
|---|---|---|---|---|
| 包体积 | 中等(4.0 减重 30%) | 最小 | 中等 | 极小(~3KB) |
| 框架支持 | React / Vue / Angular(框架无关核心) | React / Preact / Svelte | React(强绑定) | 框架无关 |
| 规范化缓存 | ✅ 内置 InMemoryCache | ⚠️ 可选(graph cache 插件) | ✅ 编译器优化 | ❌ |
| TypeScript | ✅ 增强(命名空间类型) | ✅ 良好 | ✅ 编译器生成 | ⚠️ 基础 |
| 学习曲线 | 中等 | 低 | 高 | 极低 |
| 离线支持 | ✅ 缓存持久化 | ⚠️ 需自行实现 | ✅ 内置 | ❌ |
| Pagination | ✅ 内置 fetchMore | ⚠️ 需自行处理 | ✅ 内置(强约束) | ❌ |
| Subscription | ✅ 内置 | ✅ 通过 exchange | ✅ 内置 | ❌ |
| 状态管理 | ✅ Reactive Variables | ⚠️ 需外部方案 | ⚠️ Store 驱动 | ❌ |
| 编译时优化 | ❌ | ❌ | ✅ 编译器 | ❌ |
| 生态完整度 | ⭐⭐⭐⭐⭐ 全栈生态 | ⭐⭐⭐ 轻量生态 | ⭐⭐⭐ Meta 生态 | ⭐⭐ 纯请求 |
| 适用规模 | 中大型项目 | 中小型项目 | 大型 / Facebook 级 | 极简场景 |
| 社区活跃度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
选型建议速查
你需要什么?
│
├── 只是一个简单的 GraphQL 请求
│ └── graphql-request(最小依赖,零配置)
│
├── 中小型 React 应用,追求轻量 DX
│ └── urql(轻量、插件化、学习成本低)
│
├── 中大型应用,需要缓存 / 离线 / 状态管理
│ └── Apollo Client 4.x(功能最全面,生态最完善)
│
├── Facebook 级别超大规模,追求编译时优化
│ └── Relay(编译器驱动,性能极致,但学习成本高)
│
└── 非 GraphQL(REST API)
└── TanStack Query / SWR(不要用 Apollo Client)
最佳实践
1. 使用 TypedDocumentNode + Codegen
始终使用 TypedDocumentNode 配合 GraphQL Code Generator 自动生成类型,避免手写重复类型定义:
// ✅ 自动生成,类型安全
import { GetUsersDocument } from './generated/graphql'
const { data } = useQuery(GetUsersDocument, { variables: { first: 10 } })
// ❌ 手动类型,容易不一致
const { data } = useQuery<UsersData>(gql`...`)2. 合理设计 typePolicies
为分页、无限滚动等场景正确配置缓存合并策略,避免重复请求和数据不一致:
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
// 无限滚动:按 offset 追加
feed: {
keyArgs: ['type'],
merge(existing, incoming, { args }) {
const merged = existing?.items ? [...existing.items] : []
const offset = args?.offset ?? 0
merged.splice(offset, incoming.length, ...incoming)
return { ...existing, items: merged, totalCount: incoming.totalCount }
},
},
},
},
},
})3. 利用 dataState 精确控制 UI 状态
4.0 的 dataState 替代了 loading + data 的松散组合判断:
const { data, dataState } = useQuery(GET_POSTS)
switch (dataState) {
case 'empty':
return <SkeletonList />
case 'partial':
return <PostList posts={data.posts} isRefreshing />
case 'complete':
return <PostList posts={data.posts} />
}4. Link 链分层设计
将认证、错误处理、日志、重试等关注点拆分为独立 Link,便于维护和测试:
const link = from([
errorLink, // 错误处理和上报
authLink, // 认证头注入
retryLink, // 网络失败重试
loggerLink, // 开发模式日志
httpLink, // 实际 HTTP 请求
])5. 使用 Persisted Queries 提升安全性和性能
通过 Apollo Studio 的 Persisted Queries 功能,只允许白名单内的 GraphQL 操作执行,同时减少请求体积:
import { createPersistedQueryLink } from '@apollo/client/link/persisted-queries'
import sha256 from 'crypto-hash/sha256'
const persistedQueryLink = createPersistedQueryLink({
sha256: (document) => sha256(print(document)),
})6. 避免过度查询
- 使用 Fragment 组合替代超大型查询
- 避免在前端做不必要的数据关联查询
- 合理使用
fetchPolicy(如cache-first、network-only)减少不必要的网络请求
技术局限与边界
已知局限
| 局限 | 说明 | 应对策略 |
|---|---|---|
| 包体积仍偏大 | 4.0 减重 30% 后仍约 3x urql;完整功能引入后 gzip 约 30-40KB | 按需导入、tree-shaking;极简场景选 graphql-request |
| 学习曲线中等 | Cache 策略、Link 链、typePolicies 概念较多 | 渐进式学习,先用默认配置,再逐步定制 |
| RxJS 依赖 | 4.0 引入 RxJS 作为 peer dependency,增加依赖复杂度 | 对已有 RxJS 项目是利好;无 RxJS 经验团队需要额外学习 |
| React 生态绑定历史 | 尽管 4.0 核心已框架无关,但文档和社区资源仍偏 React | Vue / Angular 用户需参考对应框架适配文档 |
| 缓存一致性 | 复杂的缓存更新场景(如乐观更新 + 并发 mutation)可能出现数据不一致 | 合理设计 typePolicies,必要时使用 refetchQueries |
| SSR 水合 | Next.js / Remix 的 SSR 场景需要额外配置缓存水合 | 使用官方集成包 @apollo/client-integration-nextjs |
| GraphQL 强绑定 | 不适合 REST API 场景 | REST 场景请使用 TanStack Query / SWR / axios |
| Relay 的编译时优势 | 无编译时查询优化,运行时缓存解析不如 Relay 高效 | 超大规模项目评估 Relay 的编译时方案 |
边界判断
- 选 Apollo Client:中大型 GraphQL 应用,需要全功能缓存、离线支持、状态管理、完整生态
- 不选 Apollo Client:纯 REST 项目、极简 GraphQL 请求、超小 bundle 敏感场景、需要编译时优化的超大规模应用
学习资源
官方资源
视频教程
| 资源 | 说明 |
|---|---|
| Reintroducing Apollo Client: V4 and Beyond | GraphQLConf 2025 官方演讲 |
| What's New in Apollo Client | 新功能概览 |
| FullStack GraphQL React Tutorial | 全栈实战教程 |
社区与文章
| 资源 | 说明 |
|---|---|
| urql vs Apollo Client:2025 年前端 GraphQL 终极对决指南 | 中文对比文章(2026.02) |
| Apollo Client 4.0 深度解读 — InfoQ | 技术媒体深度分析 |
| Exploring GraphQL Clients — Hasura | Apollo vs Relay vs urql 对比 |
| r/graphql 社区讨论 | Reddit GraphQL 社区 |
配套工具
| 工具 | 说明 |
|---|---|
| GraphQL Code Generator | 自动生成 TypeScript 类型和 TypedDocumentNode |
| Apollo Client DevTools | 浏览器扩展——查询检查、缓存浏览 |
| MSW (Mock Service Worker) | 推荐用于 Apollo Client 测试的 mock 方案 |
| apollo3-cache-persist | 缓存持久化——支持 localStorage、AsyncStorage 等 |
2026 年现状
Apollo Client 4.x 已稳定
Apollo Client 4.0 于 2025 年 9 月正式发布后,经过半年多的迭代已到 4.2.6 版本,生态适配日趋成熟:
- RxJS 迁移完成:社区对 RxJS 作为 Observable 层的接受度良好,丰富的操作符为复杂数据流场景提供了强大支持
- 框架扩展加速:Next.js 官方集成包已发布;React Router 7(Remix)和 TanStack Start 集成正在开发中
- TypeScript 体验提升:命名空间类型和模块增强显著改善了类型推导体验,
TypedDocumentNode+ Codegen 成为主流实践
Apollo 生态战略方向
2025–2026 年 Apollo 的战略重心明确向 AI 就绪的 API 编排 倾斜:
- Apollo MCP Server:2025 年中推出,基于 Model Context Protocol 让 AI Agent 能通过 GraphQL 图访问后端能力
- Apollo Connectors:降低从 REST 迁移到 GraphQL 联邦图的门槛
- Apollo Router 性能提升:2025 夏季发布重大性能升级
- Apollo Summit 2026:即将举办,聚焦 Federation、Router 优化、Schema 治理、AI Agent 管理
竞争格局
在 2026 年的 GraphQL 客户端市场:
- Apollo Client 仍然是功能最全面、生态最完善的选择,适合中大型项目
- urql 在轻量级和 DX 方面持续获得青睐,The Guild 生态(GraphQL Mesh、GraphQL Yoga)与 urql 协同良好
- Relay 在 Meta 内部和超大规模应用中保持地位,但学习门槛限制了其广泛采用
- TanStack Query 在 REST API 领域的主导地位间接影响了部分 GraphQL 用户的选择(TanStack Query 也支持 GraphQL)
结论
Apollo Client 4.x 在 2026 年依然是 GraphQL 客户端领域的标杆选择。它从"React 专属"成功转型为"框架无关的核心库",包体积显著优化,TypeScript 体验大幅提升。配合 Apollo 生态的 MCP Server 和 AI 编排能力,Apollo 正在从"GraphQL 工具供应商"演进为"AI 时代的 API 编排平台"。对于需要全功能 GraphQL 客户端的中大型项目,Apollo Client 仍是最值得投入的选择。