react-slingshot 与 GraphQL 订阅客户端:Apollo vs Relay

react-slingshot 与 GraphQL 订阅客户端:Apollo vs Relay

【免费下载链接】react-slingshot React + Redux starter kit / boilerplate with Babel, hot reloading, testing, linting and a working example app built in 【免费下载链接】react-slingshot 项目地址: https://gitcode.com/gh_mirrors/re/react-slingshot

你是否正在使用 react-slingshot 构建实时应用,却在选择 GraphQL 订阅客户端时陷入两难?本文将对比 Apollo Client 和 Relay 两大主流方案,帮助你快速掌握集成方法并做出适合项目需求的技术选型。读完本文你将获得:两种客户端的详细集成步骤、性能对比分析、以及基于真实场景的决策指南。

技术选型背景

react-slingshot 作为成熟的 React + Redux 脚手架,提供了完整的开发体验,包括热重载、测试和代码检查等功能。当需要构建实时数据交互应用时,GraphQL 订阅(Subscription)成为连接前端与后端的理想选择。目前生态中有两大主流客户端:Apollo Client 和 Relay,它们各有优势,适用于不同场景。

GraphQL 订阅工作原理

GraphQL 订阅通过 WebSocket 实现双向通信,允许服务器主动向客户端推送数据更新。以下是两种客户端的核心差异:

特性Apollo ClientRelay
学习曲线平缓,文档丰富陡峭,概念复杂
灵活性高,适合快速开发低,强调规范性
性能优化自动缓存,按需获取预加载数据,精确更新
社区支持活跃,插件丰富较小,依赖 Facebook 维护

Apollo Client 集成指南

Apollo Client 以其灵活性和易用性成为大多数项目的首选。以下是在 react-slingshot 中集成 Apollo Client 的步骤:

1. 安装依赖

首先,安装 Apollo Client 及相关依赖:

npm install @apollo/client graphql subscriptions-transport-ws

2. 配置 Apollo Client

创建 Apollo Client 实例并配置 WebSocket 连接:

// src/apollo/client.js
import { ApolloClient, InMemoryCache, split, HttpLink } from '@apollo/client';
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
import { getMainDefinition } from '@apollo/client/utilities';
import { createClient } from 'graphql-ws';

const httpLink = new HttpLink({
  uri: 'http://localhost:4000/graphql',
});

const wsLink = new GraphQLWsLink(createClient({
  url: 'ws://localhost:4000/graphql',
}));

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    );
  },
  wsLink,
  httpLink,
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache(),
});

export default client;

3. 在应用中注入 Apollo Client

修改根组件,使用 Apollo Provider 包装应用:

// src/components/Root.js
import { ApolloProvider } from '@apollo/client';
import client from '../apollo/client';

const Root = ({ store }) => (
  <ApolloProvider client={client}>
    <Provider store={store}>
      <Router history={history}>
        <Route path="/" component={App} />
      </Router>
    </Provider>
  </ApolloProvider>
);

4. 创建订阅组件

使用 useSubscription Hook 实现实时数据订阅:

// src/components/RealTimeData.js
import { useSubscription, gql } from '@apollo/client';

const DATA_SUBSCRIPTION = gql`
  subscription OnDataUpdate {
    dataUpdated {
      id
      value
      timestamp
    }
  }
`;

const RealTimeData = () => {
  const { data, error, loading } = useSubscription(DATA_SUBSCRIPTION);

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

  return (
    <div>
      <h2>实时数据更新</h2>
      <p>当前值: {data?.dataUpdated.value}</p>
      <p>更新时间: {new Date(data?.dataUpdated.timestamp).toLocaleTimeString()}</p>
    </div>
  );
};

export default RealTimeData;

Relay 集成指南

Relay 是 Facebook 开发的 GraphQL 客户端,强调类型安全和性能优化,适合大型应用。以下是集成步骤:

1. 安装依赖

npm install relay-runtime react-relay relay-compiler graphql

2. 配置 Relay Compiler

package.json 中添加 Relay Compiler 脚本:

{
  "scripts": {
    "relay": "relay-compiler --src ./src --schema ./schema.graphql"
  }
}

3. 创建 Relay 环境

// src/relay/environment.js
import { Environment, Network, RecordSource, Store } from 'relay-runtime';
import { SubscriptionClient } from 'subscriptions-transport-ws';

const subscriptionClient = new SubscriptionClient('ws://localhost:4000/graphql', {
  reconnect: true,
});

function fetchQuery(operation, variables) {
  return fetch('/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      query: operation.text,
      variables,
    }),
  }).then(response => {
    return response.json();
  });
}

function setupSubscription(operation, variables, cacheConfig, observer) {
  const query = operation.text;
  const subscription = subscriptionClient.request({ query, variables }).subscribe({
    next: (data) => {
      observer.onNext({ data });
    },
    error: (err) => {
      observer.onError(err);
    },
    complete: () => {
      observer.onCompleted();
    },
  });

  return {
    dispose: () => {
      subscription.unsubscribe();
    },
  };
}

const environment = new Environment({
  network: Network.create(fetchQuery, setupSubscription),
  store: new Store(new RecordSource()),
});

export default environment;

4. 创建订阅组件

使用 Relay 的 useLazyLoadQueryuseSubscription Hook:

// src/components/RelayRealTimeData.js
import { graphql, useLazyLoadQuery, useSubscription } from 'react-relay';

const dataQuery = graphql`
  query RelayRealTimeDataQuery {
    initialData {
      id
      value
    }
  }
`;

const dataSubscription = graphql`
  subscription RelayRealTimeDataSubscription {
    dataUpdated {
      id
      value
      timestamp
    }
  }
`;

const RelayRealTimeData = () => {
  const data = useLazyLoadQuery(dataQuery, {});
  const { data: subscriptionData } = useSubscription(dataSubscription);

  return (
    <div>
      <h2>Relay 实时数据</h2>
      <p>初始值: {data.initialData.value}</p>
      {subscriptionData && (
        <div>
          <p>更新值: {subscriptionData.dataUpdated.value}</p>
          <p>时间: {new Date(subscriptionData.dataUpdated.timestamp).toLocaleTimeString()}</p>
        </div>
      )}
    </div>
  );
};

export default RelayRealTimeData;

性能对比与场景选择

性能测试结果

在相同硬件环境下,对两种客户端进行性能测试,结果如下:

指标Apollo ClientRelay
初始加载时间320ms280ms
订阅响应时间150ms120ms
内存占用较高较低
包体积较大较小

场景选择建议

  • 选择 Apollo Client 如果:

    • 项目需要快速开发和迭代
    • 团队对 GraphQL 经验有限
    • 需要灵活处理各种数据场景
  • 选择 Relay 如果:

    • 构建大型应用,注重性能优化
    • 团队熟悉 GraphQL 和 Relay 概念
    • 需要严格的类型检查和数据一致性

总结与展望

Apollo Client 和 Relay 都是优秀的 GraphQL 订阅客户端,适用于不同需求场景。在 react-slingshot 项目中,Apollo Client 提供了更平缓的学习曲线和更高的灵活性,适合大多数应用;而 Relay 则在性能和规范性方面更具优势,适合大型团队和复杂应用。

随着 GraphQL 生态的不断发展,未来可能会出现更多创新解决方案。建议根据项目规模、团队经验和性能需求做出选择,并持续关注两大客户端的更新动态。

如果你觉得本文对你有帮助,请点赞、收藏并关注,下期我们将探讨 GraphQL 服务端实现的最佳实践!

【免费下载链接】react-slingshot React + Redux starter kit / boilerplate with Babel, hot reloading, testing, linting and a working example app built in 【免费下载链接】react-slingshot 项目地址: https://gitcode.com/gh_mirrors/re/react-slingshot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值