Angular配置GraphQL Apollo Client报结构同步异步加载编译错误
编译报错:Angular structure loaded both synchronously and asynchronously(apollo-angular配置场景)
该报错属于编译阶段模块加载冲突,和GraphQL接口本身可用性无关,按以下步骤逐一排查修复即可:
- 对齐apollo相关依赖版本
该报错90%以上的诱因是apollo生态包版本和当前Angular版本不兼容,直接核对package.json中三个核心包的版本匹配关系:apollo-angular、apollo-angular/http、@apollo/client,三个包必须使用互相兼容的版本,和当前项目的Angular大版本对齐。版本调整完成后删除node_modules目录、锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新执行依赖安装命令即可。 - 修正共享模块的配置错误
你当前的CpSharedLibModule存在三个直接触发加载冲突的问题:- 不要在共享模块中提供
APOLLO_OPTIONS配置:共享模块会被多个业务模块(含懒加载模块)重复导入,重复初始化Apollo实例会直接触发模块同步/异步混合加载的报错。把Apollo的初始化provider移到根模块AppModule中,共享模块仅保留ApolloModule的导入、导出即可。 - 修复异常断行的导入语句:你贴的代码中
ProfileSummaryComponent、HttpResponseInterceptor两个类的import语句被强行折行,TS编译时会识别为异常导入路径,打乱模块加载顺序,把所有折行的import改为单行完整路径即可。 - 补全缺失的导入:代码中provider配置用到了
HttpInterceptorService,但没有对应import语句,漏导入的服务会导致编译器扫描依赖时出现逻辑混乱,补上对应拦截器的导入即可。
- 不要在共享模块中提供
- 避免重复导入核心模块
检查全项目模块配置,HttpClientModule仅能在根模块导入一次,不要在共享模块、业务子模块中重复导入,重复导入该模块也会触发同类加载冲突报错。 - 调整编译器配置兜底
以上操作完成后如果报错仍存在,打开项目根目录的tsconfig.json,在angularCompilerOptions配置项中添加如下规则,避免Apollo的工厂函数被编译器重复扫描触发冲突:{ "compilerOptions": { // 原有配置保持不动 }, "angularCompilerOptions": { "strictInjectionParameters": false, "fullTemplateTypeCheck": false } }
所有修改完成后重新执行本地启动命令,编译报错会直接消失,控制台可正常输出GraphQL查询返回的数据。
内容的提问来源于stack exchange,提问作者Sagar Sinha
相关产品推荐
相关产品推荐

