react-native运行relay-compiler报Expect GraphQLAsts to exist错误求解
Relay Compiler 抛出
Expect GraphQLAsts to exist Panic 修复方案 这个报错是Rust版本的relay-compiler在解析流程异常时触发的崩溃,按以下优先级排查修复即可:
- 第一优先级:修正Schema文件的非法注释
GraphQL SDL 语法不支持双斜杠//风格的单行注释,仅支持#开头的注释格式。你在schema文件开头写的// relay_schema.graphql属于非法语法,会导致schema解析器完全无法生成合法AST:空schema文件时没有需要解析的内容所以不会触发报错,写入带非法语法的内容后就会触发该panic。
修正后的合法schema内容:# relay_schema.graphql type Query { tasks: [TaskNode] } type TaskNode { id: ID! } - 第二优先级:修正Relay配置项
两个常见配置错误会触发同类问题:- 路径使用相对路径硬编码:执行relay-compiler时工作目录可能和配置文件所在目录不一致,会导致找不到schema或源码文件,建议用Node内置
path模块拼接绝对路径 language配置与项目实际语言不匹配:如果你没有在React Native项目中接入Flow类型系统,不要将该项设为flow,使用普通JS就设为javascript,使用TS就设为typescript
修正后的配置参考:
const path = require('path'); module.exports = { src: path.resolve(__dirname, './src/'), language: 'javascript', schema: path.resolve(__dirname, './relay_schema.graphql'), exclude: ['**/node_modules/**', '**/__mocks__/**', '**/__generated__/**'], }; - 路径使用相对路径硬编码:执行relay-compiler时工作目录可能和配置文件所在目录不一致,会导致找不到schema或源码文件,建议用Node内置
- 第三优先级:校验源码中的GraphQL定义
确认src目录下至少存在一个用graphql模板标签包裹的合法Relay操作(查询、突变、片段均可),部分旧版本relay-compiler在检测不到任何待编译的GraphQL操作时,也会触发同类AST不存在的崩溃。 - 修复后操作:删除项目中已有的
__generated__缓存目录,重新运行relay-compiler命令即可正常完成编译。
内容的提问来源于stack exchange,提问作者Abhimanyu Kaushal
相关产品推荐
相关产品推荐

