【发布时间】:2016-04-21 07:30:56
【问题描述】:
我正在用 TypeScript 编写一个网络应用程序。该应用程序使用 Facebook 的 React 和 Relay。 我的 TypeScript 源代码使用 TypeScript 编译器 TSC 编译成 ES6 代码。然后,使用 Babel 将 ES6 代码转换为 ES5 代码。为了让 Relay 在浏览器中工作,Babel 插件需要转换 Relay GraphQL 查询:https://facebook.github.io/relay/docs/guides-babel-plugin.html。问题是,因为 TSC 首先转译了这些查询,Babel Relay 插件不再识别它们,所以它们不会被转译成浏览器可以理解的东西,所以浏览器会抛出错误:
未捕获的不变违规:RelayQL:意外调用 运行。要么未设置 Babel 变换,要么未设置 识别此呼叫站点。确保它被逐字用作
Relay.QL.
我的 TypeScript 源代码:
const SiteQuery = {
store: () => Relay.QL`query { site }`
};
... TSC 将其编译成如下内容:
var SiteQuery = {\r\n store: function () { return (_a = [\"query { site }\"], _a.raw = [\"query { site }\"], Relay.QL(_a)); var _a; }\r\n};
... 而不是这样的(因为 Babel Relay 插件无法正常工作):
var SiteQuery = {\n store: function store() {\n return (function () {\n return {\n fieldName: 'site',\n kind: 'Query',\n metadata: {},\n name: 'Router',\n type: 'Site'\n };
这是因为 Babel Relay 插件无法识别转换后的版本,因此它不会将查询转换为浏览器可以理解的内容。
如何做到这一点?
【问题讨论】:
标签: reactjs babeljs relayjs tsc graphql-js