配置 Apollo 项目
如何通过 apollo.config.js 配置 Apollo VS Code 和 CLI
Apollo 项目使用apollo.config.js
文件在项目的根目录中配置。许多 Apollo 工具会利用您的 Apollo 配置,最终减少您在项目中需要进行的配置量。
如果您使用我们的工作流程工具之一,如Apollo CLI或Apollo VS Code 扩展,您将需要一个apollo.config.js
项目来获取这些工具提供的功能。
有两种类型的项目,client
和service
。如果配置中找到client
密钥,则将该项目视为客户端项目,只能对它运行client:*
命令。相同的情况也适用于service
项目。apollo.config.js
文件旨在描述单个项目的配置。如果在一个多项目 monorepo 中使用,则每个项目应有一个单独的配置文件。
本文件描述了 Apollo 配置中可用的所有选项,并定义了哪些是必需的与可选的。
客户端项目
客户端项目通过配置中的顶层client
键进行配置。
module.exports = {client: { ... },};
client.service
必需 - Apollo CLI 和 VS Code 扩展依赖于对您架构的了解来显示 "IntelliSense"(例如,在 字段、指标注释、查询验证)。
您有多种方法可以将客户端链接到架构
- 使用 Apollo 架构注册表
- 通过远程端点(运行中的服务器)
- 通过本地架构文件
选项 1:使用 Apollo 架构注册表
要将客户端链接到架构,您需要至少在 注册表中发布您的架构的一个版本。
设置 GraphOS Studio 后,您可以通过在 Apollo 配置中指定您的图名来直接将客户端指向您图中的架构,例如:
module.exports = {client: {service: 'my-apollo-service' // the name of your graph in Studio}};
ⓘ 注意
您必须有一个 已发布架构才能使 VS Code IntelliSense 等功能正常工作,这些功能需要了解您的架构。
如果您使用 图 变体 在注册表中跟踪架构的不同版本,您可以通过以下方式将客户端链接到特定的变体:
module.exports = {client: {service: 'my-apollo-service@staging' // "staging" is the graph variant we're using}};
如果没有指定 图 变体,Apollo 工具将回退到 current
的默认值。
选项 2:从远程端点链接架构
可以通过远程端点拉取运行中的服务中的架构。这可以这样配置
module.exports = {client: {service: {name: 'github',url: 'https://api.github.com/graphql',// optional headersheaders: {authorization: 'Bearer lkjfalkfjadkfjeopknavadf'},// optionally turn off SSL validation checkskipSSLValidation: true}}};
选项 3:从本地文件链接架构
在某些情况下,您可能有一个带有您模式的本 地生成的文件,希望将其链接。它可以是 .graphql
文件,其中包含以 SDL 格式编写的模式,或者是一个保存的 introspection 结果,存为 .json
。要将您的客户端项目链接到本地模式文件,请按以下方式配置:
module.exports = {client: {service: {name: 'my-service-name',localSchemaFile: './path/to/schema.graphql'}}};
client.includes
可选 - 默认情况下,Apollo 工具将在 ./src
目录下查找所有 操作 和 SDL 以提取。
客户端项目通常包含本地状态客户端模式定义,使用 Apollo Client。为了确保 Apollo CLI 和 VS Code 扩展能找到这些文件并正确读取它们,您可能需要告诉 Apollo 要在哪些文件夹中查找您的模式和查询,如下所述:
module.exports = {client: {includes: ['./imports/**/*.js'], // array of glob patternsservice: ...},};
client.excludes
可选 - 默认情况下,Apollo 工具在查找您的查询和模式文件时将排除 **/node_modules
和 **/__tests___
。
如果您希望 Apollo 在查找查询和模式定义时忽略其他任何文件夹,请按以下方式调整您的配置
module.exports = {client: {excludes: ['**/__tests__/**/*'], // array of glob patternsservice: ...},};
client.tagName
可选 - 定制的标签模板。
当在 JavaScript 或 TypeScript 项目中使用 GraphQL 时,通常使用 gql 标签模板字面量来写出操作。Apollo 工具将遍历您的文件以查找 gql 标签以提取您的查询,因此如果使用不同的模板字面量,可以按如下方式配置:
module.exports = {client: {tagName: "graphql",service: ...}};
client.addTypename
可选 - 默认情况下,Apollo 会自动将 __typename
字段添加到所有操作中,并在代码生成期间添加到所有生成的类型中。
类似于 GraphQL 客户端(例如,Apollo Client),它们在发送到线路时通常会自动将 __typename 字段添加到操作中。这可以非常方便地用于缓存等功能,但可以通过在客户端配置中添加 addTypename: false 来关闭:
module.exports = {client: {addTypename: false,service: ...}};
💡 提示
为了保证一致性,我们建议您将此选项与您的 ApolloClient
配置保持一致。
client.clientOnlyDirectives
, client.clientSchemaDirectives
可选 - 默认情况下,Apollo 项目支持以下客户端 指令:
@client
用于本地状态@rest
用于使用apollo-link-rest
@connection
用于使用 Apollo Client 的自定义分页@type
用于与apollo-link-rest
结合使用的动态类型名称
客户端应用程序可以在其查询中使用自定义的指令 ,这些指令不打算发送到服务器。 上述默认值之外客户端指令的配置可以设置如下:
module.exports = {client: {clientOnlyDirectives: ["connection", "type"],clientSchemaDirectives: ["client", "rest"],service: ...}};
clientOnlyDirectives
是在发送到服务器之前应该从 操作 中移除的 指令。 这是此类指令的例子之一,即 @connection
指令。
clientSchemaDirectives
是表示操作中不应该发送到服务器的那部分内容的 指令。 这些指令以及它们放置在上的 字段 也会被移除。 这类指令的例子是 @client
指令。
服务器项目
服务器项目通过配置中的顶级 service
键进行配置。
module.exports = {service: { ... },};
在您的Apollo配置中定义一个 service
键将为Apollo CLI提供执行类似 apollo service:push
和 apollo service:check
命令所需的信息。
- 您可以通过两种方式设置服务的模式以进行加载:
- 使用远程端点
选项1:远程端点
可以通过远程端点拉取运行中的服务中的架构。这可以这样配置
module.exports = {service: {endpoint: {url: 'https://api.github.com/graphql', // defaults to https://127.0.0.1:4000headers: {// optionalauthorization: 'Bearer lkjfalkfjadkfjeopknavadf'},skipSSLValidation: true // optional, disables SSL validation check}}};
选项2:本地模式
在某些情况下,您可能有一个本地生成的包含您模式文件,您想要链接。 这可以是SDL格式的.graphql
文件或包含查询结果的已保存 introspection 结果的.json 文件。 要将您的客户端项目链接到本地模式文件,请按照以下方式配置它:
module.exports = {service: {localSchemaFile: './path/to/schema.graphql'}};