PWA is de toekomst. Wij onderzochten de vereisten voor het ontwikkelen van een Progressive Web App voor Magento, de huidige stand van zaken rondom de Magento GraphQL API en de meest geschikte technologieën die hier het beste voor ingezet kunnen worden.
[Update] 10-07-2022: Lees meer informatie over onze dienstverlening Adobe (Magento) Commerce PWA ontwikkeling en de voordelen van PWA.
"De website die je nu bezoekt is geen website maar een App". Altijd leuk om te vertellen als we met klanten in gesprek zijn. Het is waar: reachdigital.nl is een PWA. Gebouwd met GraphQL als API - één van de eersten van Nederland. Geen website, maar een app die in je browser draait.
Het verschil tussen een normale website en een Progressive Web Application is dat een normale website op een server wordt gerenderd. Er wordt data verzameld, bewerkt, gedefinieerd en opgemaakt - en het geheel komt als html naar de client. In het geval van een Progressive Web App wordt (de naam zegt het al) alleen een dunne schil - de app shell - door de browser gedownload. Alle data wordt progressief (naarmate de gebruiker de app gebruikt) ingeladen.
Voorbeelden van casestudies met PWA technologie kun je vinden op de pagina Adobe (Magento) Commerce PWA
Heb je ooit de Wehkamp, Zalando of Zara app geïnstalleerd? Waarschijnlijk niet. De drempel om een native app te installeren is erg hoog. Zeker voor die van een webshop waar je slechts een paar keer iets koopt. Terwijl de snelheid en stabiliteit van een app superieur is ten opzichte van een voor mobiel geoptimaliseerde responsive website.
Met P.W.A. overbruggen we het gat tussen supersnelle native (geïnstalleerde) app en de gebruikerservaring die we nu kunnen bieden met een mobiel geoptimaliseerde webshop. Het allerbelangrijkste argument daarbij is performance. De snelheid van het laden van pagina's en het doen van acties. Beter performance is betere gebruikerservaring en is betere scalability. PWA's (Progressive web apps) bieden:
De term PWA -Progressive web app- is geïntroduceerd door Google. De term PWA staat voor het voldoen aan een set performance regels en doelstellingen voor het web.
Hoé je dat doet, moet je zelf weten. In de praktijk is het echter 'zeer onmogelijk' om met traditionele technieken (serverside gerenderde pagina's) aan deze regels te voldoen. Zeker niet op schaal. En zeker niet voor e-commerce, waarbij veel informatie gebruikerspecifiek is (cachingoplossingen geen uitkomst bieden).
Om te kunnen definiëren wat een PWA is (waaraan een PWA moet voldoen), heeft google het RAIL model geïntroduceerd:
Zoals je ziet: het hele model draait uiteindelijk om de snelheid voor de gebruiker. Google publiceert de volgende resultaten in het gedrag van gebruikers:
Snelheid | Gedrag gebruiker |
0 tot 16ms | Voor animatie - Gebruikers zijn uitzonderlijk goed in het volgen van beweging. Niet vloeiende animaties zijn storend. Ze zien animaties als vloeiend bij 60 frames per seconde (fps). Dat is 16ms per frame, inclusief de tijd die de browser nodig heeft voor een repaint, waardoor een app ongeveer 10 ms overblijft om een frame te produceren. |
0 tot 100ms | Zorg voor reactie binnen dit tijdvenster en gebruikers hebben het gevoel dat het resultaat onmiddellijk is. Duurt het langer dan 100ms, dan is het verband tussen actie en reactie verbroken. |
100 tot 300ms | Gebruikers ervaren een lichte merkbare vertraging. |
300 tot 1000ms | Binnen dit venster ervaren gebruikers een natuurlijke en continue voortgang van taken. Voor de meeste gebruikers op internet vertegenwoordigt dit tijdsvenster het laden van pagina's of het uitvoeren van een taak. Zo voelt het internet |
1000ms of meer | Na 1000 milliseconden (1 seconde), verliezen gebruikers hun focus op de taak die ze uitvoeren. |
10000ms of meer | Na 10000 milliseconden (10 seconden) zijn gebruikers gefrustreerd en zullen ze waarschijnlijk hun taken staken. Ze kunnen later wel of niet terugkomen. |
Er gebeurt 'iets' binnen 50ms (1/200 van een seconde) wanneer de gebruiker een actie doet. De doelstelling is om de gebruiker de focus van snelheid optimalisatie inspanningen te laten zijn.
Vloeiende animatie is het einddoel
Maximaliseer idle-time (de tijd waarin de bezoeker de applicatie kan gebruiken zonder dat er zaken hoeven te gebeuren) om de kans te vergroten dat de pagina binnen 50ms reageert op invoer van de gebruiker.
Met andere woorden: laad overige data van een pagina in terwijl de bezoeker de applicatie gebruikt. Of laad data voor overige pagina's of acties alvast in terwijl de bezoeker de applicatie gebruikt
Gebruik idle-tijd om 'overige' data in te laden. Laad bijvoorbeeld zo min mogelijk gegevens in bij de eerste request (de app shell), zodat de gebruiker een resultaat heeft. Laad vervolgens de overige data in als de eerste request klaar is (de applicatie is idle).
Zorg dat 'dingen worden gedaan' (bijvoorbeeld overige data inladen) in 50ms. Anders onstaat het risico dat de app niet binnen 50ms reageert op gebruikersinvoer.
Als een gebruiker tijdens het idle zijn van de applicatie een actie uitvoert, moet de interactie van de gebruiker altijd de hoogste prioriteit hebben. Idle-tijd-activiteit moet worden onderbroken.
De animatie loopt nog, maar de applicatie is idle. Achter de schermen wordt alvast de vanmoof portfolio afbeelding gedownload die op een andere pagina nodig is.
Toon content en word interactief in minder dan 5 seconden
Wanneer pagina's langzaam worden geladen, dwaalt de aandacht van gebruikers af en ervaren gebruikers de taak als onderbroken. Sites die snel worden geladen, hebben langere gemiddelde sessies, lagere bouncepercentages en een hogere zichtbaarheid van advertenties.
Lighthouse performance meting op 3G. Iedere meting vertegenwoordigt een andere fase van de gebruiker's waarneming van het laden van de website.
Richtlijnen
Om uiteindelijk een e-commerce PWA te kunnen realiseren (Magento webshop PWA), moeten we nog een aantal flinke stappen maken.
Er moet een nieuwe frontend komen, op basis van een frontend framework dat 'voldoet' aan de PWA eisen. Het meest populair op dit moment zijn:
Een nieuwe frontend betekent; Frontend development op basis van componenten
Er moet een datalayer beschikbaar zijn, waarmee het mogelijk wordt om frontend volledig van backend te scheiden. Zo krijgen we een headless Magento installatie. Op dit moment beschikt Magento 2 over een REST (web)API die alle functionaliteit biedt die intern in het systeem beschikbaar is. Echter, mist REST een aantal fundamentele zaken die PWA development op schaal mogelijk maken. In de laatste dev versie van Magento (2.3-develop branche) zien we sporen van de nieuwe GraphQL API waaraan gewerkt wordt.
Magento GraphQL API coming soon, zo te zien
Met PWA webapplications als doelstelling en door de opkomst van frontend frameworks als React en Vue, heeft er een flinke shift plaatsgevonden in de manier waarop frontend development werkt.
We bouwen niet langer pagina's, maar componenten; stukjes functionaliteit specifiek voor 1 doel, waarin technisch opmaak, gedrag en datacommunicatie zijn verwerkt.
Een goed voorbeeld van een standaard component in de browser is een option select.
<select> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="vw">VW</option> <option value="audi" selected>Audi</option> </select>
Hoe de dropdown te gebruiken is en hoe hij eruit ziet is altijd hetzelfde. Onafhankelijk van hoe de rest van de website of applicatie in elkaar zit.
Eerder konden we al componenten bouwen met bijvoorbeeld React. React biedt virtualDOM, waarmee we elementen in de html konden zetten waar de rest van de stylesheet niet bij kan. Echter, een React component is alleen te gebruiken binnen een React applicatie.
Daarom bouwen wij Webcomponents. Een voor alle browsers (vrij nieuwe) specificatie, waarmee het mogelijk wordt om zelf native componenten te bouwen.
Het contactformulier op deze website bijvoorbeeld. Die kunnen we op een willekeurige plaats op deze website zetten met de volgende code.
<contact-form> <span slot="title">Een Magento PWA bouwen met GraphQL?</span> </contact-form>
Het bouwen in componenten is technisch iets nieuws voor frontend development. Echter, het hele concept vereist een bepaalde shift in werkwijze en denkwijze bij het bouwen van nieuwe websites of PWA's.
GraphQL is ontwikkeld door Facebook en voorziet in alle zaken die we van een API willen voor het bouwen van een razendsnelle PWA:
Dit is niet de GraphQL Magento implementatie van Magento. Dit is onze eigen GraphQL implementatie voor Magento 2. [Update] 10-07-2022: Screenshots zijn geupdate naar screenshots van de huidig beschikbare GraphQL API in Magento.
We bouwden halverwege 2017 een volledig automatisch gegenereerd GraphQL Scheme voor Magento. Anders dan Magento zelf doet (handmatig per class het schema bouwen), gebruiken we de php service layer om een schema te bouwen met alle bestaande en beschikbare php classes.
De Reach Digital PWA is gebouwd met:
Webcomponents Webcomponents zijn een browserstandaard. Een webcomponent werkt altijd in iedere browser. En kan in ieder frontend framework gebruikt worden (Reactie, Vue, Angular en in ons geval Polymer).
Polymer Framework voor het bouwen van Webcomponents.
Apollo client Library voor Webcomponents die een GraphQL query doen om data binnen te halen. Biedt ook mogelijkheden voor caching van queries en het queuen / bundelen van queries.
Google App Engine Platform As A Service. Een hosting platform, zonder dat je toegang hebt tot de server. Google App Engine draait Node.js en is oneindigend schaalbaar:
runtime: nodejs env: flex automatic_scaling: min_num_instances: 1 max_num_instances: 20
GraphQL De API
GraphCool Is een Database As A Service: het biedt de mogelijkheid om een GraphQL schema te definieren dat wordt omgezet naar een database. Die je vervolgens via GraphQL kunt benaderen. GraphCool slaat dus data op.
GraphCMS Een interface om de GraphQL database te beheren
TravisCI Continuous Integration tool gekoppeld aan zowel Github als Google App Engine. Een commit op de master branche rolt een nieuwe versie van de Reach Digital App uit op Google App Engine. Build de App.
Magento (het bedrijf) zet in op PWA's met de aankonding van de Magento PWA studio. Geen kant-en-klare 'nieuwe frontend' voor Magento, maar een toolset om een PWA te bouwen.
Ze hebben gekozen voor React als frontend framework en GraphQL als datalayer.
Mogelijk staat na het lezen van dit artikel een vraag over de rol van Google AMP in dit verhaal.
Kort samengevat: AMP is bedoeld om het bestaande internet sneller te maken. Om websites sneller aan Google gebruikers te serveren. Google stelt een 'template' beschikbaar, waarmee je een pagina op een specifieke manier aanbiedt. Google crawled deze data en serveert ze vanuit eigen cache. Zo heeft de bezoeker veel sneller toegang tot content.
AMP is de oplossing voor situaties waarin een PWA een te grote stap is.