Relayコンパイラー
graphql
Relayによって提供されるgraphql
テンプレートタグは、GraphQL言語でクエリ、フラグメント、ミューテーション、サブスクリプションを記述するメカニズムとして機能します。例えば
import {graphql} from 'react-relay';
graphql`
query MyQuery {
viewer {
id
}
}
`;
graphql
テンプレートタグを使用すると、GraphQLTaggedNode
というGraphQLドキュメントのランタイム表現が得られます。
graphql
テンプレートタグは、ランタイムで実行されることはありません。代わりに、Relayコンパイラーによって事前にコンパイルされ、ソースコードと一緒に存在する生成されたアーティファクトになり、Relayがランタイムで動作するために必要になります。
コンパイラー
RelayはRelayコンパイラーを使用して、graphql
リテラルを、ソースファイルと共に存在する生成ファイルに変換します。
次のようなフラグメントがあるとします。
graphql`
fragment MyComponent on Type {
field
}
`
これにより、./__generated__/MyComponent.graphql.js
に生成ファイルが表示され、ランタイムアーティファクト(Relayストアからの読み書きを支援)と、タイプセーフなコードを作成するのに役立つFlow型の両方が含まれます。
Relayコンパイラーは、ビルドステップの一部としてコードを生成し、ランタイムで参照できるようにします。クエリを事前にビルドすることで、Relayのランタイムはクエリ文字列を生成する必要がなくなり、ランタイムではコストが高すぎる可能性のあるクエリに対してさまざまな最適化を実行できます(たとえば、クエリで重複しているフィールドはビルドステップ中にマージして、GraphQLレスポンスの処理効率を向上させることができます)。
GraphQLスキーマ
Relayコンパイラーを使用するには、GraphQLサーバーのAPIを記述する.graphql
GraphQLスキーマファイルが必要です。通常、これらのファイルはサーバーの信頼できる情報源のローカル表現であり、直接編集されることはありません。たとえば、次のようなschema.graphql
がある場合があります。
schema {
query: Root
}
type Root {
dictionary: [Word]
}
type Word {
id: String!
definition: WordDefinition
}
type WordDefinition {
text: String
image: String
}
コンパイラーの実行
さらに、GraphQLクエリとフラグメントを記述するためにgraphql
タグを使用する.js
ファイルを含むディレクトリが必要です。これを./src
と呼びましょう。
次に、以前に設定したとおりにyarn run relay
を実行します。
これにより、graphql
タグを含む対応するファイルと同じ場所に、一連の__generated__
ディレクトリが作成されます。
たとえば、次の2つのファイルがあるとします。
src/Components/DictionaryComponent.js
const DictionaryWordFragment = graphql`
fragment DictionaryComponent_word on Word {
id
definition {
...DictionaryComponent_definition
}
}
`
const DictionaryDefinitionFragment = graphql`
fragment DictionaryComponent_definition on WordDefinition {
text
image
}
`
src/Queries/DictionaryQuery.js
const DictionaryQuery = graphql`
query DictionaryQuery {
dictionary {
...DictionaryComponent_word
}
}
`
これにより、3つの生成ファイルと2つの__generated__
ディレクトリが生成されます。
src/Components/__generated__/DictionaryComponent_word.graphql.js
src/Components/__generated__/DictionaryComponent_definition.graphql.js
src/Queries/__generated__/DictionaryQuery.graphql.js
生成された定義のインポート
通常、生成された定義をインポートする必要はありません。Relay Babelプラグインは、コード内のgraphql
リテラルを、生成されたファイルに対するrequire()
呼び出しに変換します。
ただし、Relayコンパイラーは、Flow型をタイプコメントとして自動的に生成します。たとえば、生成されたFlow型を次のようにインポートできます。
import type {DictionaryComponent_word} from './__generated__/DictionaryComponent_word.graphql';
まれに、複数のファイルからクエリ、ミューテーション、フラグメント、またはサブスクリプションにアクセスする必要がある場合があります。これらの場合は、直接インポートすることもできます。
import DictionaryComponent_word from './__generated__/DictionaryComponent_word.graphql';
このページは役に立ちましたか?
より良いサイトにするために 簡単な質問に答えてください.