2016-06-05 7 views
0

Ich habe versucht, einen Job auf Relayjs zu machen und verstehe das Verhalten nicht, das es anzeigt, wenn ich die Argumente ändere. Betrachten Sie das folgende Beispiel. Dies ist die erste Abfrage, dieKnoten in Realys Abfrage verstehen?

query MainQuery($duration_0: Length!) { 
    store { 
    ...F1 
    } 
} 

fragment F1 on Store { 
    _storyConnection4nVN6E: storyConnection(random: 1, duration: $duration_0, first: 1) { 
    // other unnecessary details 
} 

Query-Variablen ausführt: duration_0: „VALUE_1“

gibt das Ergebnis als erwartet, aber sobald ich den Wert meiner ändern reagieren Komponente dh this.props.relay.setVariable({ //details }) dann die Abfrage aufrufen, die Relay führt so etwas aus.

query App_StoreRelayQL($id_0: ID!, $duration_1: Length!) { 
    node(id: $id_0) { 
    ...F1 
    } 
} 
fragment F1 on Store { 
    _storyConnection3tNeSy: storyConnection(random: 1, duration: $duration_1, first: 1) { 
    // details 
} 

Warum ist diese Abfrage auf node und was ist es überhaupt?

+0

[Diese Antwort] (http://Stackoverflow.com/a/33411416/2821632) erklärt anhand eines Beispiels (1) was 'node' in relayjs ist, (2) Warum fragt es auf "Knoten" und (3) wann. –

Antwort

0

Die Abfrage node, die Sie sehen, ist, dass Relay versucht, effizient nur den Teilbaum der Abfrage abzurufen, der von der Variablenänderung betroffen war.

Relay versucht, die Menge der vom Server abgerufenen Daten zu minimieren, indem nur die Teile abgerufen werden, die es benötigt. Eine Möglichkeit besteht darin, die Schnittstelle node zu verwenden, mit der Elemente an beliebiger Stelle im Diagramm per ID abgerufen werden können. Bei Variablenänderungen (wie in Ihrer Abfrage) prüft es, welcher Teil des Baumes von der Änderung betroffen war und ruft nur diesen Teil ab.

Da GraphQL-Abfragen Bäume sind, wirkt sich eine Variablenänderung möglicherweise nur auf den Teilbaum unterhalb des Ortes aus, an dem sie verwendet wird. In Ihrem Fall wirkt sich dies auf den Stamm des Baumes aus, so dass die beiden Abfragen effektiv die gleiche Größe haben, aber Relay unterscheidet sich dort nicht.

In einigen Fällen ist das Minimieren der Abfrage schneller und effizienter, aber in anderen Fällen kann es tatsächlich langsamer sein. Daher gibt es bei der Auswahl eines GraphQL-Clients einige Kompromisse.

Relay war der einzige brauchbare GraphQL Open-Source-Client für eine Weile, aber jetzt werden andere gebaut. Der reifste unter ihnen ist Apollo client. Apollo-Client führt auch Cache- und Abfrage-Minimierung wie Relay durch, verwendet jedoch nicht die Schnittstelle node, und daher sind die Abfragen, die er erstellt, leichter zu verstehen. Einfach zu bedienen, zu verstehen und zu debuggen sind einige der wichtigsten Dinge, die es von Relay unterscheiden. Angesichts Ihrer Frage könnte es nützlich sein, es auszuprobieren. (Anmerkung: Ich bin in das Projekt involviert)