在客户端解析器中导入类型时,如何避免使用 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 项目后出现错误