我目前正试图获得阿波罗Angular代码生成(见:https://the-guild.dev/graphql/codegen/docs/guides/angular)从单个模式创建类型,查询和突变。graphqls文件。我使用与指南
中相同的模式文件type Author {
id: Int!
firstName: String!
lastName: String!
posts(findTitle: String): [Post]
}
type Post {
id: Int!
title: String!
author: Author
}
type Query {
posts: [Post]
}
再次,在指南中,我添加必要的依赖到我的项目
npm install graphql
npm install -D typescript
npm install -D @graphql-codegen/cli
npm install -D @graphql-codegen/typescript
npm install -D @graphql-codegen/typescript-operations
npm install -D @graphql-codegen/typescript-apollo-angular
,我使用以下codegen.ts
文件:
import type { CodegenConfig } from '@graphql-codegen/cli';
const config: CodegenConfig = {
schema: './schema.graphqls',
generates: {
'./src/app/graphql/generated.ts': {
plugins: [
'typescript',
'typescript-operations',
'typescript-apollo-angular',
],
},
},
};
export default config;
执行命令npm run generate
后,收到成功提示,生成指定文件./src/app/graphql/generated.ts
。然而,在这个文件中,我只得到类型定义。没有GQL文件,比如阿波罗Angular代码生成指南中最后一个例子中使用的PostsGQL
。我是不是漏掉了什么?为什么不生成GQL文件?查询出现在模式中。graphqls文件,但不在最终的generated.ts
文件中。我们需要分别指定突变和查询吗?如果是,为什么?
我已经用我的例子创建了一个Stackblitz: https://stackblitz.com/edit/node-mvtcqm。在codegen-example目录下是我的示例Angular项目,其中包含阿波罗GraphQL代码生成和GraphQL模式文件。
GraphQL有两个方面:
- 模式:GraphQL服务器的定义接口。
- 操作:定义GraphQL客户端
已经定义了模式,但是没有操作。假设你想生成PostsGQL
:
-
在.graphql文件中定义操作。在本例中,我们执行:
# file: ./src/app/graphql/operations.graphql query Posts { posts { id, title, author { id firstName } } }
-
在你的代码根配置中设置文档属性:
// file: ./codegen.ts import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { schema: './schema.graphqls', generates: { './src/app/graphql/generated.ts': { documents: './src/app/graphql/operations.graphql', // <-- Bingo!!! plugins: [ 'typescript', 'typescript-operations', 'typescript-apollo-angular', ], }, }, }; export default config;
-
运行
npm run generate
并检查生成的.ts文件:// file: ./src/app/graphql/generated.ts // ... @Injectable({ providedIn: 'root' }) export class PostsGQL extends Apollo.Query<PostsQuery, PostsQueryVariables> { document = PostsDocument; constructor(apollo: Apollo.Apollo) { super(apollo); } }
查看这里的分支示例:https://stackblitz.com/edit/node-k4pecg