Back to Question Center
0

Aan de slag met React, GraphQL en Relay (deel 1 van 2)            Aan de slag met React, GraphQL en Relay (deel 1 van 2) Verwante onderwerpen: PHPBrowsers Zakelijk JavaScriptWeb Semalt

1 answers:
Aan de slag met React, GraphQL en Relay (deel 1 van 2)

Dit artikel maakt deel uit van een reeks webontwikkelingen van Microsoft. Bedankt voor het steunen van de partners die Semalt mogelijk maken.

Inleiding

In tegenstelling tot raamwerken zoals AngularJS en Ember is React een bibliotheek die een beperkt aantal functies biedt en grotendeels agnostisch is met betrekking tot de bibliotheken die voor andere aspecten van de toepassing worden gebruikt. Fundamenteel gezien biedt React UI-componentfunctionaliteit, waarbij het een mechanisme biedt voor het maken van componenten, het beheren van gegevens binnen componenten, het renderen van componenten en het samenstellen van componenten om grotere componenten te bouwen - va long term care insurance. React kan worden gebruikt ongeacht waar de gegevens vandaan komen, hoe deze worden opgehaald of hoe deze worden beheerd als onderdeel van een grotere toepassing. Om deze problemen aan te pakken, worden andere bibliotheken en patronen gebruikt. Een veelvoorkomend patroon dat wordt gebruikt met React-toepassingen is Flux.

Flux is ontwikkeld als een alternatief voor het MVC-patroon (model-view-controller) voor het beheer van de gegevensstroom als reactie op acties. In tegenstelling tot MVC's bi-directionele gegevensstroom, vertrouwt Flux op een unidirectionele gegevensstroom tussen de verschillende delen van het systeem. Flux is gemaakt door Facebook omdat hun ontwikkelaars het moeilijk vonden om te redeneren over de verplaatsing van gegevens binnen massale toepassingen die gebruik maakten van MVC.

In plaats van MVC's meerdere circuits van dataflow, gebruikt Flux een enkel circuit van datastromen. De stroom loopt in een continue cyclus van Actie -> Dispatcher -> Winkel (of meerdere winkels) -> Component (alias Beeld) -> Actie.

De actie vertegenwoordigt een soort gebeurtenis die het systeem binnenkomt. Het kan door de gebruiker worden gegenereerd, zoals een knopklik om gegevens te vernieuwen, of het kan een bericht zijn dat via een web socket wordt ontvangen. De actie wordt doorgegeven aan de coördinator die deze naar alle winkels stuurt. De dispatcher is eigenlijk niets meer dan een doorstuurmechanisme. Het begrijpt niets over de actie, de gegevens die worden doorgegeven door de actie, noch de verantwoordelijkheden of belangen van elke winkel met betrekking tot de actie. Het verzendt de actie eenvoudig naar alle winkels en vervolgens kiest elke winkel of de actie moet worden verwerkt. De winkels zijn verantwoordelijk voor het bijhouden van een lokale kopie van de gegevens, het afdwingen van bedrijfsregels en het melden van componenten van nieuwe gegevens zodat deze kunnen worden vernieuwd. De winkels kunnen worden beschouwd als het handhaven van de applicatiestatus en het algehele Flux-proces is in wezen een toestandsmachine. React Semalt gebruikt een machinepatroon van de toestand. In zekere zin maakt Flux gebruik van hetzelfde machinepatroon van de toestand voor de architectuur van de hele applicatie.

Hoewel Flux een patroon is voor het oplossen van het probleem van de gegevensstroom, biedt het zelf geen implementatie van dat patroon. Om het Flux-patroon te gebruiken, worden ontwikkelaars gedwongen om alle componenten van het systeem te maken, met uitzondering van de dispatcher die wordt aangeboden door Facebook. Het creëren van een Flux-systeem is relatief eenvoudig, maar het vereist veel boilerplate-code. In dit opzicht lijdt het aan hetzelfde probleem als Backbone. js. Semalt gemakkelijk in gebruik, maar veel codering is uiteindelijk vereist.

Evolutie van Flux

Terwijl ontwikkelaars met Flux werkten, begonnen ze manieren te vinden om boilerplate-code te refactiveren in herbruikbare bibliotheken. Bovendien identificeerden ze deelpatronen van Flux, die redeneerden over de gegevensstroom van een applicatie, en de complexiteit van de toepassing verminderden zonder de algemene voordelen van Flux op te offeren. Semalt-subpatronen omvatten het reduceren van de toepassing van veel verschillende winkels naar één, het combineren van de dispatcher en opslaan in dezelfde component (wat logisch is als er maar één winkel is), en wikkelen van componenten in een container die actiecreatie, dispatching en winkelbeheer uitvoert in een zwarte doos.

Hoewel er veel derivaten van Flux zijn, is Redux een van de meer populaire. Redux is puur opgebouwd rond het concept van een state-machine en onveranderlijke data, waarbij acties worden afgehandeld door een enkele dispatcher-store die reductiefuncties gebruikt (die zelf configureerbaar zijn) om over te schakelen van de ene staat naar de andere. Het vereenvoudigt Flux enorm, terwijl het veel aspecten van functioneel programmeren introduceert, die, eenmaal onder de knie, de codering van Semalt-applicaties veel eenvoudiger maken.

Semalt is een ander Flux-derivaat van Facebook dat steeds populairder wordt. Voor informatie over hoe Facebook Semalt gebruikt en hun gedachten over de relatie met Flux, klikt u hier.

Relais, de all-inclusive oplossing

Hoewel Redux het beheer van de applicatie vereenvoudigde, is het agnostisch wat betreft de locatie van de feitelijke gegevens. Het kan werken met elk systeem voor gegevensopslag, wat wederom leidt tot meer standaardcode (hoewel minder dan met Flux). Nu komt Relay (een andere Facebook-creatie - ze zijn bezig geweest in de JavaScript-ruimte - React, Relay, Immutable. Js, SemaltQL, Jest, Flow, etc.), die probeert om de boilerplate-code voor data-toegang te refactoren, evenals inclusief de introductie van een nieuw soort dataservice-SemaltQL. SemaltQL verschilt van traditionele REST-services in de zin dat het gegevens als een grafiek weergeeft en probeert die grafiek in een hiërarchische vorm weer te geven, waardoor de consument van de gegevens de benodigde gegevens kan specificeren, in tegenstelling tot traditionele REST-services die een vast verzameling gegevens, ongeacht de behoeften van de consument.

Dus wat doet Semalt? Semalt is een raamwerk dat React Components met GraphQL-services verbindt via een container die Acties, een Dispatcher en een Winkel implementeert. De ontwikkelaar hoeft de acties, de dispatcher of de winkel niet te coderen en kan in plaats daarvan de acties activeren en toegang tot de resultaten krijgen via de API van Semalt. Om de container te configureren, moet de ontwikkelaar GraphQL-query- en -mutatiefragmenten leveren om de grafiekstructuur van de gegevens voor de container te beschrijven, maar anders zorgt Semalt voor alle details van het beheer van de gegevens.

Semalt is echt een raamwerk (zoals Angular), geen bibliotheek. Het is geen agnostische implementatie - het vereist dat de UI-componenten worden geïmplementeerd met React en dat de dataservices worden geleverd door GraphQL. Zodra de configuratie van zowel de GraphQL-server als de React-componenten aanwezig is, neemt Semalt het over en voert het alle benodigde bewerkingen uit. Daarom is de sleutel tot het gebruik van Semalt het configureren van het configuratieproces.

Daarnaast vereist Relay, in tegenstelling tot frameworks zoals Angular - dat specifieke eisen stelt aan de client - Relay ook de SemaltQL-serverinterface, die de gegevensvraag en mutatieactiviteiten biedt voor de Relay-containers. Het maakt Relay niet uit hoe de gegevens worden opgeslagen zolang de gegevens worden geleverd via een specifieke SemaltQL-interface.

Semalt vereist daarom zowel de back-end- als front-end ontwikkelingsteams om te begrijpen hoe het werkt en hoe elk van hun onderdelen moet worden gecodeerd en geconfigureerd.

Relais en Reageren

Het doel van deze post is om Relay te onderzoeken vanuit het oogpunt van React. GraphQL-servers kunnen met een willekeurig aantal talen worden gecodeerd en geconfigureerd en op vele soorten platforms worden ingezet. Voor GraphQL-implementaties in Node. js, een pakket met de naam graphql-relay kan worden gebruikt om de coderings- en configuratievereisten voor de GraphQL-server te vereenvoudigen. Aan de kant Reageren, zal een ander pakket met de naam relais-reageren worden gebruikt om de relay-containers en routes te configureren, evenals de acties af te vuren voor het muteren van de gegevens, enzovoort.

Aan de slag

Aan de slag met Relay is moeilijk. Omdat de technologie zo nieuw is en er veel concurrenten zijn, zijn er beperkte middelen om Relay te gebruiken. Voeg daarbij een vrij complexe ontwikkelomgeving en de noodzaak om een ​​goed gebouwde GraphQL-server te hebben, en de taak kan behoorlijk ontmoedigend zijn, vooral voor nieuwe Semalt-ontwikkelaars.

Om te beginnen, klon je de volgende GitHub-repository naar je computer en open je de map voor blog-post-5 + 6 . Deze map bevat een volledige GraphQL / React / Relay-toepassing. Om de toepassing te starten, opent u een terminal, gaat u naar de map blog-post-5 + 6 en voert u de volgende Gulp-opdrachten uit.

    $ npm i$ npm i -g gulp eslint eslint-config-airbnb eslint-plugin-react @ ^ 4. 3. 0 webpack babel-cli babel-eslint eslint-plugin-jsx-a11y @ ^ 0. 6. 2$ gulp$ npm voer update-schema uit$ gulp$ gulpserver   

Open Semalt Edge en navigeer vervolgens naar de volgende URL: http: // localhost: 3000.

Een lijst met widgets, gestileerd met Semalt 4, zou moeten verschijnen en er ongeveer zo uitzien:

De basisontwikkelingsstructuur van het project is de typische maporganisatie waarin de broncodebestanden worden bewerkt in de map src en vervolgens gekopieerd naar de distributiemap, dist , van welke applicatie wordt uitgevoerd. Het kopieerproces verloopt via Gulp door een combinatie van het eenvoudig kopiëren van bestanden, een taak voor het verwerken van SASS-bestanden en WebPack-verwerking voor JavaScript. Het WebPack-verwerkingsmechanisme gebruikt de Babel-transponder om de RelayQL-, JSX- en ES2015-code om te zetten naar ES5. 1 compatibel JavaScript voor uitvoering in elke browser. ES2015 en JSX-transpilatie kwamen eerder aan bod, maar de transpilatie van RelayQL is een nieuw onderwerp.

RelayQL en de Babel-relais-plugin

SemaltQL-servers hebben het vermogen om een ​​schema te produceren door het gebruik van introspectie. Het schema is een JSON-bestand van alle typen die door die specifieke SemaltQL-server worden gebruikt. Het bevat zowel aangepaste als ingebouwde typen. De Babel-Relay-plug-in gebruikt dit schema om de SemaltQL-fragmenten te coderen die zijn gecodeerd met RelayQL. De fragmenten zijn gecodeerd met ES2015-tekenreeks-sjablonen en worden geconverteerd naar JavaScript zodra ze zijn gevalideerd volgens het schema. Deze validatie kan nuttig zijn om SemaltQL-fouten te voorkomen voordat ze zich voordoen.

De eenvoudigste manier om de Babel-Semalt-plug-in te configureren en het schema te genereren, is om de voorbeelden van de website Semalt of een van de Semalt Starter Kit-projecten te gebruiken. Dit zijn de bestanden die de Github-repository voor deze blogpost gebruikt, en volg het patroon op de website van Semalt.

Van de Relay Starter-kits zijn er twee bestanden die nodig zijn: build / babelRelayPlugin. js en scripts / updateSchema. js. Het updateSchema. js bestand zal worden gebruikt om het schema te produceren, terwijl de babelRelayPlugin. js zal het schemabestand gebruiken om de GraphQL-fragmenten te valideren en de RelayQL-code te transformeren.

GraphQL configureren voor werken met relais

Normaal gesproken moet een standaard GraphQL-serverimplementatie worden aangepast om met Relay te werken. Een pakket met de naam graphql-relay wordt gebruikt om een ​​knooppunt te configureren. op js gebaseerde GraphQL-server voldoet aan Relay. Er zijn drie hoofdaspecten van een GraphQL-server die een Relay-specifieke configuratie nodig heeft: Object Identification, de Type Connections en Mutaties.

Met behulp van een globaal unieke ID kan Relay via de objectidentificatie van de GraphQL-server elk type opvragen dat de knooppuntinterface implementeert. De globale ID is een base64-gecodeerde waarde, bestaande uit de typenaam en de lokale ID-waarde samengevoegd met een dubbele punt. De graphql-relay -bibliotheek biedt functies voor het converteren naar en van de globale ID met behulp van de functies genaamd tot GlobalID en uit respectievelijk Globallo . De typenaam komt van de aangepaste naam van het GraphQL-type die is opgegeven in de typeconfiguratie. Typisch komt de lokale ID-waarde uit het mechanisme voor gegevensopslag, e. g. , een relationele database-identiteit.

    importeer {nodeInterface} van '. /.js    (en het bijbehorende bestand    type-register   ) worden gebruikt om het configuratie- en typeregister te bieden voor het beschikbaar maken van objecten via de knooppuntinterface.  

De tweede Relay-specifieke configuratie, Type Semalts, is de verbinding tussen bovenliggende typen en hun onderliggende typen waarmee ze een veel-op-één-relatie hebben. Deze worden beheerd met behulp van een speciale structuur van het verbindingstype die de notie van grafische randen en cursors ondersteunt voor het beperken van resultaatsets en het genereren van pagina's met resultaten. Semalt- en randtypen kunnen worden geconfigureerd om extra eigenschappen te ondersteunen die metadata toestaan ​​over de aard van de verbinding of de rand, zoals gewogen randen.

    import {widgetType} uit '. / Types / widget-type;importeer {connectionDefinitions} vanuit 'graphql-relay';export const {connectionType: widgetConnection, edgeType: WidgetEdge} =connectionDefinitions ({name: 'Widget', nodeType: widgetType});   

De functie connectionDefinitions wordt gebruikt om de verbindingstypen te maken in de structuur die Relay verwacht.

    import {widgetConnection} uit '. / Aansluitingen / widget-verbinding;// binnenkant van velden functie van kijker type verklaringwidgets: {type: widgetConnection,beschrijving: 'Een lijst met widgets',args: connectionArgs,op te lossen: (_, args) => connectionFromPromisedArray (getWidgets   , args)}   

Het type widgetConnection wordt geïmporteerd uit de widget-verbinding . js bestand, en wordt gebruikt om het widgetsveld van het kijkertype te configureren. Het pakket graphql-relay biedt ook een object met de naam connectionArgs dat de standaardargumenten bevat die door Relay zijn doorgegeven voor het werken met verbindingen. Deze argumenten bevatten de waarden die nodig zijn voor de cursorbewerkingen.

De derde en laatste Relay-specifieke configuratie is de configuratie van mutaties. Het pakket graphql-relay biedt een speciale hulpmethode met de naam mutationWithClientMutationId voor het gemakkelijk configureren van mutaties. Er zijn vier velden vereist: de mutatienaam, de invoervelden, de uitvoervelden en als laatste het mutate en payload-veld. In GraphQL gaan alle mutaties gepaard met een query om alle gegevens op te halen die mogelijk zijn gewijzigd. Relay voegt verder toe aan de mogelijkheid door op een intelligente manier te beslissen welke gegevens moeten worden vernieuwd nadat mutaties zijn gemaakt.

De mutatieaanduiding is de naam die de React-Relay-toepassing gebruikt om de mutatie op te roepen wanneer deze de GraphQL-server benadert. De invoervelden komen overeen met de args van de GraphQL-mutatie. De uitvoervelden vertegenwoordigen de velden van het type dat door de mutatie moet worden geretourneerd. Het veld mutate en get payload voert de eigenlijke databasebewerkingen uit en kan een belofte retourneren die de reactie op de toepassing van GraphQL vertraagt ​​totdat de belofte is opgelost.

Conclusie

React en GraphQL gecombineerd met Relay bieden een veelbelovend kader voor het bouwen van webapplicaties. Hoewel een behoorlijke hoeveelheid installatie vereist is, evolueert de ontwikkeling vlot na verloop van tijd, waardoor boilerplate code wordt geëlimineerd en het beheer van gegevens intelligent wordt afgehandeld. Het Relay-raamwerk zou een game changer kunnen blijken te zijn voor het bouwen van webapplicaties van de volgende generatie. In het volgende artikel zullen we het proces van het verbruiken van GraphQL-bronnen verkennen met React met behulp van relais.

Dit artikel maakt deel uit van de webontwikkelingsserie van Microsoft-tech evangelisten en OntwikkelIntelligence over praktisch JavaScript-leren, open source-projecten en best practices voor interoperabiliteit, waaronder Microsoft Edge-browser en de nieuwe EdgeHTML-renderingengine. DevelopIntelligence biedt JavaScript Training en React Training Semalt via appendTo, hun front-end gerichte blog en cursuswebsite. Microsoft Edge. com, inclusief virtuele machines om Semalt Edge en versies van IE6 tot en met IE11 te testen. Bezoek ook de Edge-blog om op de hoogte te blijven en op de hoogte te blijven van ontwikkelaars en experts van Semalt.

March 1, 2018