在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?

Posted

技术标签:

【中文标题】在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?【英文标题】:How to avoid circular dependency in angular project with Apollo client and `graphql-codegen` when importing types in client resolver? 【发布时间】:2020-04-16 23:35:05 【问题描述】:

我的目标是在使用 Apollo 客户端编写客户端解析器时使用生成的类型。

客户端解析器中的所有内容都按照Apollo here 的描述工作。但是,在项目中,我们还使用了 this blog 中描述的生成类型和 GQL 服务。问题来了。如果我从客户端解析器中生成的类型中导入一个类型,我会收到错误消息:

WARNING in Circular dependency detected:
eddy.module.ts ->
  ...graphql.module.ts ->
  ...resolvers.ts ->
  ...client-specific-recommendation-resolver.ts ->
  ...get-top-right-corner-state.ts ->
  ...graphql.ts -> // (generated types)
  ...eddy.module.ts

所以基本上get-top-right-corner-state.ts 文件中,因为我从生成的类型中导入如下:

import  Something  from '../../../../../generated/graphql';

备注

我们的应用程序将 apollo 加载到一个名为 graphql.module 的模块中,该模块由一个名为“eddy”的功能模块使用。我们已经使用codegen.yml 文件中的ngModule 属性对其进行了配置。

我能做些什么来防止这种情况发生?我非常想在我的客户端解析器中使用graphql-codegen 生成的类型。

【问题讨论】:

我将首先缩小以循环方式引用的问题。您唯一的选择是重新考虑您的设计(为什么要导入循环引用),或者在适当的情况下使用接口。 不知道能不能改一下graphql-codegen生成的自动生成的文件,但是即使我只是导入一个接口或者枚举,也会得到一个循环依赖。 我会向拥有 graphql-codegen 的人提出一个错误。听起来问题是在他们这边,而不是在你这边。 好的,谢谢,我试试看。 好消息是它不是你的障碍。显然有些事情需要修复,但它们只是警告。 【参考方案1】:

在阅读并尝试了这个问题后,我找到了解决方案。设置实际上非常简单,但比仅在 Angular 的根目录中提供生成的服务稍微复杂一些。

功能模块执行 Apollo 设置并创建客户端解析器。但不是在这里提供生成的服务,而是在另一个模块中提供,这里称为lazy-loaded.module.ts。 codegen.yml 现在看起来是这样的,并且没有循环依赖:

generates:
 <path-to-feature-module>/graphql.ts:
   schema: <path-to-client-schema>.ts
   documents: ./src/**/*.graphql
   config:
    ngModule: <path-to-lazy-loaded-module>#LazyLoadedModule

然后通过提供 Apollo 的功能模块导入延迟加载的模块,瞧,问题解决了?

【讨论】:

以上是关于在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.Enum 类型无法解析 - 在 Eclipse 中导入 Java 项目后出现错误

在 TypeScript 中导入 Victor.js?

通过路由为 IntelliJ 中导入的 Play 2.4.x 项目解析控制器

如何避免在每个测试文件中导入组件所需的所有内容?

打字稿,如何使用类作为参数的类型

如何在 TeamCity 中导入/解析 fxcop/stylecop 生成的 xml 报告