babel-plugin-relay能否与TypeScript编译器兼容?
解决babel-plugin-relay与原生TypeScript编译器的协作问题
下面提供几个可行的方案,帮你在使用原生TS编译器(满足ts-auto-mock需求)的同时处理Relay的graphql标签:
方案一:用relay-compiler生成静态代码
直接借助Relay官方的relay-compiler提前生成Fragments对应的类型和运行时代码,完全绕过babel-plugin-relay的编译转换:
- 在项目中执行编译命令,指定TypeScript作为输出语言:
relay-compiler --src ./src --schema ./schema.graphql --language typescript - 编译完成后,会在对应目录生成
.graphql.ts文件,这些文件包含了Fragments的运行时实现,单元测试里直接导入这些生成的文件即可,原生TS编译器能直接识别,不需要依赖babel处理graphql关键字。
方案二:使用TS Transformer处理graphql标签
用支持在原生TS编译阶段处理graphql标签的transformer工具,替代babel-plugin-relay的功能:
- 安装
ts-transform-graphql-tag和ttypescript(原生TS不支持直接配置transformers,需要用ttypescript作为包装) - 在
tsconfig.json中配置transformer:{ "compilerOptions": { "plugins": [ { "transform": "ts-transform-graphql-tag", "relay": true // 启用Relay兼容模式,确保生成的代码符合Relay要求 } ] } } - 用
ttypescript替代原生tsc命令来编译单元测试代码,这样TS编译器会在编译阶段自动处理graphql标签,生成Relay需要的结构,同时满足ts-auto-mock对原生TS编译的要求。
方案三:隔离依赖Relay的测试代码(备选)
如果只有部分测试用例用到Relay Fragments,可以把这部分代码单独抽离,先通过Babel+babel-plugin-relay编译成JS,再用TS编译器处理剩余代码。不过这种方式需要维护两套编译配置,相对繁琐,仅作为备选方案。
内容的提问来源于stack exchange,提问作者user17581019
相关产品推荐
相关产品推荐

