You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo Server服务端如何将查询及类型拆分到多个文件

Apollo Server 拆分 Schema 到独立 .graphql 文件的实现方案

一、如何导入并引用拆分后的 .graphql 文件

要实现分散的 .graphql 文件合并为完整 Schema,可借助 @graphql-tools 工具包完成,具体步骤如下:

1. 安装必要依赖

先安装核心工具包:

npm install @graphql-tools/load-files @graphql-tools/merge graphql

如果使用 TypeScript,需补充类型声明(未自动安装时手动执行):

npm install -D @types/graphql

2. 创建拆分的 .graphql 文件

按类型或功能拆分文件,示例结构:

  • src/schema/books.graphql:存放 Book 类型及相关字段
type Book {
  id: ID!
  title: String!
  authorId: ID!
}
  • src/schema/authors.graphql:存放 Author 类型
type Author {
  id: ID!
  name: String!
  books: [Book!]!
}
  • src/schema/queries.graphql:存放根 Query 字段
type Query {
  getBook(id: ID!): Book
  getAuthor(id: ID!): Author
  getAllBooks: [Book!]!
}

3. 在 schema.ts 中加载并合并所有文件

编写代码加载指定目录下的 .graphql 文件,合并为完整 Schema:

import { loadFilesSync } from '@graphql-tools/load-files';
import { mergeTypeDefs } from '@graphql-tools/merge';
import { makeExecutableSchema } from '@graphql-tools/schema';
import resolvers from './resolvers'; // 你的解析器文件

// 加载所有 .graphql 文件,路径根据项目结构调整
const typeDefsArray = loadFilesSync('./src/schema/**/*.graphql');
// 合并所有类型定义
const mergedTypeDefs = mergeTypeDefs(typeDefsArray);
// 生成可执行 Schema
const schema = makeExecutableSchema({
  typeDefs: mergedTypeDefs,
  resolvers,
});

export default schema;

4. TypeScript 配置(可选)

若 TypeScript 无法识别 .graphql 文件,在项目根目录创建 graphql.d.ts 声明文件:

declare module '*.graphql' {
  import { DocumentNode } from 'graphql';
  const content: DocumentNode;
  export default content;
}

同时确保 tsconfig.json 的 include 包含该声明文件:

{
  "include": ["src/**/*", "graphql.d.ts"]
}

二、.graphql 文件是否仅适用于客户端?

当然不是。.graphql 是 GraphQL 类型定义的原生格式,服务端和客户端均可使用:服务端用它定义 API 的 Schema 结构,客户端用它编写查询/突变语句,本质是同一语法规范的不同应用场景。

三、Schema 选择 .ts 还是 .graphql 文件?

根据项目规模与团队协作需求决策:

  • 小规模项目/快速原型:用 .ts 中的 gql 字符串更便捷,无需额外配置工具链,直接嵌入代码即可运行。
  • 中大规模项目/团队协作:优先选 .graphql 文件,优势包括:
    • 语法纯粹,无 JavaScript/TypeScript 字符串嵌套,可读性更强
    • 类型定义与业务代码分离,Schema 结构更清晰
    • 可使用 GraphQL 专用工具(如 eslint-plugin-graphql、prettier-plugin-graphql)做语法检查和格式化,统一团队规范
    • 便于扩展 Schema 可视化、自动生成文档等操作
  • 混合场景:若存在动态生成的类型(如从数据库表结构自动生成),可用 .ts 处理动态部分,静态类型仍用 .graphql 文件维护。

内容的提问来源于stack exchange,提问作者user8758206

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:48:19