0Pricing
React Academy · 课时

在 React 中配置 Apollo Client

配置 ApolloProvider,使用缓存和链接链创建 Apollo 客户端,并连接到 GraphQL API

在 React 中配置 Apollo Client 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

安装 Apollo Client

安装 @apollo/client 和 graphql。graphql 包是 Apollo Client 所需的对等依赖,用于通过 gql 模板标签解析查询文档。

对于 TypeScript 项目,这两个包都自带类型定义,因此不需要 @types 包。

创建 ApolloClient 实例

使用缓存和链接实例化 ApolloClient。最简单的设置是:new ApolloClient({ cache: new InMemoryCache(), uri: '/graphql' })。uri 简写形式会在内部创建一个 HttpLink。

如需更多控制,请手动构建链接链,并将其传给 link 选项,而不是 uri。

ApolloProvider

使用 client 属性将 React 应用包装在 ApolloProvider 中:ApolloProvider client={client}。这样,所有后代组件都可以通过 React 上下文访问 Apollo Client 实例。

组件树中的每个 useQuery 和 useMutation 调用都会自动使用此客户端,无需逐层传递属性。

InMemoryCache:规范化缓存

InMemoryCache 是 Apollo Client 的默认缓存。它会按类型和 ID 对获取的数据进行规范化,并将每个实体存储在唯一的缓存键下(例如 User:1)。任何查询获取 User:1 后,之后对该实体的所有读取都会得到更新后的数据。

这种规范化意味着,在一次变更中更新用户后,所有包含该用户的查询结果都会自动更新,无需编写额外代码。

HttpLink

HttpLink 负责 Apollo Client 与 GraphQL 服务器之间的 HTTP 传输。您可以配置 uri,也可以选择配置 fetch、headers 和 credentials。

对于高级用例,可以使用拆分链接将不同操作路由到不同端点:订阅通过 WebSocket(WebSocketLink)传输,查询和变更通过 HTTP(HttpLink)传输。

使用 setContext 的 AuthLink

从 @apollo/client/link/context 导入 setContext。创建身份验证链接:const authLink = setContext((_, { headers }) => ({ headers: { ...headers, authorization: 'Bearer ' + getToken() } }))。将其串联在 HttpLink 之前:authLink.concat(httpLink)。

setContext 链接会在每次请求前运行,动态地为每个操作添加身份验证标头。

链接链组合

可以使用 ApolloLink.from([authLink, errorLink, httpLink]) 或 authLink.concat(httpLink) 组合链接。链接充当中间件:每个链接都会处理操作,并将其传给 next()。链中的最后一个链接发送实际的 HTTP 请求。

常见的链是:身份验证链接(添加标头)+ 错误链接(处理错误)+ HTTP 链接(发送请求)。

Apollo 链接错误

从 @apollo/client/link/error 导入 onError。错误链接会全局拦截 GraphQL 错误和网络错误。您可以使用它在出现 UNAUTHENTICATED 错误时重定向到登录页,或在网络失败时显示全局错误提示。

错误链接必须位于链中的 HTTP 链接之前,但可以调用 forward(operation) 重试请求。

获取策略选项

cache-first(默认):立即返回缓存数据;如果数据过时,则在后台重新获取。network-only:始终从服务器获取,并更新缓存。cache-and-network:立即返回缓存,同时发起获取;响应到达后更新界面。cache-only:仅从缓存读取,如果未缓存则抛出错误。no-cache:始终获取数据,从不写入缓存。

请根据数据新鲜度需求进行选择:仪表板通常使用 cache-and-network;用户资料表单使用 network-only。

全局设置默认获取策略

在 InMemoryCache 的 defaultOptions 中设置默认 fetchPolicy:new ApolloClient({ defaultOptions: { watchQuery: { fetchPolicy: 'cache-and-network' } } })。单个 useQuery 调用可以按查询覆盖此设置。

设置合理的全局默认值,可以减少在每次钩子调用中指定 fetchPolicy 的样板代码。

Apollo Client DevTools

Apollo Client DevTools 浏览器扩展会在 Chrome DevTools 中添加一个 Apollo 面板。它会显示所有已缓存的查询及其当前数据,支持探索规范化缓存,也允许从 DevTools 面板重新运行查询。

请从 Chrome 网上应用店安装,并使用 devtools: { enabled: true } 初始化客户端(开发模式下默认启用)。

Apollo 链接链组合

在 Apollo Client 的链接链中,errorLink 应该放在 httpLink 的什么位置?

课程回顾

安装 @apollo/client 和 graphql,使用 InMemoryCache 和链接链创建 ApolloClient,并将应用包装在 ApolloProvider 中。链接链由 authLink(添加令牌)、errorLink(全局处理错误)和 httpLink(HTTP 传输)组合而成。获取策略控制缓存与网络的优先级;InMemoryCache 按类型和 ID 对实体进行规范化。

Apollo DevTools 浏览器扩展让缓存检查和调试变得简单直接。

常见问题解答

「在 React 中配置 Apollo Client」课时是免费的吗?

是的 — 「在 React 中配置 Apollo Client」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「在 React 中配置 Apollo Client」这节课中我会学到什么?

配置 ApolloProvider,使用缓存和链接链创建 Apollo 客户端,并连接到 GraphQL API 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「在 React 中配置 Apollo Client」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 面向 React 开发者的 GraphQL 基础
  2. 在 React 中配置 Apollo Client
  3. useQuery 与 useMutation 钩子
  4. Apollo 缓存:规范化与更新
← 返回 React Academy