3

TypeScript で Web アプリを作成しています。アプリは 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 プラグインがトランスパイルされたバージョンを認識せず、その結果、ブラウザーが理解できるものにクエリをトランスパイルしないためです。

これを機能させる方法は?

4

3 に答える 3

1

Typescript コンパイラに ES6 にトランスパイルするように指示してから、Babelbabel-relay-plugines2015プリセットを使用してコードを ES5 にトランスパイルし、ブラウザで実行する必要があります。

これらすべてを調整するには、Webpack を使用することをお勧めします。これらはあなたを始めるでしょう:

  1. http://www.jbrantly.com/typescript-and-webpack/
  2. http://www.jbrantly.com/es6-modules-with-typescript-and-webpack/

投稿は Babel 5.x 向けに書かれているため、手動でプリセットを追加es2015して、Babel が ES6 ソースを ES6 に確実にコンパイルするようにする必要があります。

于 2016-01-15T17:04:19.493 に答える