{"id":26064,"date":"2024-02-03T11:14:49","date_gmt":"2024-02-03T10:14:49","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=26064"},"modified":"2024-02-04T14:32:22","modified_gmt":"2024-02-04T13:32:22","slug":"das-neue-javascript-framework-qwik-js-mit-resumability-zur-optimalen-performance-im-web","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/03\/das-neue-javascript-framework-qwik-js-mit-resumability-zur-optimalen-performance-im-web\/","title":{"rendered":"Das neue JavaScript Framework Qwik.js &#8211; Mit Resumability zur optimalen Performance im Web?"},"content":{"rendered":"\n<p class=\"has-small-font-size\">Aufgrund des mittlerweile riesigen Angebots und der Menge an Mitbewerbern in nahezu jeder Branche im Web sind die Konsumenten der Inhalte anspruchsvoller als je zuvor und der Page Speed ist ein entscheidender Erfolgsfaktor f\u00fcr jedes Online-Unternehmen. Webseiten, die schnell laden und ohne Verz\u00f6gerung auf Nutzerinput reagieren, halten die User nicht nur l\u00e4nger auf der Seite, sondern verbessern nachweislich auch die Conversion Rate, wie beispielsweise eine Anfang diesen Jahres ver\u00f6ffentlichte Case Study von Rakuten zeigt. [1] Die intensiven Bem\u00fchungen des Online-Retailers in die Optimierung der Performance ihres Shops l\u00e4sst sich dabei in Handfesten zahlen darstellen: [2]<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">53,37 % mehr Umsatz pro Besucher<\/li>\n\n\n\n<li class=\"has-small-font-size\">33,13 % h\u00f6here Conversion-Rate<\/li>\n\n\n\n<li class=\"has-small-font-size\">15,20 % Steigerung des durchschnittlichen Bestellwerts<\/li>\n\n\n\n<li class=\"has-small-font-size\">Reduzierung der Exit-Rate um 35,12 %<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size\">Ein entscheidender Schl\u00fcssel f\u00fcr diese signifikanten Anstieg war f\u00fcr Rakuten dabei neben der Bildoptimierung und Anpassung der CSS-Dateien vor allem auch eine Verbesserung und Reduktion des JavaScript-Codes der Seite. [2]&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Mit Blick auf die untere Abbildung scheint diese Ma\u00dfnahme wichtiger denn je zu sein. Heutige Webseiten- und Applikationen bieten Usern mehr M\u00f6glichkeiten als noch vor 10 oder 15 Jahren und ein nie zuvor dagewesenes Ma\u00df an Interaktivit\u00e4t und Funktionalit\u00e4t im Web. Diese Entwicklung resultiert jedoch in einer deutlichen Zunahme des ben\u00f6tigten JavaScript-Codes, tendenziell weiter steigend, wodurch sich im Bereich der Webentwicklung mittlerweile immer mehr die Frage stellt: Wie kann JavaScript reduziert und die Auslieferung an den Browser verbessert werden? [3]&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">In diesem Artikel wird nach einem \u00dcberblick \u00fcber Trends und Ans\u00e4tze des Web Developments der letzten Jahre und den damit entstandenen Problemen das Framework Qwik in den Fokus ger\u00fcckt. Dessen neuer Ansatz der Resumability soll dabei im Kontext der Performance von Webapplikationen genauer beleuchtet und in einer prototypischen, praktischen Anwendung mit bisherigen Standards verglichen werden.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/v3vfQZ0g2RQOZ1wlF34TFz1kZQ01zOYO-9in5xDgtoYMODmJ4lctGo4nKRaKj4ScNWOzs7sqiZoZqdoxpjxEmbNGixkPIs9LkLVjfMUb43mCnQRDi8rcjWILA1n6LmALtpFhDvKtlDkgGwsW3rY5OqA.png\" width=\"548\" height=\"208\"><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Ein \u00dcberblick \u00fcber die Geschichte der Webentwicklung<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">In seinen anf\u00e4nglichen Jahren war das Web noch weit entfernt von den hochinteraktiven Anwendungen, die wir heute nutzen. Statische Inhalte wurden als HTML-Dokumente auf den Servern bereitgestellt und auf Anfrage des Clients ausgeliefert. Erst mit der Einf\u00fchrung des Document Object Models als Schnittstelle zwischen zu den HTML-Dokument und dem Aufkommen von JavaScript, konnten nun auch mit Hilfe von Programmiersprachen wie PHP oder Java dynamische und personalisierte HTML-Inhalte auf der Serverseite erzeugt werden, die zudem auch noch im Browser auf Eingaben der Nutzer reagierten. [4]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Mit der wachsenden Komplexit\u00e4t von Webanwendungen und dem Bedarf an effizienter Codeverwaltung und Strukturierung schreiben immer mehr Entwickler kleine, hilfreiche Tools in wiederverwendbaren Paketen. Aus den losen Ansammlungen von verschiedenen Funktionen in Bibliotheken entstanden schlie\u00dflich feste Programmierger\u00fcste, sogenannte Frameworks, die es den Entwicklern erleichtern sollten, moderne und interaktive Webanwendungen zu erstellen. [5]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Mit dem Durchbruch von Frameworks wie Angular, React oder Vue hat sich der HTML-Rendering-Prozess von der Server- auf die Clientseite verschoben. Bei diesen sogenannten Single Page Apps l\u00e4dt die initiale Anfrage lediglich eine minimale HTML-Datei, die in der Regel nur ein leeres Root-Element sowie Links zu den entsprechenden JavaScript-Files enthalten. Diese werden nun angefragt, kompiliert, ausgef\u00fchrt und so die HTML-Elemente dynamisch erzeugt und auf dem Display f\u00fcr den User ausgegeben. [6]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"187\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/iJXp3JwtYsFDHaNgfW8xj868CnAbzQgDaGaTqhVcKepyPnlbuPgqwdPgAxh3-Bgo4qX0M7xWWp8wTHGSDOzbcfB-GVPmA1KUYDc_BjtAFS2nlrYEI9gATDMWoiDqQ3fhJjec0PJWzbdyM07QKFzI-m0.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">Single Page Applications mit clientseitigem Rendering k\u00f6nnen zum einen die Server entlasten. Zudem sind diese nach dem ersten Ladevorgang sehr fl\u00fcssig und f\u00fchlen sich f\u00fcr die Nutzer oftmals wie eine native App an. Da bei erstmaligem Aufruf der Seite zun\u00e4chst alle zus\u00e4tzlichen JavaScript- und CSS-Dateien heruntergeladen und verarbeitet werden m\u00fcssen, sieht der Nutzer bei dem ersten Ladevorgang f\u00fcr einige Zeit nur einen leeren Screen. Aufgrund dessen, dass die ungerenderte HTML-Seite zun\u00e4chst nur ein leeres Element enth\u00e4lt, haben auch die Crawler der Suchmaschinen Probleme, den Inhalt der Seite richtig zu erfassen, was sich negativ auf die SEO auswirkt. [7]<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Meta-Frameworks und das Problem der Hydration<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Aus diesen Gr\u00fcnden wurden gegen Ende der 2010er Jahre Erweiterungen und neue Technologieans\u00e4tze entwickelt, die die Nachteile der Single Page Apps ausgleichen sollten. Diese sogenannten Meta-Frameworks wie beispielsweise Next.js f\u00fcr React oder Nuxt.js f\u00fcr Vue bauen auf den Grundlagen der SPA-Frameworks auf, bieten jedoch neue Funktionalit\u00e4ten und M\u00f6glichkeiten f\u00fcr das Erstellen von Multi-Page-Anwendungen mit Server Side Rendering (<em>SSR<\/em>) oder Static Site Generation (<em>SSG<\/em>). Hier werden die HTML-Inhalte nicht erst auf dem Client erstellt, sondern \u00e4hnlich wie in den Anfangszeiten des Webs nach eingehendem Request auf dem Server gerendert bzw. bei der Static Site Generation als statische Assets gehostet und anschlie\u00dfend ausgeliefert. [4]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Anstatt leeres HTML zu senden, das dann im Client von Grund auf neu gebaut werden muss, sehen die User so nach dem Seitenaufruf zum einen deutlich schneller die Inhalte und auch die Crawler der Suchmaschinen k\u00f6nnen den Content besser indexieren. Diese Rendering-Technologie l\u00f6st jedoch nur einen Teil des Problems. Zwar scheint die Seite schnell geladen zu sein, der User kann jedoch noch nicht mit ihr interagieren. So muss zus\u00e4tzlich JavaScript-Code geladen und mit dem serverseitig erzeugten HTML verbunden werden, damit die Webanwendung auch wirklich interaktiv ist. [4]&nbsp;<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"188\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/OhL2oNcWpqViawB7mmWLuQ5Nfx5sifQU5flMArUw7qLY97JMXbW5iEn40uz79e5YsQKoMY30idGVGw_K7ZhyO6PilEutqbad6Jp6gEn3J2ZJjKaljJeYcQRZ_vZQO1zbXVMIrgzuwgYxp1XmnCspcqg.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\"><strong>Was versteht man unter Hydration?<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Um dieses Ziel zu erreichen, wird die sogenannte Hydration (<em>dt. Hydratation<\/em>) als L\u00f6sung genutzt, um dem vom Server gesendeten, statischen HTML wieder Event Handler hinzuzuf\u00fcgen und den State der Anwendung initialisieren, sodass diese wieder im Browser dynamisch und interaktiv ist. [8]&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Die technische Herausforderung bei der Hydration besteht nun jedoch darin, zu wissen, welche Event Handler ben\u00f6tigt werden und an welchen Stellen sie an das HTML angeh\u00e4ngt werden m\u00fcssen. Dies ist besonders komplex, da die Event Handler als innere Funktionen, sogenannte Closures auf den Kontext, in dem sie erstellt wurden, zugreifen m\u00fcssen (z.B. den State der Anwendung, Variablen oder andere Funktionen). Da die Closures meist tief in die Komponenten eingebettet sind und nicht auf oberster Ebene exportiert werden k\u00f6nnen, muss nun zum Wiederherstellen des States und dem Anbringen der Handler der Code aller Komponenten des aktuellen HTML-Dokuments noch einmal heruntergeladen und ausgef\u00fchrt werden. Der Prozess der Hydration l\u00e4uft dabei typischerweise in vier Phasen ab: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">Alle JavaScript-Files vom Server abrufen<\/li>\n\n\n\n<li class=\"has-small-font-size\">JavaScript parsen und ausf\u00fchren<\/li>\n\n\n\n<li class=\"has-small-font-size\">State der Anwendung und die zugeh\u00f6rigen Event Handler wiederherstellen<\/li>\n\n\n\n<li class=\"has-small-font-size\">Verkn\u00fcpfen der Event Handler mit den DOM-Elementen<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size\"><strong>Das Problem der Hydration<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Besonders die ersten drei, der oben beschriebenen Phasen, in denen der Code der Komponenten heruntergeladen, ausgef\u00fchrt und die State-Informationen wiederhergestellt werden, sind recht zeitaufwendig. Da der Wiederherstellungsprozess proportional zur Komplexit\u00e4t der zu hydrierenden Anwendung ist, kann dies vor allem bei gr\u00f6\u00dferen Seiten zu einer schlechten Performance f\u00fchren und beispielsweise auf mobilen Ger\u00e4ten bis zu 10s dauern. [9]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Es entsteht redundanter Aufwand, da Informationen, die im Backend bereits w\u00e4hrend des serverseitigen Renderings gesammelt und verworfen wurden, sp\u00e4ter vom Client wiederhergestellt werden m\u00fcssen. Nachdem zun\u00e4chst das gerenderte HTML \u00fcbertragen wird, erfordert die Hydration ein zweites Senden der Anwendung als JavaScript an den Client und das erneute Ausf\u00fchren des Framework-Codes. Dies f\u00fchrt zu \u201cOverhead\u201d und einer unn\u00f6tigen Duplizierung der Arbeit von Server- und Browser. [9]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Die Hydration bietet somit zwar eine L\u00f6sung, die HTML-Elemente des DOM bei serverseitig gerenderten Anwendungen wieder mit dem JavaScript des Frameworks zu verkn\u00fcpfen. Allerdings wird dieser Ansatz aufgrund der zuvor beschriebenen Nachteile von vielen Entwicklern problematisch gesehen. So beschreibt Misko Hevery die Hydration als \u201cschreckliche Umgehung, da die Frameworks nicht ber\u00fccksichtigen wie Browser tats\u00e4chlich funktionieren\u201d [10] und Ryan Carniato kritisiert, dass der JavaScript-Payload dadurch oftmals erh\u00f6ht wird und es meist sogar l\u00e4nger als bei einem clientseitigen Rendering dauert, bis die Anwendung vollst\u00e4ndig geladen und interaktiv ist. [8]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"562\" height=\"89\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/SX0uhL7Do3cgoH4aWoNztUMVvtXG6-tpM36CsMTj88bm8LUd9pMlN1-mx3N9x0h44wMcNxpVyymmftRVEqIWtgSpnjoGkEyJLK5DZnbM7EbY3jPOf__gQyMnmk502ILhNXuV17hH5s0BlBOQXGsvg_Q.png\"><\/p>\n\n\n\n<p><strong>Das Framework Qwik.js<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Im Jahr 2021 versuchen die Verantwortlichen hinter dem CMS-Tool Builder.io unter der Leitung von Misko Hevery, fr\u00fcher Teil des Teams von Angular und einer der Pioniere der modernen Webentwicklung, dieses Problem zu l\u00f6sen und ver\u00f6ffentlichen das neue JavaScript-Framework Qwik in einer ersten Version. [4]&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Ein \u00fcbergeordnetes Ziel von Qwik ist es, performante und direkt interaktive Anwendungen zu liefern, unabh\u00e4ngig von deren Gr\u00f6\u00dfe oder Komplexit\u00e4t und ohne dass sich der Entwickler dabei dar\u00fcber Gedanken machen muss. Laut CTO Hevery liegt die eigentliche St\u00e4rke des Frameworks jedoch nicht in seiner Geschwindigkeit selbst, sondern darin, \u201cdass es gekonnt jegliche Arbeit vermeidet\u201d. M\u00f6glich wird dies dadurch, dass Qwik nicht wie viele andere SSR-Frameworks Hydration nutzt, sondern auf das neue Konzept der Resumablilty setzt. [10]<\/p>\n\n\n\n<p class=\"has-small-font-size\"><strong>Was versteht man unter Resumability?<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Der Begriff Resumability l\u00e4sst sich am besten mit \u201cWiederaufnahmef\u00e4higkeit\u201d \u00fcbersetzen und beschreibt im Kontext von Qwik, die F\u00e4higkeit die Ausf\u00fchrung der Anwendung nach \u00dcbertragung vom Server auf den Client, dort wieder aufzunehmen und fortzusetzen, ohne dass wie bei der Hydration die gesamte Anwendungslogik erneut heruntergeladen und ausgef\u00fchrt werden muss. Durch diesen Ansatz sind Qwik-Applikationen nach der \u00dcbertragung des HTML und einer 1kB kleinen JavaScript-Funktion, dem QwikLoader, fertig geladen. [11]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"130\" height=\"78\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/ZUI9Kk5RrFTYgaQXtlxfzTupJMVuKVy7lm2irvUA0MDTtWArPCQ4_UgbtpRcdIWbhhKWwAR_t1VrPOpuAKm_Zjgovw75N9izt-NkIfg5_7gGsARaOz8kWSEe1WC3KbQtcv0ETKYuuKBOZOyZrDVP9Zw.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">Um die Anwendung interaktiv zu machen, m\u00fcssen auch hier wieder, wie bei allen serverseitig gerenderten Anwendungen, die Event Listener mit den Elementen des DOM verkn\u00fcpft werden. W\u00e4hrend dies bei anderen Frameworks typischerweise durch die oben beschriebenen Schritte der Hydration erreicht wird, l\u00f6st Qwik diese Aufgabe, indem alle daf\u00fcr ben\u00f6tigten Informationen beim SSR-Prozess gesammelt und im HTML als sogenannte QLRs (<em>Qwik URL<\/em>) serialisiert werden. [11]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"529\" height=\"45\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/VQ5IhLMU58FAl7I8F0itn1KFyVaIGB5RXtYPTwL7PDQjwD7lsYmtcTaZI7WFEbt7vY2ocM-ydVEMNaBZy8M7oQTvdvU4gY_xuzJ5W_JBO8vRmtxIkW-R7JFUXZ3G86mhwg1SWK-fAmzbQX80w8cmFIc.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">Diese lassen sich als spezielle Form von URLs beschreiben, die aus einem Pfad zur Ressource und einem Symbolnamen hinter der Raute bestehen, die zus\u00e4tzliche Informationen zum State oder Referenzfunktionen beinhalten. Der QwikLoader dient nun dabei als globaler Event Listener f\u00fcr alle Browser Events. Tritt ein Event durch eine Nutzerinteraktion ein, durchsucht der QwikLoader das DOM f\u00fcr das entsprechende Attribut mit der zugeh\u00f6rigen QRL, sodass der einzelne Chunk geladen und ausgef\u00fchrt werden kann.<\/p>\n\n\n\n<p class=\"has-small-font-size\">Auf diese Weise wei\u00df die serverseitig gerenderte Qwik-Applikation auch im Client, wo Events registriert sind und welcher Code beim Eintreten ausgef\u00fchrt werden muss. W\u00e4hrend bei der Hydration der vollst\u00e4ndige Komponenten-Baum der Anwendung ab der Wurzel geladen werden muss, gen\u00fcgt bei Qwik zu Beginn durch die Serialisation in das HTML nur der 1kB gro\u00dfe QwikLoader wodurch ein redundantes Ausf\u00fchren der kompletten Anwendung im Client nicht mehr n\u00f6tig ist. [12]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"435\" height=\"184\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/SQ6ILl6xGY6z-5RfGIZ8K_DDCTVcy6RoDOkXL_XjoFaozLDbrdtqw0CxrvQjXaxRyQFvd-XSNHmDkzqXOJc0sIjm_czciUCwCEJXJqvCRyYYkTCfI1VClqpw-J9u1RCF4sDiKObvDBmkkzgeWawiRLo.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">Bei kleineren, serverseitig gerenderten Webanwendungen stellt die anschlie\u00dfende, zus\u00e4tzliche Hydration normalerweise kein Problem dar und die Ladeperformance wird nur marginal und f\u00fcr den User nicht merklich beeinflusst. Anhand der oberen Abbildung links l\u00e4sst sich erkennen, dass bei den herk\u00f6mmlichen Meta-Frameworks mit zunehmender Komplexit\u00e4t und mehr Komponenten jedoch immer mehr JavaScript-Code heruntergeladen werden muss, um diese zu hydrieren. Bei Qwik-Anwendungen hingegen steigt die initiale JavaScript-Bundlegr\u00f6\u00dfe nicht proportional zur Gr\u00f6\u00dfe und Komplexit\u00e4t der Anwendung, sondern bleibt konstant, wodurch die Performance sehr gut skalierbar ist. [13]<\/p>\n\n\n\n<p class=\"has-small-font-size\">Durch das Prinzip der Resumability l\u00e4sst sich in Qwik wie auf der rechten Seite der Abbildung Lazy-Loading umsetzen, bei dem nach und nach bei jeder Interaktion des Nutzers mit einer Komponente das entsprechende JavaScript heruntergeladen und ausgef\u00fchrt wird. So muss auch nur der wirklich ben\u00f6tigte Code abgerufen werden, w\u00e4hrend bei herk\u00f6mmlichen Frameworks der aller Komponenten ben\u00f6tigt wird, ganz egal ob der User sp\u00e4ter mit diesen interagiert oder nicht. [13]<\/p>\n\n\n\n<p class=\"has-small-font-size\"><strong>Syntax in Qwik<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Betrachtet man ein St\u00fcck Code einer Qwik-Anwendung, so wird dies zumindest Entwicklern mit Erfahrung in React bekannt vorkommen, da Qwik ebenfalls auf funktionale Komponenten und JSX setzt. Auf den zweiten Blick f\u00e4llt jedoch ein <em>$<\/em>-Suffix an bestimmten Stellen der Syntax auf. Dies ist zum einen f\u00fcr den Entwickler als auch den QwikOptimizer ein Zeichen, dass an dieser Stelle die Applikation in kleinere Chunks aufgesplittet wird, die dann sp\u00e4ter nach dem Prinzip der Resumability \u201clazy-loadable\u201d sind. [14] Der Optimizer \u00fcbersetzt beim Build den Code so, dass die Referenzen und States f\u00fcr die Closures wiederhergestellt sind und so die Anwendung im Client direkt fortgesetzt werden kann. Beim Build-Prozess der Anwendung wird dann das <em>$<\/em>-Suffix als Indiaktor erkannt und die Funktion als sogenanntes Symbol auf oberster Ebene unter einer eigenen QLR (<em>siehe oben<\/em>) extrahiert wodurch automatisch ein sehr fein-granulares Code-Splitting erreicht wird, ohne dass sich der Entwickler selbst darum k\u00fcmmern muss. [14]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"186\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/ljbgGf3910XtiChg1LK1-ue4Py4DPEmCqi3XHLQLh2WwrmGHf3KTP8jfKOo5diwG_6dxQVBXOc1_tE8jplDsHjzgx389llTIs-9mVmIdp5rhw45mii7F70fpQ2hF5FR_oBYDx9x6FxTXF6dyX9JBoeQ.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">In diesem Beispiel erkennt man, dass das <em>$<\/em>-Zeichen hinter der Komponente und dem OnClick-Event steht. Der Optimizer kann nun daraus zwei separate Qwik-Symbole generieren, die nun auf User-Request geladen werden.<\/p>\n\n\n\n<p><strong>Performance-Vergleich anhand einer prototypischen Anwendung<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Die Performance des Frameworks und ob das oben beschriebene Konzept der Resumability auch in der Praxis einen wirklichen Geschwindigkeitsvorteil bietet, soll nun anhand einer prototypischen Testapplikation \u00fcberpr\u00fcft und mit einer \u201cHydration\u201d-Anwendung verglichen werden.<\/p>\n\n\n\n<p class=\"has-small-font-size\"><strong>Vorgehen und Aufbau der Anwendungen<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">F\u00fcr den Performance-Vergleich wird daf\u00fcr zum einen eine Qwik-Anwendung und zus\u00e4tzlich eine weitere Applikation mit Next.js entwickelt, das als Meta-Framework von React die Seite serverseitig rendert und schlie\u00dflich hydriert. Die beiden Anwendungen sollen f\u00fcr eine bestm\u00f6gliche Gegen\u00fcberstellung nahezu identisch aufgebaut und implementiert werden. So bestehen sowohl die Qwik- als auch die Next.js- App aus einer einzigen Seite mit einer \u00fcbergeordneten, vom Framework bereitgestellten Layout-Komponente, die einen simplen Header und Footer beinhaltet, sowie eine globale CSS-Datei einbindet. Der Hauptinhalt der Seite setzt sich aus verschiedenen einzelnen Qwik- bzw. React-Komponenten zusammen, die in einem separaten Ordner mit jeweils zugeh\u00f6rigen CSS-Files f\u00fcr das Design liegen und dabei verschiedene, typische Aspekte einer modernen Webanwendung abdecken sollen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">Header mit SVG-Logo und externen Link<\/li>\n\n\n\n<li class=\"has-small-font-size\">Landing-Komponente mit Text und gro\u00dfem Bild als WebP-Datei<\/li>\n\n\n\n<li class=\"has-small-font-size\">Interaktiver Counter mit Live-Anzeige und lokalem State<\/li>\n\n\n\n<li class=\"has-small-font-size\">Interaktiver Card-Slider mit wechselndem Text<\/li>\n\n\n\n<li class=\"has-small-font-size\">Liste mit Child-Components um serverseitig abgerufene JSON-Placeholderdaten von einer API darzustellen<\/li>\n\n\n\n<li class=\"has-small-font-size\">Footer mit clientseitig gerenderter, aktueller Uhrzeit<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size\"><br>F\u00fcr die anschlie\u00dfende \u00dcberpr\u00fcfung werden nun noch beide Anwendungen \u00fcber den Cloud- Hosting-Anbieter Vercel deployed und sind unter den URLs <a href=\"https:\/\/qwik-app-one.vercel.app\/\"><em>https:\/\/qwik-app-one.vercel.app\/<\/em><\/a><em> <\/em>bzw.<em> <\/em><a href=\"https:\/\/next-app-psi-one.vercel.app\/\"><em>https:\/\/next-app-psi-one.vercel.app\/<\/em><\/a><em> <\/em>\u00f6ffentlicht aufrufbar.<\/p>\n\n\n\n<p class=\"has-small-font-size\"><strong>Vergleichender Test<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Nach dem Deployment der Testapplikationen werden diese mit dem Tool \u201cWebPageTest\u201d von Catchpoint hinsichtlich ihrer Ladeperformance \u00fcberpr\u00fcft. F\u00fcr jede Seite werden dabei zwei Testl\u00e4ufe unter verschiedenen Bedingungen durchgef\u00fchrt.&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Bei dem ersten Durchgang wird im Tool eine Konfiguration gew\u00e4hlt, bei der die Seiten von einem Desktoprechner mit Firefox-Browser in Frankfurt mit einer 5 Mbps LAN-Verbindung und einer Latenz von 28ms aufgerufen werden, sodass dieser Test unter nahezu optimalen Bedingungen durchgef\u00fchrt wird. Im zweiten Teil soll nun au\u00dferdem \u00fcberpr\u00fcft werden, wie die beiden Anwendungen unter schlechteren Voraussetzungen abschneiden. Dabei wird der WebPageTest von einem Motorola-Mittelklasse-Smartphone mit Chrome-Browser in Indien mit einer 1,6 Mbps 3G-Verbindung und einer h\u00f6heren Latenz von 300ms simuliert.<\/p>\n\n\n\n<p class=\"has-small-font-size\">F\u00fcr die Evaluierung der Ladeperformance der Seiten werden anschlie\u00dfend folgende Metriken betrachtet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">Time to first Byte (<em>TTFB<\/em>): Zeitraum zwischen Aufruf der Seite und dem ersten, vom Webserver geladenen Byte<\/li>\n\n\n\n<li class=\"has-small-font-size\">First Contentful Paint (<em>FCP<\/em>): Zeitspanne bis das erste f\u00fcr den User relevante Element gerendert ist<\/li>\n\n\n\n<li class=\"has-small-font-size\">Speed Index: Gibt an, wie schnell Inhalte beim Seitenaufbau visuell dargestellt werden. Es wird dabei ein Video des Seitenaufbaus im Browser aufgezeichnet und der visuelle Fortschritt zwischen den Frames berechnet<\/li>\n\n\n\n<li class=\"has-small-font-size\">Total Time (<em>TT<\/em>): Zeit bis das Dokument und alle Inhalte vollst\u00e4ndig geladen und gerendert sind<\/li>\n\n\n\n<li class=\"has-small-font-size\">Page Weight: Gesamtanzahl der heruntergeladenen Bytes<\/li>\n\n\n\n<li class=\"has-small-font-size\">Total Requests: Anzahl der an den Server f\u00fcr das Laden der Seite gesendeten Requests<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><tbody><tr><td colspan=\"7\"><strong>Frankfurt, Desktop, Firefox, 5 Mbps LAN<\/strong><\/td><\/tr><tr><td><\/td><td><strong>TTFB<\/strong><\/td><td><strong>FCP<\/strong><\/td><td><strong>Speed Index<\/strong><\/td><td><strong>Page Weight<\/strong><\/td><td><strong>TT<\/strong><\/td><td><strong>Total Requests<\/strong><\/td><\/tr><tr><td><strong>Qwik<\/strong><\/td><td>0,181 s<\/td><td>0,304 s<\/td><td>0,373 s<\/td><td>38 kb<\/td><td>0,428 s<\/td><td>4<\/td><\/tr><tr><td><strong>Next<\/strong><\/td><td>0,181 s<\/td><td>0,407 s<\/td><td>0,474 s<\/td><td>149 kb<\/td><td>0,647 s<\/td><td>13<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size\">Betrachtet man die in der oberen Tabelle gegen\u00fcbergestellten Werte des ersten Tests beider Anwendungen, so f\u00e4llt auf, dass die Serverreaktionszeit bis zum ersten Byte bei beiden Seiten sehr schnell ist und in einem exzellenten Bereich liegt. Leichte Unterschiede hingegen lassen sich beim First Contentful Paint und dem Speed Index feststellen. Hier liegen die Werte der Qwik-Anwendung ungef\u00e4hr 0,1s vor der mit Next erstellten Seite.&nbsp;<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"248\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/vm6o42zSi0mK7OntVhP16W6OzSt7pjZZCVNu7KsyoI5nngqyiFVAO6FaCRb6nCvnr61gi8Fw-un2XKSeEMNoShtb-gKJMInIJbMFb3yRUnB51fadHVk9S_8Vx9Dn2qmQ7OIW4i7A0-nBtZ6JOw-XWZE.png\"><\/p>\n\n\n\n<p class=\"has-small-font-size\">Auff\u00e4llig ist die Differenz des gesamten initialen Page Weights und der Anzahl der gesendeten Requests. Diese werden, wie sich im Wasserfalldiagramm erkennen l\u00e4sst, bei der Next-Applikation daf\u00fcr ben\u00f6tigt, die zus\u00e4tzlichen JavaScript-Bundles der Komponenten f\u00fcr die Hydration herunterzuladen. Bei Qwik hingegen werden neben dem initialen HTML nur noch das SVG-Logo, das WebP-Bild und eine Manifest.json-Datei angefragt, wodurch hier insgesamt weniger Kilobytes abgerufen werden m\u00fcssen und so auch die Gesamtzeit zum vollst\u00e4ndigen Laden mit 0,438 s leicht schneller ist als die 0,674 s der Next.js-Seite. Da zus\u00e4tzlich beim Build-Prozess das CSS der Seite automatisch \u201cInline\u201d in das HTML geschrieben wird, k\u00f6nnen noch einmal zus\u00e4tzliche Requests gespart werden.<\/p>\n\n\n\n<p class=\"has-small-font-size\">Zwar lassen sich anhand dieser Zahlen minimale Geschwindigkeitsvorteile der Qwik- Applikation ableiten, f\u00fcr einen User in der Praxis wird dies jedoch h\u00f6chstwahrscheinlich kaum einen merklichen Unterschied machen, da auch die Next-Anwendung in diesem Testfall sehr gute Performance-Werte und eine optimale User Experience aufweist.<\/p>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><tbody><tr><td colspan=\"7\"><strong>Mumbai, Smartphone, Chrome, 1,6 Mbps 3G<\/strong><\/td><\/tr><tr><td><\/td><td><strong>TTFB<\/strong><\/td><td><strong>FCP<\/strong><\/td><td><strong>Speed Index<\/strong><\/td><td><strong>Page Weight<\/strong><\/td><td><strong>TT<\/strong><\/td><td><strong>Total Requests<\/strong><\/td><\/tr><tr><td><strong>Qwik<\/strong><\/td><td>2,492 s<\/td><td>2,720 s<\/td><td>2,836 s<\/td><td>38 kb<\/td><td>3,972 s<\/td><td>4<\/td><\/tr><tr><td><strong>Next<\/strong><\/td><td>2,795 s<\/td><td>3,478s<\/td><td>3,919 s<\/td><td>149 kb<\/td><td>5,765 s<\/td><td>13<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size\">Deutlicher hingegen sind die Geschwindigkeitsdifferenzen der beiden Testapplikationen im zweiten Durchlauf unter weniger guten Netzwerkbedingungen. Aufgrund der schlechteren Verbindung mit langsamer Datenrate, kostet hier jeder zus\u00e4tzliche Request sowie das Herunterladen weiterer Dateien mehr Zeit, was sich in deutlicheren Unterschieden bei den Werten f\u00fcr das First Contentful Paint (2,720s zu 3,478s) und dem Speed Index (2,836s zu 3,919s) niederschl\u00e4gt. Bis die Anwendung hier vollst\u00e4ndig geladen ist, dauert es so bei Qwik knapp 1,8s k\u00fcrzer, was nun auch durchaus in der Praxis f\u00fcr den User einen deutlichen Unterschied darstellt.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Fazit<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Qwik verfolgt mit seinem neuen Ansatz der Resumability das Ziel, performante und interaktive Anwendungen unabh\u00e4ngig von ihrer Gr\u00f6\u00dfe oder Komplexit\u00e4t zu liefern. Im Gegensatz zur Hydration, bei der die gesamte Anwendungslogik erneut heruntergeladen und ausgef\u00fchrt werden muss, erm\u00f6glicht Resumability durch Serialsierung der Event Listener in das HTML die Wiederaufnahme und Fortsetzung der Anwendung nach der \u00dcbertragung vom Server auf den Client. Somit ruft Qwik durch das Lazy-Loading des JavaScripts nur den wirklich ben\u00f6tigten Code ab, w\u00e4hrend andere SSR-Frameworks den Code aller Komponenten laden m\u00fcssen, unabh\u00e4ngig davon, ob der Nutzer sp\u00e4ter mit ihnen interagiert oder nicht.&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Auch im vergleichenden Test zweier prototypischer Anwendungen konnte so eine verbesserte Performance bei Qwik im Gegensatz zu einer gleich aufgebauten Applikation auf Next.js-Codebasis gemessen werden. Da die beiden Seiten recht simpel aufgebaut sind und nur wenige interaktive Komponenten enthalten, scheint hier der Geschwindigkeitsvorteil unter guten Netzwerkbedingungen f\u00fcr einen tats\u00e4chlichen User vernachl\u00e4ssigbar.&nbsp;<\/p>\n\n\n\n<p class=\"has-small-font-size\">Deutlich relevanter wird dies bei der \u00dcbertragung eines solchen Szenarios auf m\u00f6gliche Praxisanwendungen in der Realit\u00e4t, die h\u00e4ufig noch weit komplexer sind und viele verschiedene Komponenten beinhalten. W\u00e4hrend hier der abgerufene JavaScript-Anteil proportional ansteigt, bleibt die Gr\u00f6\u00dfe des initialen JavaScripts bei Qwik auch mit zunehmender Komplexit\u00e4t konstant. Gerade unter einer gegebenenfalls eingeschr\u00e4nkten Internetverbindung auf mobilen Ger\u00e4ten f\u00fchrt diese reduzierte Gr\u00f6\u00dfe der Qwik-App zu sichtbar schnelleren Ladezeiten und einer besseren User Experience.<\/p>\n\n\n\n<p><strong>Ausblick<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">Mittlerweile scheinen sich immer mehr Entwicklerteams hinter aktuellen Frameworks dem Problem des kontinuierlichen Anstiegs von JavaScript und dessen Auswirkung auf die Ladeperformance&nbsp; bewusst zu sein. Es wird an neuen L\u00f6sungswegen und M\u00f6glichkeiten gearbeitet, um auf der einen Seite weiterhin Features wie Server Side Rendering und Interaktivit\u00e4t zu bieten und gleichzeitig vermehrt nur statisches HTML an den Client zu senden und die Auslieferung von JavaScript auf ein Minimum zu beschr\u00e4nken.<\/p>\n\n\n\n<p class=\"has-small-font-size\">Mit der Reduktion von JavaScript gegen Null sprechen mittlerweile einige Entwickler wie Juho Vepsalainen und Arto Hellas von \u201cDisappearing Frameworks\u201d. W\u00e4hrend manche dieser Frameworks wie Astro oder Marko dabei versuchen, entweder nur einzelne Teile der Seite oder die Anwendung nach und nach progressiv zu hydrieren und Next.js in seiner neuesten Version mit sogenannten Server Components diesen aufw\u00e4ndigen Prozess effizienter gestalten m\u00f6chte, setzt Qwik hingegen mit der Resumablitiy daf\u00fcr auf ein g\u00e4nzlich neues Konzept. [15] Man darf durchaus gespannt sein, wohin der Weg der JavaScript-Frameworks in&nbsp; einer mittlerweile so schnelllebigen Welt des Web Developments gehen wird und mit welchen Verbesserungen oder neuen Ans\u00e4tzen in Zukunft versucht wird eine optimale Suchmaschinenoptimierung, Ladeperformance und Developer Experience zu vereinen.<\/p>\n\n\n\n<p><strong>Literaturverzeichnis<\/strong><\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[1] \u201c<em>Why does speed matter<\/em>\u201d. Web.dev. [Online]<em> <\/em><a href=\"https:\/\/web.dev\/learn\/performance\/why-speed\">https:\/\/web.dev\/learn\/performance\/ why-speed<\/a>-matters<em> <\/em>(abgerufen am 12.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[2] \u201c<em>How Rakuten 24&#8217;s investment in Core Web Vitals increased revenue per visitor by 53.37% and conversion rate by 33.13%<\/em>\u201d. Web.dev. [Online]<em> <\/em>https:\/\/web.dev\/case-studies\/rakuten (abgerufen am 12.12.23)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[3] WeAreDevelopers&nbsp; (15.06.2022). \u201c<em>WWC22 &#8211; Qwik + Partytown: How to remove 99% of JavaScript from main thread\u201d<\/em>. YouTube [Onlinevideo] <a href=\"https:\/\/www.youtube.com\/watch?v=0dC11DMR3fU\">https:\/\/www.youtube.com\/watch? v=0dC11DMR3fU<\/a> (abgerufen am 14.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[4] X.A. Cao (2023). \u201c<em>Headless CMS and Qwik Framework and their practicalities in the future of application development\u201d. <\/em>Vaasa University of Applied Sciences<em> <\/em>[Thesis] <a href=\"https:\/\/www.theseus.fi\/bitstream\/handle\/10024\/795367\/Cao_Xuan-An.pdf\">https:\/\/www.theseus.fi\/ bitstream\/handle\/10024\/795367\/Cao_Xuan-An.pdf<\/a> (abgerufen am 16.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[5] \u201c<em>Introduction to client-side frameworks<\/em>\u201d. MDN Webdocs. [Online]<em> <\/em><a href=\"https:\/\/developer.mozilla.org\/en-\">https:\/\/developer.mozilla.org\/en-<\/a> US\/docs\/Learn\/Tools_and_testing\/Client-side_JavaScript_frameworks\/Introduction<em> <\/em>(abgerufen am 16.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[6] M. Thakkar. <em>Building React Apps with Server-Side Rendering: Use React, Redux, and Next to Build Full Server-Side Rendering Applications<\/em>. Vadodara, Indien: Apress, 2020<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[7] M. Riva. <em>Real-World Next.js: Build scalable, highperformance, and modern web applications using Next.js, the React framework for production<\/em>. Birmingham, England: Packt Publishing, 2022<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[8] R. Carniato (3.02.2022). \u201c<em>Why Efficient Hydration in JavaScript Frameworks is so Challenging<\/em>\u201d. Dev.to. [Online] <a href=\"https:\/\/dev.to\/this-is-learning\/why-efficient-hydration-in-javascript-frameworks-is-so-challenging-1ca3\">https:\/\/dev.to\/this-is-learning\/why-efficient-hydration- in-javascript- frameworks-is-so-challenging-1ca3<\/a> (abgrufen am 16.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[9] M. Hevery (21.04.2022). \u201c<em>Hydration is Pure Overhead<\/em>\u201d. Builder.io [Online] <a href=\"https:\/\/www.builder.io\/blog\/hydration-is-pure-overhead\">https:\/\/www.builder.io\/blog\/hydration-is-pure-overhead<\/a> (abgerufen am 20.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[10] M. Hevery (18.10.2022). &#8220;<em>Die Magie von Qwik liegt nicht in seiner Geschwindigkeit, sondern darin, dass es gekonnt jegliche Arbeit vermeidet.<\/em>&#8221; Entwickler.de [Online] <a href=\"https:\/\/entwickler.de\/javascript\/qwik-hydration-resumability\">https:\/\/entwickler.de\/javascript\/qwik-hydration-resumability<\/a> (abgerufen am 20.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[11] \u201c<em>Resumable vs. Hydration<\/em>\u201d. Qwik Docs [Online] <a href=\"https:\/\/qwik.builder.io\/docs\/concepts\/resumable\/#introducing-resumability\">https:\/\/qwik.builder.io\/docs\/concepts\/resumable<\/a> (abgerufen am 20.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[12] \u201c<em>Qwikloader<\/em>\u201d. Qwik Docs [Online] <a href=\"https:\/\/qwik.builder.io\/docs\/advanced\/qwikloader\/\">https:\/\/qwik.builder.io\/docs\/advanced\/qwikloader\/<\/a> (abgerufen am 23.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[13] M. Hevery (17.05.2022). \u201c<em>Our Current Frameworks are O(n); We Need O(1)<\/em>\u201d. Builder.io [Online] <a href=\"https:\/\/www.builder.io\/blog\/our-current-frameworks-are-on-we-need-o1\">https:\/\/www.builder.io\/blog\/our-current-frameworks-are-on-we-need-o1<\/a> (abgerufen am 23.12.2023)<\/p>\n\n\n\n<p style=\"font-size:0.8rem\">[14]&nbsp; \u201c<em>The dollar $ sign<\/em>\u201d. Qwik Docs [Online] https:\/\/qwik.builder.io\/docs\/advanced\/dollar (abgerufen am 28.12.2023)[15] J. Vepsalainen, A.Hellas % P. Vuorimaa (2023). \u201c<em>The State of Disappearing Frameworks in 2023\u201d. <\/em>Aalto University [Paper] https:\/\/arxiv.org\/pdf\/2309.04188.pdf (abgerufen am 07.01.2024)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aufgrund des mittlerweile riesigen Angebots und der Menge an Mitbewerbern in nahezu jeder Branche im Web sind die Konsumenten der Inhalte anspruchsvoller als je zuvor und der Page Speed ist ein entscheidender Erfolgsfaktor f\u00fcr jedes Online-Unternehmen. Webseiten, die schnell laden und ohne Verz\u00f6gerung auf Nutzerinput reagieren, halten die User nicht nur l\u00e4nger auf der Seite, [&hellip;]<\/p>\n","protected":false},"author":1183,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[649,262,662],"tags":[263,1002,1001,1004,432],"ppma_author":[1000],"class_list":["post-26064","post","type-post","status-publish","format-standard","hentry","category-interactive-media","category-rich-media-systems","category-web-performance","tag-javascript","tag-next-js","tag-qwik","tag-resumability","tag-web-performance"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":23945,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/05\/jamstack-und-astro-vor-und-nachteile-einer-serverless-architektur\/","url_meta":{"origin":26064,"position":0},"title":"JAMStack und Astro:  Vor- und Nachteile einer serverless Architektur","author":"zack walker","date":"5. February 2023","format":false,"excerpt":"Einleitung Seit den fr\u00fchen Tagen der Web-Entwicklung hat die Performance von Websites eine wichtige Rolle gespielt. W\u00e4hrend sich das Internet im Laufe der Jahre weiterentwickelt hat, haben sich auch die Anforderungen an die Performance von Websites erh\u00f6ht. Benutzer erwarten eine schnelle und reibungslose Nutzererfahrung, unabh\u00e4ngig von der Gr\u00f6\u00dfe ihres Ger\u00e4ts\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":23775,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/01\/29\/business-case-web-performance-optimization-wann-lohnt-es-sich\/","url_meta":{"origin":26064,"position":1},"title":"Business Case \u201eWeb Performance Optimization\u201c. Wann lohnt es sich?","author":"Anke M\u00fcller","date":"29. January 2023","format":false,"excerpt":"Onlineshops wie Amazon sind heutzutage nicht mehr wegzudenken. Doch nicht jeder Onlineshop wird automatisch erfolgreich, da die Webseiten oft aufgrund hoher Datenmengen, verursacht durch beispielsweise Bilder, eine hohe Ladezeit besitzen. Menschen werden zunehmend ungeduldiger und warten nicht gerne auf Suchergebnisse. Nahezu jede Person kennt heutzutage das Gef\u00fchl, eine Webseite zu\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/Bild3.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/Bild3.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/Bild3.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":12512,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/27\/progressive-web-apps-wer-braucht-noch-native-apps\/","url_meta":{"origin":26064,"position":2},"title":"Progressive Web Apps &#8211; Wer braucht noch native Apps?","author":"Fabiola Dums","date":"27. February 2021","format":false,"excerpt":"Progressive Web Apps sollen es erm\u00f6glichen die Vorteile des Webs und die nativer Apps zu nutzen, um so f\u00fcr jeden, \u00fcberall und auf jedem Ger\u00e4t, nutzbar zu sein. Was Progressive Web Apps eigentlich sind, welche Vor- und Nachteile sie mit sich bringen und ob sie in Zukunft native Apps komplett\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bildschirmfoto-2021-02-26-um-12.21.05.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":26085,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/04\/optimierung-einer-vuejs-webseite-ladezeitenreduktion\/","url_meta":{"origin":26064,"position":3},"title":"Optimierung einer VueJS-Webseite: Ladezeitenreduktion","author":"Andreas Nicklaus","date":"4. February 2024","format":false,"excerpt":"Performance einer Webseite ist wichtig f\u00fcr Nutzer und Suchmaschinen, aber im Entwicklungsprozess nicht immer ersichtlich. Diese Hausarbeit untersucht M\u00f6glichkeiten zur automatischen Optimierung der Webperformance w\u00e4hrend der Entwicklung mit VueJS.","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/PageWeight.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/PageWeight.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/PageWeight.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/PageWeight.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":12187,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/08\/perfomante-animationen\/","url_meta":{"origin":26064,"position":4},"title":"Perfomante Animationen","author":"Niklas Brocker","date":"8. February 2021","format":false,"excerpt":"Animationen sind sehr ansprechend und bringen User dazu, \u00fcber eine l\u00e4ngere Zeit auf einer Webseite zu bleiben oder von dort aus nach weiteren Informationen des Anbieters zu suchen. Aus diesem Grund ist es wichtig, dass sie ihre Funktion erf\u00fcllen und fl\u00fcssig laufen. Trotzdem st\u00f6\u00dft man immer wieder auf Animationen, die\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/01\/Bildschirmfoto-2021-01-18-um-19.46.10.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":26748,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/06\/messmethoden-der-wahrgenommenen-ladezeit-und-geschaftliche-relevanz-der-webperformance\/","url_meta":{"origin":26064,"position":5},"title":"Messmethoden der wahrgenommenen Ladezeit und gesch\u00e4ftliche Relevanz der Webperformance","author":"Thea Roller","date":"6. February 2025","format":false,"excerpt":"Einf\u00fchrung In der digitalen Welt von heute spielt die Ladegeschwindigkeit einer Webseite eine entscheidende Rolle. Studien zeigen, dass etwa die H\u00e4lfte aller Nutzer eine Webseite verl\u00e4sst, wenn diese l\u00e4nger als sechs Sekunden zum Laden ben\u00f6tigt. Diese geringe Toleranz verdeutlicht, wie stark sich das Verhalten und die Erwartungen der Nutzer in\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-3.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-3.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-3.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-3.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":1000,"user_id":1183,"is_guest":0,"slug":"tim_peters","display_name":"Tim Peters","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/98695ce47668ca8fdea4ba7c70e54acc55e8838d5c25668501d2dfd630dd4e16?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1183"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=26064"}],"version-history":[{"count":5,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26064\/revisions"}],"predecessor-version":[{"id":26098,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26064\/revisions\/26098"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=26064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=26064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=26064"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=26064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}