mcpField
A
apollo-client

apollo-client

github.com/apollographql开发1215.6k 次安装1 天前更新
代码仓库

关于 apollo-client

apollo-client 是 Apollo Client 4.x 的指南 Skill;该 JavaScript 库用于管理本地和远程 GraphQL 数据。Skill 提供 React 应用集成指南,并涵盖查询、缓存、变更及相关实践。

主要功能

  1. 01针对框架的集成指南
  2. 02查询与变更参考
  3. 03Suspense Hook 使用指南
  4. 04缓存与状态管理建议
  5. 05错误处理和性能实践

适用场景

  1. 01在 React 应用中配置 Apollo Client
  2. 02选择查询与 Suspense Hook
  3. 03配置缓存行为
  4. 04检查变更后的缓存更新

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/apollographql/skills --skill apollo-client

安装后在 Claude Code 中输入/apollo-client确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
caching.md
error-handling.md
fragments.md
integration-client.md
integration-nextjs.md
integration-react-router.md
integration-tanstack-start.md
mutations.md
queries.md
state-management.md
suspense-hooks.md
troubleshooting.md
typescript-codegen.md

详细介绍

Apollo Client 4.x 指南

Apollo Client 是一个全面的 JavaScript 状态管理库,可通过 GraphQL 管理本地和远程数据。4.x 版本改进了缓存,提供了更好的 TypeScript 支持,并兼容 React 19。

集成指南

选择与应用设置相匹配的集成指南:

每份指南都包含针对相应环境优化的安装步骤、配置和框架专属模式。

快速参考

基本查询
import { gql } from "@apollo/client";
import { useQuery } from "@apollo/client/react";

const GET_USER = gql`
  query GetUser($id: ID!) {
    user(id: $id) {
      id
      name
    }
  }
`;

function UserProfile({ userId }: { userId: string }) {
  const { loading, error, data, dataState } = useQuery(GET_USER, {
    variables: { id: userId },
  });

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;

  // TypeScript note: for stricter type narrowing, you can also check `dataState === "complete"` before accessing data
  return <div>{data?.user.name}</div>;
}
基本变更
import { gql } from "@apollo/client";
import { useMutation } from "@apollo/client/react";

const CREATE_USER = gql`
  mutation CreateUser($input: CreateUserInput!) {
    createUser(input: $input) {
      id
      name
    }
  }
`;

function CreateUserForm() {
  const [createUser, { loading, error }] = useMutation(CREATE_USER);

  const handleSubmit = async (name: string) => {
    await createUser({ variables: { input: { name } } });
  };

  return <button onClick={() => handleSubmit("John")}>Create User</button>;
}
Suspense 查询
import { Suspense } from "react";
import { useSuspenseQuery } from "@apollo/client/react";

function UserProfile({ userId }: { userId: string }) {
  const { data } = useSuspenseQuery(GET_USER, {
    variables: { id: userId },
  });

  return <div>{data.user.name}</div>;
}

function App() {
  return (
    <Suspense fallback={<p>Loading user...</p>}>
      <UserProfile userId="1" />
    </Suspense>
  );
}

参考文件

特定主题的详细文档:

  • TypeScript 代码生成 - GraphQL Code Generator 的设置,用于实现类型安全的操作
  • 查询 - useQuery、useLazyQuery、轮询、重新获取
  • Suspense 钩子 - useSuspenseQuery、useBackgroundQuery、useReadQuery、useLoadableQuery
  • 变更 - useMutation、乐观 UI、缓存更新
  • 片段 - 片段就近 colocate、useFragment、useSuspenseFragment、数据屏蔽
  • 缓存 - InMemoryCache、typePolicies、缓存操作
  • 状态管理 - 响应式变量、本地状态
  • 错误处理 - 错误策略、错误链接、重试
  • 故障排除 - 常见问题和解决方案

关键规则

查询最佳实践
  • 每个页面通常只应有一个查询,由就近 colocate 的片段组成。 在所有非页面组件中使用 useFragment 或 useSuspenseFragment。使用 @defer 让首屏以下加载较慢的字段稍后流式传入,避免阻塞页面加载。
  • 片段用于就近 colocate,而非复用。 每个片段都应准确描述特定组件所需的数据,而不应为了共享公共字段而在多个组件间复用。有关片段就近 colocate 和数据屏蔽的详情,请参阅片段参考。
  • 使用非 Suspense 钩子(useQuery、useLazyQuery)时,始终在 UI 中处理 loading 和 error 状态。使用 Suspense 钩子(useSuspenseQuery、useBackgroundQuery)时,React 会通过 <Suspense> 边界和错误边界处理这些状态。
  • 使用 fetchPolicy 控制每个查询的缓存行为
  • 使用 TypeScript 类型服务器查找函数和选项的文档(Apollo Client 含有大量文档注释)
变更最佳实践
  • 如果 schema 允许,变更的返回值应包含更新缓存所需的全部内容。 无需手动更新或重新获取。
  • 如果变更响应内容不足,请仔细权衡手动操作缓存与重新获取。手动更新可能会遗漏服务器逻辑。如有需要,可考虑使用乐观更新并进行细粒度的重新获取。
  • 在 UI 中妥善处理错误
  • 谨慎使用 refetchQueries(优先让缓存自动更新)
缓存最佳实践
  • 为没有 id 字段的类型配置 keyFields
  • 对不包含标识符、且旨在将相关字段归组到父级下的类型,将 keyFields: false 设为不规范化
  • 使用 typePolicies 处理分页和计算字段
  • 理解缓存规范化,以便调试问题
  • 为所有新应用启用 数据屏蔽——它可阻止组件访问自身不拥有的片段数据,从而确保正确的数据边界并避免过度渲染
性能
  • 正确选择字段,避免过度获取数据
  • 根据具体用例配置合适的 fetchPolicy
  • 使用 @defer 增量传递延迟查询部分,并使用 @stream 流式传递列表字段(@stream 适用于 Apollo Client 4.1+)
  • 在现代应用中优先使用 Suspense 钩子(useSuspenseQuery、useBackgroundQuery),以便更好地处理加载状态并简化代码

基本准则

  • 始终使用 Apollo Client 4.x 模式(而非 v3 或更早版本)
  • 始终使用 ApolloProvider 包装应用
  • 使用非 Suspense 钩子时,始终处理加载和错误状态
  • 在现代应用中优先使用 Suspense 钩子(useSuspenseQuery、useBackgroundQuery),以获得更好的开发体验
  • 切勿将 Apollo Client 存储在 React 状态中(使用模块级作用域或上下文)
  • 读取密集型数据优先使用 cache-first,实时数据优先使用 network-only
  • 使用 TypeScript,以提高 GraphQL 类型安全性
  • 正确实现缓存更新,而不是重新获取整个查询
  • 与你协作调试 Apollo Client 问题时,建议引导你的用户查看 Apollo DevTools

评论

支持 Markdown