Relay Compiler无法编译Graph.Cool多继承GraphQL架构问题求助
为什么Relay Compiler只认
&而不认逗号分隔的GraphQL接口实现? 嘿,这个问题我之前帮不少开发者踩过坑,其实这不是Relay的BUG,而是GraphQL标准规范和Relay工具链的语法兼容差异导致的,我给你掰扯清楚:
先明确两个关键点
- 标准GraphQL规范:类型实现多个接口时,确实是用逗号分隔的,比如
type User implements Node, AnonymousUser { ... },这个写法是完全符合官方定义的。 - Relay Compiler的特殊处理:Relay内部依赖的GraphQL解析器(基于
graphql-js),在历史版本中对&分隔接口的写法做了兼容,后来这个写法逐渐成为Relay推荐的标准写法,甚至在某些版本的编译器中,会直接拒绝逗号分隔的写法。
为什么Graph.Cool生成的是逗号写法?
Graph.Cool(现在叫Prisma)是严格遵循官方GraphQL规范生成Schema的,所以它输出的是implements Node, AnonymousUser这种标准格式。但Relay因为自身的工具链需求(比如和Relay的类型系统、Fragment匹配逻辑更好兼容),更倾向于使用&来分隔多个接口,这就造成了工具之间的语法冲突。
解决办法
- 直接替换分隔符:把Schema里的逗号改成
&,也就是写成type User implements Node & AnonymousUser { ... },这是最快速解决问题的方式,也符合Relay的推荐写法。 - 升级Relay Compiler:如果你坚持想用标准逗号写法,可以尝试升级到最新版本的Relay Compiler——新版本对标准语法的兼容更好,部分场景下逗号分隔也能正常编译(不过还是建议用
&,因为Relay官方文档里也更推崇这种写法)。
关于你遇到的编译错误
你提到的报错应该是类似这样的(根据Relay常见报错还原):
$ relay-compiler --src ./src --schema ./env/schema.graphql
Error: Syntax Error: Expected Name, found ","
这就是Relay的解析器无法识别逗号分隔的接口列表导致的,换成&之后就能顺利通过编译了。
内容的提问来源于stack exchange,提问作者Kieran Guller
相关产品推荐
相关产品推荐

