与 React Native 集成
您可以使用Apollo 客户端与 React Native 的方式安装它与 React.js。安装方式如下:npm
:
npm install @apollo/client graphql
然后在 ApolloProvider
组件中包装您的应用程序,如下所示:
import React from 'react';import { AppRegistry } from 'react-native';import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';// Initialize Apollo Clientconst client = new ApolloClient({uri: 'https://127.0.0.1:4000/graphql',cache: new InMemoryCache()});const App = () => (<ApolloProvider client={client}><MyRootComponent /></ApolloProvider>);AppRegistry.registerComponent('MyApplication', () => App);
关于 setup Apollo Client 的更多信息,请参阅入门。
示例应用程序
此示例应用程序由GraphQL指南维护,使用 React Native 和 Apollo Client。
Apollo 客户端开发者工具
1. 使用React Native Debugger
React Native Debugger 支持Apollo 客户端开发者工具:
- 安装 React Native Debugger 并打开它。
- 在您的应用程序中启用“远程调试 JS”。
- 如果您看不到开发者工具面板或 Apollo 标签缺失,请右键单击任何位置并选择切换开发者工具。
2. 使用Flipper
名为React Native Apollo devtools的社区插件在 Flipper 中可用,支持查看缓存数据。
-
安装 Flipper 并打开它。
-
前往添加插件并搜索
react-native-apollo-devtools
并安装 -
将
react-native-flipper
和react-native-apollo-devtools-client
添加为react native应用的开发依赖。 -
在客户端使用flipper初始化插件
import { apolloDevToolsInit } from 'react-native-apollo-devtools-client';const client = new ApolloClient({// ...});if (__DEV__) {apolloDevToolsInit(client);}
通过文本流处理多部分HTTP
默认情况下,React Native自带基于XHR构建的fetch
实现,不支持文本流。
因此,如果您正在使用以下中的任意一项:@defer
或通过多部分HTTP的订阅——这些功能使用文本流来读取多部分HTTP响应——您需要采取额外的步骤来实现这一功能。
- 安装
react-native-fetch-api
和react-native-polyfill-globals
并将他们都作为依赖保存。 - 在您应用的主入口处(例如
index.js
,App.js
或类似文件),导入以下三个polyfill并在任何应用代码之前调用每个polyfill*
函数:
import { polyfill as polyfillEncoding } from "react-native-polyfill-globals/src/encoding";import { polyfill as polyfillReadableStream } from "react-native-polyfill-globals/src/readable-stream";import { polyfill as polyfillFetch } from "react-native-polyfill-globals/src/fetch";polyfillReadableStream();polyfillEncoding();polyfillFetch();
- 最后,我们需要传递给我们的polyfill'd的
fetch
一个特殊选项。创建一个HttpLink
以便我们可以在我们默认的fetchOptions
中设置以下内容:
const link = new HttpLink({uri: "https://127.0.0.1:4000/graphql",fetchOptions: {reactNative: { textStreaming: true },},});
注意:如果在添加上述polyfill后Android上仍存在问题,可能存在像Flipper这样的库在本地开发期间拦截请求。尝试在android/app/src/debug/java/com/<projectname>/ReactNativeFlipper.java
中注释掉NetworkFlipperPlugin
或以发布模式运行您的应用程序。
现在您已准备好在React Native应用中使用@defer
和/或多部分订阅在HTTP中!
故障排除
未捕获错误:无法读取'prototype'的属性
或从@apollo/client
导入时出现的类似Metro构建错误
这是由于 Metro 打包器支持 .cjs
和 .mjs
文件的方式,它需要额外的配置来隐式解析这些扩展名的文件: 需要额外的配置才能隐式解析这些扩展名的文件,因此隐式解析具有这些扩展名的文件时,扩展名将导致错误。import { ApolloClient, InMemoryCache } from '@apollo/client'
将引发错误。您可以修改导入语句,例如import { ApolloClient, InMemoryCache } from '@apollo/client/main.cjs'
,或者您可以安装@expo/metro-config
并在项目根目录的metro.config.js
中进行配置:
const { getDefaultConfig } = require('@expo/metro-config');const config = getDefaultConfig(__dirname);config.resolver.sourceExts.push('cjs');module.exports = config;