Als moderne Digitalagentur versuchen wir stets, uns weiter fortzubilden und mit unserer Umwelt zu wachsen. Eine Technologie, die in den letzten Jahren rasant an Fahrt aufgenommen hat und inzwischen jedem ein Begriff sein dürfte, ist die Künstliche Intelligenz (KI / AI), bzw. um genau zu sein, Machine Learning. Unlängst ist diese Technologie in zahlreiche Branchen eingedrungen und macht Arbeitsabläufe einfacher, effizienter und kostengünstiger. Vor kurzem hatten wir die Möglichkeit, ein ML-Projekt für einen Kunden von Grund auf zu entwickeln und in der Praxis zu testen. Ein Erfahrungsbericht. Was ist Machine Learning überhaupt? Machine Learning ist eine Disziplin im breiteren Feld der "künstlichen Intelligenz". Bisher war es in der Softwareentwicklung so, dass ein Entwickler Regeln geschrieben hat, mit welcher ein Computer Eingaben verwerten und Ergebnisse ausgeben konnte. Im Vorfeld bekannt waren auf dem "klassischen Weg" daher stets die Eingaben und die Regeln. Die Ausgaben waren Unbekannte in der Gleichung. Machine Learning stellt dieses Konzept etwas auf den Kopf: Anstatt dem Computer Eingaben und Regeln zu geben, belassen wir die Regeln als Unbekannte und geben dem Computer somit nur noch die Eingaben - mitsamt dazugehörigen Ausgaben. Das hört sich vielleicht zunächst etwas komisch an, ist aber, zumindest oberflächlich, leicht erklärt. Wir füttern ein Machine Learning Modell mit tausenden von Eingabe-Ausgabe-Kombinationen (Trainingsdaten), woraufhin der Computer die Regeln, wie er von einer Eingabe auf eine dazugehörige Ausgabe kommt, selbst "erlernt". Dazu betrachtet er die Trainingsdaten in zahlreichen Durchläufen (auch "Epochen" genannt) und verändert dabei immer ein wenig die Gewichtung der Verbindungen zwischen den einzelnen Neuronen, die im KI-Modell definiert wurden. Damit funktioniert ein Machine Learning Modell ähnlich zum menschlichen Gehirn, nur sehr viel kleiner und weniger komplex. Ein KI-Modell kann daher nicht eigenständig denken oder gar empathisch werden. Statt dessen kann es nur innerhalb der vordefinierten Grenzen, also der gegebenen Trainingsdaten, lernen und handeln. Wenn im Training alles richtig läuft, kann ein optimales KI-Modell dann aus den gegebenen Trainingsdaten generalisieren , also die gelernten Regeln auf neue, noch nicht gesehene Eingaben, anwenden und zu schlüssigen Ergebnissen kommen. Damit das funktioniert, sind zahlreiche Komponenten essentiell, unter anderem die Qualität als auch Quantität der Trainingsdaten, die Aufbereitung dieser, die Anzahl der Epochen, die Hyperparameter (hierzu kommen wir später noch) und vieles mehr. Fußball ist reiner Zufall! Oder? Vor einiger Zeit kam ein Interessent mit einer klaren Aufgabenstellung zu uns in die Agentur: "Entwickelt eine Fußball-Formel!". Okay, zugegeben: Vielleicht nicht ganz so im Wortlaut, aber Ziel des Projektes war es, Gewinnwahrscheinlichkeiten im Fußball für eine internationale Sportplattform zu berechnen. Das Prinzip dürfte einigen bereits aus dem Bereich der Sportwetten bekannt vorkommen. Sportwettenanbieter (Buchmacher) berechnen für jedes Spiel, auf welches auf ihrer Plattform gewettet werden kann, Wahrscheinlichkeiten für unterschiedlichste Spielereignisse, beispielsweise den Gewinner des Spiels oder die Anzahl der Tore. Buchmacher setzen hierfür auf eine Vielzahl an Algorithmen. Das Prinzip des Machine Learnings hingegen ist noch recht neu. Die Frage, die der Kunde mit diesem Projekt erörtern und beantworten wollte, war daher: "Kann ein Machine Learning Modell den Buchmacher schlagen?". Nach agilem Verfeinern der Projektanforderungen sowie dem Sammeln von tausenden Datensätzen aus vergangenen Spielen unterschiedlichster Fußballligen, u.a. der Bundesliga, legten wir also mit der Umsetzung los. Das erste Test-Modell Um uns mit den Daten vertraut und erste Gehversuche zu machen, haben wir uns direkt an ein erstes Test-Modell gesetzt. Bevor es aber an die eigentliche Entwicklung des Machine Learning Modells gehen kann, ist es zunächst wichtig, die Trainingsdaten so aufzubereiten, dass ein neuronales Netzwerk mit diesen überhaupt arbeiten kann. Für das erste Modell haben wir die folgenden Datenpunkte als Eingabeparameter verwendet: Heim-Team-ID Auswärts-Team-ID Arena-ID Saison (Jahr) Spielrunde Wochentag Abendspiel Heim-Team Ligapunkte Auswärts-Team Ligapunkte Dies stellt unserer Ansicht nach eine solide Basis dar, um erste, sehr einfache Vorhersagen über den Spielausgang treffen zu können. Die IDs (Identifier) wie für die Teams und die Arena wurden "one-hot encoded". Würden wir diese nicht entsprechend enkodieren, könnte ein ML-Modell diese gegebenenfalls als einfache, numerische Werte betrachten und so falsche Schlussfolgerungen ziehen. Daher ist es wichtig, diese klar voneinander zu trennen, was in der Praxis oft durch eine One-Hot-Encoding geschieht, womit die Datenwerte in ein eindimensionales Array aus Nullen und Einsen überführt werden, in welchen jeweils genau ein Wert eine Eins ist, und alle anderen Werte eine Null. Andere Werte wie die Spielrunde oder die Ligapunkte haben wir hingegen als numerische Werte belassen. Auch haben wir für dieses Modell der Einfachheit halber alle Datensätze, in welchen einer oder mehrere dieser Datenpunkte gefehlt haben, entfernt. So ist garantiert, dass das ML-Modell mit möglichst "puren" und einfachen Daten lernt. Entwerfen des Modells Im nächsten Schritt ging es um die Konzeption des eigentlichen ML-Modells. Auch hier haben wir uns für den ersten Prototypen auf ein möglichst einfaches Modell beschränkt, um dieses im Nachhinein bestmöglich optimieren und feinjustieren zu können. Für die Entwicklung des Modells wurde das bekannte Framework Tensorflow von Google verwendet sowie das darauf aufbauende bzw. abstrahierende Framework Keras. Mit Keras ist es sehr einfach, simple Modelle mit "vorgefertigten" Netzwerkschichten zu entwerfen. Um nicht zu sehr ins Technische auszuschweifen, sei an dieser Stelle gesagt, dass wir nach einigen Versuchen bei einem Modell mit einem eingehenden Flatten-Layer (welcher die Kombination aus one-hot-encoded und numerischen Werten in ein simples, eindimensionales Array konvertiert), zwei unsichtbaren Dense-Layern mit dazugehörigen Dropouts sowie einem Ausgangs-Layer gelandet sind. Ergebnisse und Auswertung Zu unserem Glück begann mit Fertigstellung des ersten Prototypen gerade die neue Saison der Fußball-Bundesliga. Ein perfekter Moment, um die KI direkt live auszuprobieren. Nachdem jeder in der Agentur persönliche Wetten getroffen hat, durfte die KI an die Reihe. Zunächst war ein zugegebenermaßen eher einfaches Spiel an der Reihe: Eintracht Frankfurt gegen den FC Bayern München. Die KI prognostizierte einen Gewinn der Münchner zu 66%. Hätten die Münchner stattdessen den Heimvorteil gehabt, progonostizierte die KI eine Gewinnchance von über 75%. Schlüssig - und am Ende tatsächlich richtig. Die Bayern gewannen das Spiel 1:6. Interessant war, dass die prognostizierte Gewinnchance der Münchner mit voranschreitenden Spieltagen immer weiter stieg. Ein Zeichen dafür, dass der KI zu Beginn der Saison noch wichtige Daten fehlen, um wirklich überzeugende Vorhersagen zu treffen. Die grafische Auswertung anhand der Testdaten (also Datensätze, welche die KI im Trainingsprozess nicht gesehen hat, sondern welche nur für die Auswertung des Modells verwendet werden) war hingegen eher ernüchternd, wenn auch absolut den Erwartungen entsprechend: Zu erkennen ist hier, dass die Präzision der Vorhersagen der KI bei rund 50% konvergiert. Somit liegt die Präzision definitiv weit höher als die reine Zufallswahrscheinlichkeit von 33% bei drei möglichen Spielausgängen (Heimsieg, Unentschieden, Auswärtssieg). Mit 50% kann jedoch noch kein Krieg gegen die Wettquoten der Buchmacher gewonnen werden. Das zweite Modell "Jarvis" Also zurück an die Blaupausen. Basierend auf unseren Erfahrungen mit dem ersten Modell wurde dieses feinjustiert, auch wurden die verwendeten Datenpunkte angepasst und die Aufbereitung der Daten etwas modifiziert. Da es sich bei diesem Modell um das beim Kunden produktiv eingesetzte Modell handelt, können wir an dieser Stelle natürlich nicht allzuviele Details verraten. Jedoch haben wir die Datenpunkte beispielsweise um die Startaufstellungen sowie zahlreiche Details zu den jeweiligen Spielern ergänzt. Das Modell hat somit Gelegenheit, auch die einzelnen Aufstellungen zu betrachten und gegeneinander zu vergleichen. Das Alter der Datensätze wurde zusätzlich begrenzt, sodass keine Datensätze aus sehr alten Saisons, beispielsweise 2011, mehr ins Training einfließen. Abschließend haben wir die Hyperparameter des Modells feinjustiert. Die optimalen Hyperparameter, also beispielsweise der verwendete Optimizer, die Anzahl der versteckten Layer im Modell, oder auch die verwendete Loss-Funktion, sind Gegenstand zahlreicher Diskussionen in Entwickler-Communities und der Wissenschaft und für jedes Modell individuell. Eine beliebte und einfache Möglichkeit, diese zu optimieren, ist über einen automatischen Tuner wie "KerasTuner". Bei der Verwendung von KerasTuner wird das Modell mit immer verschiedenen Hyperparametern trainiert, welche wiederum über bestimmte Algorithmen stets angepasst werden. So werden die optimalen Rahmenbedingungen für die Funktionalität des Modells geschaffen. Nach erfolgreicher Erweiterung der verwendeten Datenpunkte sowie Feinjustierung der Hyperparameter konnte das Modell vollends überzeugen. Unser bestes Modell konnte eine Präzision (Accuracy) auf den Validierungsdaten von über 71% erreichen. Somit ist dieses Modell rund 42% besser als unser erstes Modell - ein voller Erfolg. Mit 71% wurde darüberhinaus etwas anderes geschafft: Die Gewinnwahrscheinlichkeit des Favoriten einiger, ausgewählter Buchmacher lag durchgehend bei knapp unter 71%. Somit konnte unser Modell bessere Werte als die von Buchmachern verwendeten Algorithmen erreichen. Natürlich mussten wir der künstlichen Intelligenz daraufhin auch einen Namen geben: Sie wurde liebevoll Jarvis getauft, angelehnt an die künstliche Intelligenz von Tony Stark in den "Iron Man" Filmen. Takeaways und Fazit An diesem praktischen Projekt kann gesehen werden, welche Erfolge bereits mit einfachen KI-Modellen in komplizierten Märkten erreicht werden können, und welche Dimensionen mittels der Optimierung der verwendeten Trainingsdaten und Hyperparameter erreicht werden können. Die Entwicklung von Machine Learning Modellen wird unser Agenturleben in den nächsten Jahren immer stärker begleiten - wir sind darauf vorbereitet.
Es ist längst kein Industriegeheimnis mehr, dass Google verschiedene Faktoren für das Ranking von Webseiten in ihrer Suche einsetzt und einer davon die Geschwindigkeit der jeweiligen Webseite ist. Doch was genau bedeutet es eigentlich, wenn man über die Geschwindigkeit einer Webseite, oder auch den "PageSpeed" dieser, spricht? In diesem Field Guide möchten wir Ihnen einen Einblick in die Web Vitals von Google geben, wie diese zum Ranking in der Suche beitragen und in welchem Maß und auch erste Tipps zur Optimierung der Web Vitals Ihrer Webseite mit auf den Weg geben. Was sind Core Web Vitals? Um die Core Web Vitals optimieren zu können, muss man erst einmal verstehen, worum es sich dabei eigentlich genau handelt. Zunächst: Oft werden "Web Vitals" und "Core Web Vitals" synonym verwendet, teilweise auch in Fachartikeln. Ganz korrekt ist dies jedoch nicht – bei den Core Web Vitals handelt es sich um eine Teilmenge der Web Vitals. Die Core Web Vitals bestehen aus nur drei Metriken der eigentlichen Web Vitals, welche laut Google für jede Webseite gemessen und optimiert werden sollten. Im weiteren Verlauf dieses Artikels werden wir uns daher selbstverständlich mit diesen Messwerten auseinandersetzen, jedoch auch mit anderen Daten der breiteren Web Vitals, die unserer Ansicht nach mindestens genauso wichtig sind. Aber zurück zum Ursprung: Bereits seit einiger Zeit stand Google in Verdacht, die Ladegeschwindigkeit einer Webseite als Rankingfaktor zu nehmen. Im Jahr 2021 hat Google dann ein Update für ihren Rankingalgorithmus heraus gebracht, in welchem erstmals ganz offiziell von solch einem Faktor die Rede war. Google wollte fortan die Seiten nach "Web Vitals" ranken. Eine Menge an vordefinierten Messwerten, welche die Geschwindigkeit und im engeren Sinn auch die Bedienbarkeit einer jeden Webseite messen, gewichten und auswerten können. Das Prinzip ist einfach zu verstehen: Google hat ein bestimmtes Bild davon, wie eine Webseite aufgebaut zu sein hat. Allerdings können sie den Inhalt und den Aufbau der Webseiten, die in der Suche angezeigt werden, nicht beeinflussen. Sehr wohl aber die Reihenfolge, in welcher sie angezeigt werden. Wenn Sie also planen, auf einen der Topränge in der Google-Suche für ein heißes Keyword zu kommen, werden Sie an der Optimierung Ihrer Web Vitals nicht vorbei kommen. In diesem Artikel werden wir uns hauptsächlich mit den nachfolgenden Web Vitals auseinander setzen: Largest Contentful Paint (LCP) . Diese Core-Metrik wertet aus, wie lang Ihre Webseite benötigt, um das größte Element im initialen Viewport dieser anzuzeigen. Das "größte Element" wird dabei mittels verschiedener Faktoren ermittelt. Google stellt jedoch Tools zur Verfügung, mit welchen sie einsehen können, was der Ansicht von Google nach das größte Element ist – und wo entsprechend Optimierungsbedarf besteht. Cumulative Layout Shift (CLS) . Diese Kennzahl ist ebenfalls in den Core Web Vitals enthalten und lässt sich leicht an einem Ihnen sicher schon einmal begegneten Beispiel erklären: Sie laden eine Webseite, auf der Sie vielleicht schon einmal waren. Sie wissen daher, dass es in der Mitte einen Button gibt, auf welchen Sie drücken müssen. Sie versuchen diesen noch während des Ladevorgangs zu betätigen – erwischen ihn jedoch einfach nicht, da sich das Layout der Webseite während des Ladevorgangs noch verschiebt. Für den Nutzer sehr ärgerlich, weshalb Google dies in die Berechnung des Performance-Scores mit einfließen lässt. First Contentful Paint (FCP) . Dieser Messwert ist zwar nicht in den Core Web Vitals enthalten (sondern nur in der Obermenge Web Vitals), ist unserer Ansicht nach jedoch einer der häufigsten Bruchstellen der Performance einer Webseite, weswegen wir uns dieser auch widmen müssen. Hier wird ausgewertet, wie lange es dauert, bis überhaupt irgendwas (soll heißen, etwas für den Nutzer sinnvolles) auf der Webseite angezeigt wird. Diese Metrik hängt natürgemäß stark vom Time To First Byte (TTFB) ab (ebenfalls nicht in den Core Web Vitals enthalten), welchem wir uns auch noch kurz widmen werden. First Input Delay (FID) . Diese Metrik ist wieder in den Core Web Vitals enthalten. Sie misst die Zeitspanne, die von der ersten Interaktion des Nutzers mit der Webseite (beispielsweise ein Klick auf einen Link) vergeht, bis es tatsächlich im Browser zu einer Reaktion auf diese Interaktion kommt. Der FID ist daher die Kernmetrik, die misst, wie responsiv die Webseite auf Nutzerinteraktionen ist. Es gibt innerhalb der Obermenge Web Vitals noch einige Messwerte mehr, welche jedoch einen kleineren Einfluss auf den Score haben, oder aber sehr selten zu Problemen führen, weshalb wir uns in diesem Artikel nur auf die oberen vier (bzw. fünf) Metriken beschränken werden. Ein paar Randbemerkungen Die obigen Messwerte und ihr Gewicht innerhalb der Berechnung des Performance-Scores sind nicht in Stein gemeißelt. Google aktualisiert ihre Algorithmen regelmäßig, und so auch die (Core) Web Vitals. Dadurch können sich auch die benötigten Optimierungen immer wieder ändern. Wenn Sie daher nicht gerade SEO hauptberuflich ausführen, kann es schwierig sein, aktuell zu bleiben. Eine Digitalagentur, welche sich mit Core Web Vitals tiefgreifend auseinandergesetzt hat, kann Ihre Webseite nachhaltig optimieren. Bei Kuatsu haben wir bereits viel Zeit in die Optimierung von Kundenprojekten als auch unserer eigenen Webseite (mehr dazu gleich!) investiert. Falls Sie also Ihre Zeit lieber in das Voranbringen Ihres Unternehmens stecken und das Optimieren der Core Web Vitals einem professionellen Anbieter überlassen möchten, sprechen Sie uns gerne an.. Darüber hinaus sollten Sie beachten, dass Google die Web Vitals immer doppelt berechnet: Einmal für Mobilgeräte und einmal für Desktops. Die Desktop-Scores liegen im Prinzip immer höher als die Mobile-Scores, da Google bei der Berechnung letzterer auch eine künstliche Drosselung der Netzwerkgeschwindigkeit auf langsames 4G- oder gar 3G-Niveau vornimmt. Dabei sind die Mobile Scores eigentlich wichtiger als die Desktop Scores: Weltweit kommen laut einer Datenerhebung von StatCounter bereits mehr als 57% aller Seitenaufrufe von Mobilgeräten – Tendenz steigend. Die Optimierung Ihrer Webseite sollte daher stets primär auf Mobilgeräte ausgerichtet sein. Auf einem grünen Desktop-Score sollten Sie sich daher nicht zwangsweise ausruhen. Was sind meine Web Vital Scores? Bevor es an die Optimierung geht, sollte man natürlich erstmal den Status quo analysieren um zu sehen, wo Optimierungen gerade am meisten benötigt werden. Dabei führen mehrere Wege nach Rom. Google PageSpeed Insights Der einfachste Weg, an den Performance-Score der eigenen Webseite zu kommen, führt über die Google PageSpeed Insights . Hier muss nur die URL zur zu prüfenden Seite eingegeben werden, und die Server von Google übernehmen die Messung. Hierbei gilt es jedoch zu beachten, dass bei der Messung über die PageSpeed Insights nicht nur die aktuelle Messung in einer kontrollierten Umgebung ("Lab Data") in den Score mit einfließt, sondern auch "Field Data". Google bezieht hier also die Erfahrungen von echten Nutzern mit ein, welche Ihre Webseite aufgerufen haben (beispielsweise über Google Chrome). Die Web Vitals lassen sich daher auch nicht austricksen, indem man bei einer kontrollierten Messung einfach sämtliche Bilder und Skripte entfernt. Google bezieht die Daten für die Scores auch von echten Sitzungen. Auch sollten Sie beachten, dass bei einer Messung über die PageSpeed Insights gegebenenfalls auch Ihr Serverstandort eine entscheidende Rolle spielt. Da die Messung über Googles Server erfolgt, kann es sein, dass erst eine sehr lange Verbindung zu Ihrem Server aufgebaut werden muss, was einige Scores natürlich katastrophal in den Keller ziehen kann. PageSpeed Insights misst von einem aus vier verschiedenen Standorten, basierend auf Ihrem aktuellen Standort: Nordwesten der USA (Oregon) Südwesten der USA (South Carolina) Europa (Niederlande) Asien (Taiwan) Die Abdeckung ist daher nicht schlecht, aber wenn Ihr Server beispielsweise in Australien steht, kann die Verbindung durchaus einige Zeit in Anspruch nehmen. Selbst aus den Niederlandern zu einem Rechenzentrum in Frankfurt vergeht bereits einige Zeit. Sie sehen also: Sie sollten sich nicht nur auf die PageSpeed Insights verlassen, da die Messung darüber nicht unbedingt die Erfahrungen echter Nutzer widerspiegelt. Lighthouse Lighthouse ist ein Open-Source Tool, welches direkt von Google bereitstellt wird, und neben den Web Vitals auch zahlreiche andere wichtige Metriken zu Ihrer Webseite erfasst, unter anderem die Barrierefreiheit oder On-Page SEO. Lighthouse läuft lokal auf Ihrem Rechner, simuliert jedoch eine kontrollierte Umgebung, in welcher die Messwerte genau genommen werden können. Das Beste daran: Oftmals müssen Sie dafür nicht einmal zusätzliche Software herunterladen, zumindest wenn Sie als Browser Google Chrome verwenden. Lighthouse ist direkt in den "Chrome Dev Tools" integriert, welche Sie per Rechtsklick, einem Klick auf "Untersuchen" im Kontextmenü und der anschließenden Auswahl von "Lighthouse" innerhalb der oberen Toolleiste aufrufen können. Als Beispiel einmal eine Mobile Performance-Messung unserer Webseite mittels Lighthouse über die Dev Tools: Andere Wege Es gibt noch einige andere Wege, die Web Vitals zu messen, unter anderem über die Google Search Console. Diese richten sich aber eher an erfahrene SEOs. Für Anfänger, die die Performance der eigenen Webseite einschätzen wollen, eignen sich am besten die oben genannten PageSpeed Insights und Lighthouse. Largest Contentful Paint (LCP): Bedeutung und Optimierung Der Largest Contentful Paint (LCP) misst, wie lange es dauert, bis das größte inhaltliche Element innerhalb des initialen Viewports (also der Bereich, den der Nutzer bei Seitenaufruf sieht) fertig dargestellt ist. Das können beispielsweise große Banner-Bilder sein, große Textblöcke, Videos, Buttons, aber auch eher unscheinbare Elemente. Das größte, inhaltliche Element auf unserer neuen Webseite ist laut Google beispielsweise das Logo im Navigationsbereich. Aber keine Sorge: Um das jeweilige Element zu finden, ist keine große Schnitzeljagd von Nöten. Sowohl PageSpeed Insights als auch Lighthouse zeigen Ihnen das Element mittels einem Klick auf "LCP" direkt an. Google hat, wie bei jeder Metrik in den Web Vitals, sehr genaue Vorstellungen davon, wie schnell das Laden dieses Elements vonstatten zu gehen hat. Ein guter LCP ist demnach eine Ladezeit von unter 2,5 Sekunden , während alles über 4 Sekunden sehr schlecht ist und damit starken Handlungsbedarf hat. Alles dazwischen ist zwar in Ordnung, aber immer noch verbesserungswürdig. Und hinsichtlich der Gewichtung von 25% dieses Messwerts im Performance-Score sehen wir persönlich generell für alle Werte über 2,5 Sekunden einen dringenden Optimierungsbedarf. Checkliste für die LCP-Optimierung Eine grundlegende Optimierung des LCP ist Gott sei Dank relativ einfach erledigt. Manchmal sind jedoch noch mehr tiefgreifende Optimierungen notwendig, um einen wirklich guten LCP-Wert zu erhalten. Die gängigsten Methoden zur Optimierung findest du aber hier in unserer Checkliste: Verwendung eines Content Delivery Network. Ist das betroffene Element ein Bild, Video oder eine ähnliche, eingebundene Ressource, ist die naheliegendste Option, die Ladezeit dieser Ressource selbst zu verringern. Eine einfache Möglichkeit, dies zu bewerkstelligen, ist die Bereitstellung dieser Ressource über ein Content Delivery Network (CDN). Ein CDN ist ausschließlich darauf optimiert, Ressourcen wie Bilder so schnell wie möglich für jeden Nutzer auf dem Globus bereitstellen zu können. Dafür werden verschiedene Load Balancing Techniken eingesetzt. Durch Verbindung all dieser Techniken ergibt sich eine viel schnellere Ladezeit, als wenn die Ressource lokal vom eigenen Server bereitgestellt wird. Auch wird dadurch gleichzeitig Last vom eigenen Server genommen, welche anderswo sicher benötigt wird. Eine beliebte CDN-Lösung, welche auch wir auf unserer Webseite einsetzen, ist Cloudinary . Ressourcen komprimieren und in einem modernen Format bereitstellen . Oft wirst du über diese Empfehlung auch in den PageSpeed Insights oder Lighthouse stolpern. Prinzipiell sollten Ressourcen, auch das LCP-Element, so gut wie möglich komprimiert werden, um so wenig Datenverkehr wie möglich zu erzeugen. Für Bilder gibt es zahlreiche Tools, um diese verlustfrei zu komprimieren. Aber auch auf dem Webserver selbst sollte Kompression, beispielsweise mittels Gzip, aktiviert sein. Bilder sollten darüber hinaus bevorzugt in einem modernen Format wie WebP oder JPEG2000 bereitgestellt werden, da diese eine sehr viel geringere Dateigröße bieten. Da jedoch nicht jeder Browser diese Formate unterstützt, sollten als Fallback immer die alten, aber möglichst komprimierten, Formate vorliegen. Versuchen Sie auch, Rastergrafiken richtig zu dimensionieren und keine 1000x1000px große JPEG für ein kleines Logo im Navigationsbereich an den Nutzer zu senden. Clientseitiges JavaScript- und CSS-Rendering minimieren. Es macht wenig Sinn, eine große Google Maps Bibliothek bereits bei Seitenaufruf in den Browser zu laden, wenn diese erst am Seitenende benötigt wird. Versuchen Sie, das verwendete JavaScript und CSS weitestgehend zu minimieren und jenes, das benötigt wird, möglichst im Ladezyklus der Webseite mittels async und defer nach hinten zu verschieben. Während JavaScript oder CSS in den Browser geladen wird, kann das Document Object Model (DOM), in welches die eigentliche HTML-Struktur Ihrer Webseite, und damit auch das LCP-Element, geladen wird, nicht weiter ausgebaut werden. Cumulative Layout Shift (CLS): Bedeutung und Optimierung Der Cumulative Layout Shift (CLS) misst, vereinfacht gesagt, die visuelle Stabilität Ihrer Webseite während des Ladevorgangs. Um noch einmal das Beispiel von oben aufzugreifen: Stellen Sie sich einen Button vor, den Sie noch während des Ladevorgangs drücken möchten, der aber immer wieder seine Position ändert. Nervenaufreibend, nicht? Genau das soll mit einer Optimierung des CLS verhindert werden. Die CLS-Metrik spricht daher in erster Linie für eine gute Usability der Webseite. Kein Nutzer möchte versehentlich auf den Button klicken, der ihn zum Abschluss eines Jahres-Abos führt, wenn er eigentlich nur eine Ausgabe einer Zeitschrift erwerben wollte. Wie aber lässt sich diese Layout-Verschiebung in einen vergleichbaren Wert packen? Für Google ist dieser Wert das Produkt aus der sogenannten Impact Fraction und der Distance Fraction. Die Impact Fraction sagt aus, wie stark ein instabiles Element des Layouts den Viewport zwischen zwei Frames beeinflusst. Wie bitte? Nochmal anhand eines Beispiels: Stellen Sie sich ein Element vor, das bei Seitenaufruf 50% der Viewport-Höhe einnimmt. Durch ein instabiles Layout wird es jedoch plötzlich um 25% nach unten verschoben. Damit hat das Element nun eine Impact Fraction von 75% (also 0,75). Die Distance Fraction ist im Prinzip der bewegliche Anteil der Impact Fraction. In unserem Beispiel läge die Distance Fraction bei 25%, da sich das Element um diesen Wert verschoben hat. Besteht der CLS nur aus diesem Element, hätten wir also eine gesamte Impact Fraction von 0,75 und eine Distance Fraction von 0,25, was multipliziert miteinander einen CLS von 0,1875 ergibt. Dieser Score wäre laut Google ausbaufähig. Nur ein Score bis maximal 0,1 gilt als gut, alles über 0,25 als schlecht. Checkliste für die CLS-Optimierung Nachdem wir die technischen Feinheiten geklärt haben, ist nun die Frage, wie wir diese Layout-Verschiebungen am besten verhindern können. Mit Platzhaltern arbeiten. Laden Sie beispielsweise ein Button-Element während des Ladevorgangs per JavaScript nach und fügen dann einen Button oberhalb eines Textblocks ein, unterliegt der Textblock einem Layout Shift. Sie sollten daher mittels einem Platzhalter, der optimalerweise genauso groß wie der einzufügende Button ist, arbeiten, und diesen Platzhalter anschließend durch den Button ersetzen. So weiß der Textblock bereits zu Anfang, "wo er hin gehört" und wird nicht mehr verschoben. Breiten und Höhen für Bilder definieren. Der Browser schafft während des Ladevorgangs automatisch Platzhalter für Bilder und Videos, wenn er weiß, wie viel Platz er frei halten muss. Dies kann er nur, wenn die jeweiligen Elemente mit Breiten- und Höhenangaben ausgestattet sind. Webfonts während des Ladevorgangs durch System-Fonts ersetzen. Arbeiten Sie mit Webfonts, achten Sie stets darauf, dass für diese ein ähnlicher System-Font als Ersatz angegeben ist. Nicht nur können Sie so auch ältere Browser, die ggf. Webfonts nicht anzeigen können, unterstützen, aber auch wird der Text bereits angezeigt, bevor die jeweilige Font geladen wurde, sodass auch hier Layout Shifts vermieden werden. Layout-Verschiebungen in Animationen vermeiden. Arbeiten Sie mit Animationen oder CSS-Übergängen, sollten Sie darauf achten, dass dadurch nicht das gesamte Layout verschoben wird, wenn beispielsweise die Größe eines Elements animiert wird. Auch hier sollten Sie ein Wrapper-Element schaffen, welches die maximale Größe des animierten Elements hat, sodass außenliegende Elemente nicht verschoben werden. First Contentful Paint (FCP): Bedeutung und Optimierung Der First Contentful Paint (FCP) ist eng verwandt mit dem LCP und misst, wann das erste inhaltliche Element auf der Webseite angezeigt wird. Bis zum FCP ist die Webseite daher weiß und für den Nutzer unbrauchbar. Der FCP sollte selbstverständlich weit früher als der LCP sein. Google gibt einen Wert von unter 1,8 Sekunden als gut an, während alles über 3 Sekunden schlecht ist. Bei der Optimierung des FCP kommen viele Faktoren zusammen, welche teilweise auch direkte (positive) Auswirkungen auf die anderen Metriken haben. Time To First Byte (TTFB) als Subfaktor für den FCP Der FCP hängt naturgemäß stark davon ab, wie lang der Server benötigt, um das erste Byte an den Nutzer zu senden. Dieser Zeitraum wird auch Time To First Byte, oder auch TTFB genannt. Hierzu zählen Dinge wie die DNS-Anfrage, welche den Hostnamen (z.B. kuatsu.dev) in die IP-Adresse des Servers auflöst, oder auch SSL-Handshakes. All dies hat aber eine Sache gemeinsam: Sie sind Sache des Servers und können nur optimiert werden, indem der Server optimiert wird. Große, unübersichtliche Datenbanken können ein Grund für einen langen TTFB sein, oder auch schlechte Webserver-Konfigurationen. Die beste Konfiguration nützt jedoch nichts, wenn der Hosting-Provider schlichtweg nicht gut genug ist oder die Webseite von einem einzigen Server am anderen Ende der Welt im Vergleich zum Nutzer bereitgestellt wird. In der Checkliste für die FCP-Optimierung finden Sie auch einige Punkte, die direkt mit dem TTFB zusammenhängen. Checkliste für die FCP-Optimierung Wir haben nun also erkannt, dass der FCP einer der wichtigsten Einflüsse auf die Nutzerzufriedenheit ist. Doch wie optimieren wie diesen Messwert? Hierzu gibt es unzählige Möglichkeiten, wovon Google zahlreiche in ihrem eigenen Blog-Eintrag vorstellt. Wir widmen uns einigen von diesen in unserer Checkliste. CSS und JavaScript minimieren . Wir haben bereits weiter oben gelernt, dass das Document Object Model während des Ladevorgangs von JavaScript oder CSS noch nicht aufgebaut werden kann. Daher ist es selbstredend, dass diese möglichst minimiert werden müssen. Es gibt sogenannte "Minifier" oder "Uglifier", welche Ihr CSS und JavaScript nehmen und dieses mittels ausgeklügelter Methoden so klein schrumpfen lassen wie möglich. Nutzen Sie diese Möglichkeit. Ungenutzes CSS und JavaScript entfernen . Eng verwandt mit der letzten Optimierungsmöglichkeit: Entfernen Sie CSS und JavaScript, das nicht benötigt wird. Hier kommt oft der Nachteil eeines großen WordPress Themes oder Ähnlichem zu Vorschein, welche oft mehrere Megabyte an CSS und JavaScript mit sich schleppen, welche für Ihre persönliche Webseite wahrscheinlich gar nicht benötigt werden. Für WordPress gibt es einige Plug-ins wie Asset CleanUp, mit welchen sie nicht benötigte Assets weitestmöglich entfernen können. Bei vielen Themes ist dies jedoch nicht immer perfekt möglich, weshalb die beste Lösung hier immer noch ist, auf vorgefertigte Themes zu verzichten und statt dessen ein eigenes Theme zu entwickeln oder auf einen auf Performance optimierten Page Builder wie Oxygen zu setzen. Caching verwenden . Die meisten Webserver bieten eine Vielzahl an Möglichkeiten, Caching zu aktivieren. Dadurch werden bestimmte Ressourcen nicht bei jedem Seitenaufruf neu generiert, sondern für eine gewisse Zeit zwischengespeichert. Auch für WordPress gibt es einige Plug-ins, die in Verbindung mit den entsprechenden Webserver-Anpassungen für massive Verbesserungen im FCP-Wert sorgen können. Bei jeder von uns angefertigten WordPress-Webseite ist daher eine WP Rocket Lizenz und Vorkonfiguration mit inbegriffen. Server-Side Generation (SSG) verwenden. Zugegeben: Nun kommen wir an einen Punkt, wo nicht mehr von Optimierung die Rede ist, sondern von einer völlig neuen Webseite. Ein Static Site Generator wie Next.js erstellt statische HTML-Seiten und übernimmt einen Großteil des JavaScripts auf dem Server. Im Nutzer-Browser werden daher keine dutzenden API-Anfragen für das Anzeigen eines Blogs mehr gemacht, sondern der Server führt diese Anfragen noch vor dem Ladevorgang aus und stellt eine fertige HTML-Seite bereit. Übrigens: Auch wir verwenden Next.js und Static Site Generation. Bitte beachten Sie, dass sich einige der zuvor genannten Optimierungsmöglichkeiten, vor allem im Bereich des Largest Contentful Paint (LCP), mit jenen des FCP überschneiden, und wir diese deshalb hier nicht noch einmal aufzählen. First Input Delay (FID): Bedeutung und Optimierung Der First Input Delay (FID) steht für die Zeit, die es benötigt, bis ein Nutzer auf Ihrer Webseite interaktiv eine Aktion ausführen kann. Klickt ein Nutzer also während des Ladevorgangs auf einen Button, dauert es diesen Zeitraum, bis eine Reaktion entsteht. Auch hier gibt Google Referenzwerte vor: Eine Zeit von unter 100ms gilt als gut, alles über 300ms hingegen als schlecht. Checkliste für die FID-Optimierung Der First Input Delay kann sich als besonders knifflig bzw. technisch zu optimieren herausstellen. Oft ist es hier so, dass nur eine detaillierte Bestandsaufnahme der aktuellen Webseite und eine tiefgreifende, technische Optimierung einen schlechten FID beheben können. Hier sind jedoch einige Maßnahmen, die vorgenommen werden können: Den Haupt-Thread entlasten . Das Rendering in JavaScript läuft über den Haupt-Thread. Werden in diesem jedoch gleichzeitig noch API-Anfragen und komplexe Berechnungen durchgeführt, muss das Rendering und damit auch die Reaktion auf eine Nutzerinteraktion warten. Dies kann beispielsweise durch den Einsatz von Web Workern oder dem Verwenden von asynchronem JavaScript behoben werden. Auswirkungen von Third-Party Code minimieren . Verwenden Sie viele JavaScript-Bibliotheken wie Google Analytics, Google Maps, Facebook Pixel usw. spiegelt sich dies in der Interaktivität Ihrer Webseite wider. Solche Bibliotheken sollten Sie daher prinzipiell erst nach laden, nachdem das Document Object Model (DOM) fertig geladen wurde. Hierzu können Sie unter anderem die async oder defer Attribute im script -Tag nutzen. Fazit Seit Juli 2021 sind die Core Web Vitals offizieller Bestandteil des Google Rankings und wurden spätestens dann zur Hausaufgabe eines jeden ernstzunehmenden SEOs. Doch nicht nur für eine gute Aufstellung in der Google-Suche sollten Sie diesen Messwerten Beachtung schenken: Am Ende stellen sie gute Metriken da, um die echte Bedienbarkeit und Nutzerfreundlichkeit Ihrer Webseite zu messen und zu vergleichen. Eine Digitalagentur, die sich auf die Optimierung der Web Vitals spezialisiert hat, kann daher nicht nur das Google Ranking verbessern, sondern auch für einen echten Mehrwert bei den Nutzern sorgen.
Bei der Entwicklung bzw. Planung einer neuen App stoßen die meisten schnell auf eine Frage: Hybrid oder nativ? Die meisten Apps sollen auf mehreren Systemen gleichzeitig laufen, meist iOS, Android und gegebenenfalls als Web App. Daher sollte man unbedingt die Vorteile, aber auch Nachteile sowie die Einsatzzwecke dieser beiden Ansätze verstehen. Beide dieser Herangehensweisen erfüllen ihren eigenen Zweck und passen für unterschiedliche Projekte. Wieso wir im Kundengespräch jedoch für die meisten Anwendungszwecke die Entwicklung einer hybriden App (oft auch cross-platform genannt und nicht zu verwechseln mit WebView Apps oder PWAs, also Progressive Web Apps) empfehlen, möchten wir hier anhand von sieben Vorteilen eben dieser aufzeigen. Eine einzige Codebase Der größte Vorteil von hybriden Apps war es schon immer, dass nur eine einzige Codebase verwaltet werden muss. Während bei der nativen App-Entwicklung für jedes zu unterstützende System eine eigene App programmiert werden muss, verfolgt die hybride Entwicklung einen Universalansatz. Es wird nur eine einzige App geschrieben, welche anschließend in eine native App kompiliert wird um so auf den gängigen Systemen zu laufen. Der Vorteil dürfte auf der Hand liegen: Sowohl am Budget als auch der benötigten Arbeitszeit für die Entwicklung kann mächtig gespart werden. Anstatt mehrere Entwickler an verschiedenen Systemen arbeiten zu lassen, kann oft ein einziges Entwicklungsteam die Programmierung für alle Systeme im Raketentempo vornehmen. Dieser Vorteil ergibt sich nicht nur bei der ersten Entwicklung, sondern auch im weiteren Verlauf. Wenn neue Funktionen hinzugefügt oder die App anderweitig gewartet werden soll, sind Anpassungen binnen weniger Arbeitsstunden erledigt und auf allen Systemen gleichzeitig einsatzbereit. Dies spart nicht nur Kosten, sondern ist auch für die Nutzer umso erfreulicher. Performance wie der große Bruder Vor nicht allzu langer Zeit standen hybride Apps noch massiv in Verruf. Zu diesen Zeiten entstand gerade das noch heute sehr populäre Ionic Framework, welches eines der Vorreiter in seinem Bereich war. Leider hatten Apps, die damals auf diese Art und Weise programmiert wurden, ein massives Problem: Performance. Selbst für den Laien war es einfach, zu erkennen, dass eine App nicht für das jeweilige System optimiert war. Grafikfehler, Stotterer und Abstürze gehörten zur Tagesordnung. Inzwischen eilen hybride Apps, und die Frameworks in denen sie programmiert sind wie React Native oder Flutter, ihrem Ruf jedoch meilenweit voraus. Performance-Probleme gibt es inzwischen kaum noch. Ganz im Gegenteil sogar erreichen diese nahezu ähnliche Geschwindigkeiten wie rein native Apps. Der Nutzer kann in den meisten Fällen keinen Unterschied mehr feststellen. Dadurch setzen sie sich sehr stark von sogenannten WebView Apps ab, welche noch immer mit selbigen Problemen zu kämpfen haben. WebView Apps unterscheiden sich von hybriden Apps, welche zu nativen Apps kompiliert und optimiert werden, dadurch, dass diese einfach gesagt nur eine Webseite in einem Wrapper anzeigen. Dass sich hierdurch automatisch Performanzprobleme ergeben, dürfte klar sein. Eine App, die native UI-Funktionalitäten und System-APIs unterstützt (wie es moderne, hybride Apps tun) wird immer schneller sein, als eine Webseite, die auf dem Smartphone gerendert wird. Großartige User Experience Dieser Punkt geht Hand in Hand mit dem vorherigen Punkt. Durch die native Performance hybrider Apps und der Möglichkeit, System-APIs wie Apple Health, HomeKit oder ähnliche einzubauen, ergibt sich eine fantastische Nutzererfahrung. Und selbst wenn eine Systemfunktionalität mal nicht von Haus aus vom verwendeten Framework verwendet wird, ist es in den allermeisten Fällen möglich, diese mit relativ wenig Aufwand nachzurüsten. Offline-Nutzbarkeit In diesem Punkt stellen wir die hybride App weniger in den Vergleich zur nativen App, sondern viel mehr zum „kleinen Bruder“ – der WebView App. Der Kernvorteil gegenüber einer solchen liegt nämlich darin, dass die App unabhängig von einer bestehenden Internetverbindung genutzt werden kann. Die App ist mitsamt allen benötigten Funktionalitäten auf dem Gerät des Nutzers installiert und muss sich daher nicht bei jedem Öffnen neu laden. Zugegeben : Durch cleveren Einsatz von Caching können viele Web Apps inzwischen auch offline laufen (man spricht dann auch von einer PWA, also einer Progressive Web App). Oft ist es jedoch so, dass hier bestimmte Features trotz dessen nicht ohne Internetverbindung funktionieren, da diese nicht auf alle System-APIs zurückgreifen können und so oft eine dauerhafte Serververbindung benötigen. Dieses Problem gibt es beim Einsatz von hybriden Apps nicht. Auch ist die Entwicklung einer hybriden App inzwischen oft günstiger als die einer offline verfügbaren Progressive Web App. Ein kleiner Disclaimer… Auch wenn wir von der hybriden App-Entwicklung absolut überzeugt sind, so eignet sie sich jedoch nicht für alle Arten von Projekten. In bestimmten Fällen macht es durchaus Sinn, native Apps für jedes zu unterstützende System zu entwickeln. Vor allem wenn es um neu erschienene Systemfunktionalitäten geht, kommt die hybride App-Entwicklung oft an ihre Grenzen. Auch wenn herausragende Performance wichtig für die Funktion der App ist, kann eine hybride App – trotz der sich immer weiter verbessernden Performanz dieser – vielleicht nicht mehr mithalten.
Bereits seit einiger Zeit stellt TypeScript unsere primäre Sprache dar, sowohl für interne Projekte als auch Kundenprojekte. Bereits seit Beginn arbeiten wir hauptsächlich mit JavaScript (in Kombination mit einigen Frameworks wie React und NodeJS), da die Flexibilität und der vielseitige Anwendungsbereich der Sprache es uns ermöglichen, eine Codebase in derselben Sprache für ein gesamtes Projekt, inklusive Web und Mobile App sowie Backend, zu nutzen. Nicht lang ist es her, dass wir all unsere aktuellen Projekte einer TypeScript Migration durchzogen haben. Auch wenn jedes JavaScript-Projekt technisch gesehen ein gültiges TypeScript-Projekt ist, da TypeScript ein Superset von JavaScript darstellt, so ist nicht automatisch jedes JavaScript-Projekt auch ein gutes TypeScript-Projekt. Fügen Sie TypeScript zu einer bestehenden JavaScript-Codebase hinzu, so werden alle Variablen, Konstanten und Objekte, welche sich nicht aus dem engeren Kontext für den Compiler ergeben, als vom Typen any betrachtet. Dass dies nicht im Sinne des Erfinders ist, dürfte klar sein. TypeScript wurde eben mit dem Hintergedanken entwickelt, strikte Typen in JavaScript nutzen und auf dynamische Typisierung weitgehend verzichten zu können. Als Entwickler sind Sie also gezwungen, für viele dieser Objekte händisch die Typisierung vorzunehmen. Logisch, dass sich dabei zwei Mal überlegt wird, ob dies wirklich notwendig ist und der Nutzen den Kosten bzw. dem Zeitaufwand überwiegt. Zwar gibt es inzwischen zahlreiche Tools und Programme, wie „ts-migrate“ von Airbnb (welche TypeScript ebenfalls als offizielle Frontend-Sprache nutzen!), welche die Migration zu TypeScript vereinfachen sollen. Doch auch diese sind selbstredend bei weitem nicht perfekt und verhindern auch nicht das manuelle Typisieren von Objekten. Computer sind schließlich nicht wirklich gut darin, die Semantik hinter Ihrem Code zu verstehen (auch wenn sich dies in Zeiten von Deep Learning und KIs wie GitHub Copilot rasant ändert). Nun stehen wir also vor einem Dilemma: Migrieren – oder die alten Codebases weiter verwalten? Warum TypeScript einfach besser ist Bevor wir uns also der Frage widmen, ob die Migration bestehender JavaScript-Projekte sinnvoll ist, schauen wir uns zunächst einmal die zwei größten Vorteile von TypeScript an. Der TypeScript Compiler (TSC). Der unserer Ansicht nach größte Vorteil bei der Nutzung von TypeScript liegt im Compiler. JavaScript ist normalerweise eine interpretierte Skriptsprache, welche vom Browser während der Laufzeit interpretiert und ausgeführt wird. Eine Kompilierung ist daher nicht notwendig. TypeScript wird zu JavaScript transkompiliert (wodurch der Browser den kompilierten Code wiederum als normales JavaScript interpretieren kann). Der Vorteil liegt hierbei vor allem darin, dass TypeScript-Code auch zu älteren JavaScript- / ECMAScript-Versionen transkompiliert werden kann. So können Sie auch dann moderne Funktionen wie Promises nutzen, wenn Sie Ihre Anwendungen für ältere Browser bzw. Umgebungen bauen. TypeScript kümmert sich darum, die Features in äquivalente Strukturen der avisierten JavaScript-Version zu kompilieren. Fehlererkennung zur Build-Zeit. Selbstverständlich bringen interpretierte, und nicht kompilierte Sprachen auch Vorteile wie schnellere Entwicklungsabläufe mit sich, jedoch auch einen gravierenden Nachteil. Viele Fehler, die normalerweise ein Compiler auffangen könnte, fallen erst während der Laufzeit auf. TypeScript kann hier in der größten Kategorie nachhelfen, den Typfehlern. Jeder/Jedem JavaScript-Entwickler:in wird es irgendwann einmal passiert sein, dass sie / er versehentlich auf Attribute von undefined oder null zugreifen wollte. TypeScript kann solche Fehler noch verhindern, bevor es die Anwendung in die Staging- oder gar Produktionsumgebung schafft. Warum und wie wir alle (aktuellen) Projekte migriert haben Gründe für die TypeScript Migration gibt es also reichlich. Doch lohnt es sich wirklich, auch bestehende, zum Teil riesige Codebases zu migrieren? Die Antwort, die wir uns auf diese Frage gegeben haben, war ein ganz klares Ja . Nachdem wir TypeScript für einige neue Projekte bereits länger verwendet haben und in den Genuss statischer Typisierung in JavaScript gekommen sind, fiel die Entscheidung mehr als leicht. Die Umsetzung hingegen ist eine andere Hausnummer. Viele unserer laufenden Kundenprojekte in JavaScript waren mehrere zehntausend Zeilen lang – wo also anfangen? Den Status Quo bestimmen. Wenn Sie nicht schon zuvor mit TypeScript-„Alternativen“ wie JSDoc gearbeitet haben, ist die Wahrscheinlichkeit hoch, dass Sie recht wenig Ahnung haben, welche Funktion eigentlich welche Typen verwendet. Man sollte sich daher zunächst eine Übersicht über den aktuellen Stand verfassen. Mit welchen Schnittstellen spricht die Anwendung? Welche Daten werden gelesen und geschrieben? Ist die Herkunft dieser Daten typsicher? Eine großzügige Dokumentation des Codes macht sich spätestens hier bemerkbar. Den „Strict“ Mode aktivieren. Generell macht TypeScript unserer Ansicht nach so richtig nur mit Nutzung im „Strict“ Modus Sinn. Ohne Aktivierung dessen spendiert TypeScript zwar weit mehr Bewegungsspielraum, indem beispielsweise implizites Any erlaubt wird. Genau das soll jedoch durch die Migration verhindert werden. Wir möchten dynamische und nicht-statische Typen verbieten, weshalb wir uns durch fehlende Nutzung des Strict Mode ein eigenes Loch buddeln. Als wir unsere ersten Projekte zu TypeScript migriert haben, haben wir unsere Projekte stets zunächst im „Non-Strict“ Modus von TypeScript migriert. Erst im Anschluss haben wir den Strict Mode aktiviert und die restlichen Fehler ausgeweidet. Wir haben jedoch schnell festgestellt, dass dies nicht die effektivste Methode ist. Aktivieren Sie den Strict Mode bereits zu Anfang der Migration. Sie werden sich im weiteren Verlauf viel Kopfzerbrechen sparen. Fehlerbehebungen und Optimierungen, die Sie im ersten Schritt durchführen, müssen teils nach Aktivierung des Strict Modes wieder gänzlich verworfen werden. Auch wenn der Fehler-Tab in Ihrer Entwicklungsumgebung Sie vielleicht einschüchtern mag: Nutzen Sie von Anfang an den Strict Mode. Deklarationsdateien installieren Ein Großteil der von TypeScript angezeigten Fehler stammt wahrscheinlich gar nicht von Ihrem Code, sondern entspringt dem node_modules Ordner. Dies liegt schlicht daran, dass in den meisten Modulen keine Typdeklarationen von Haus aus dabei sind. Glücklicherweise gibt es von der Open-Source-Community nahezu zu jedem Modul passende Typdeklarationen. Zu einem Modul „some_module“ können Sie diese in der Regel mit $ npm install @types/some_module installieren. Hat Ihre Anwendung jedoch einen sehr spezifischen Anwendungszweck und nutzen Sie daher auch sehr spezielle Libraries, so kann es vorkommen, dass keine passenden Typdeklarationen vorliegen. Anstatt diese Libraries nun jedoch einfach als Any zu deklarieren, investieren Sie die Zeit und legen Sie Typdeklarationen an. Tech Debt ist ein echtes Problem – und Sie möchten sich zu diesem Zeitpunkt nicht darin verwickeln. Klassen und Funktionen migrieren Bevor Sie sich den Kleinteilen zuwenden, ist es eine gute Idee, zunächst die verwendeten Klassen, Funktionen und größeren Objekte Ihrer Anwendung zu typisieren. Es ist wahrscheinlich, dass diese immer wieder im Code verwendet werden. Dadurch eignen sich diese als erster Kandidat, da die Typisierung der anderen Variablen und Objekte sich so später weitaus einfacher gestalten wird. Wir haben uns bei unserer Migration daher zunächst Dinge wie Middlewares, Models usw. vorgenommen. Indem wir diesen möglichst genaue Typen gaben, fiel es in den kleineren Funktionen und Abschnitten des Codes später weitaus einfacher, diese zuzuordnen und zu typisieren. Achten Sie darauf, bei der Typisierung möglichst streng, aber nicht zu streng vorzugehen: TypeScript ist ein sehr mächtiges Werkzeug, und Sie können Ihre Typen so streng machen, wie es Ihnen beliebt. Allerdings, „don’t over-engineer“ ! Sich in den Typen zu sehr auszutoben macht vom Kosten-Zeit-Faktor ab einem bestimmten Punkt nur noch wenig Sinn. Other stuff… Ein Großteil der Arbeit wurde nun in recht kurzer Zeit erledigt. Nun geht es jedoch an die Kleinigkeiten. Erfahrungsgemäß reicht es hier meist, Variablen und Co. einen der vorgefertigten Typen wie „string“ zu geben. Auch hier gilt das bekannte Don’t Over-Engineer Prinzip. Auch Ihre Tests sollten Sie an TypeScript anpassen. Viele der bekannten Test Frameworks sind für TypeScript optimiert und arbeiten damit problemlos. Fazit TypeScript ist womöglich das Beste, was JavaScript in den letzten Jahren passiert ist. Der Trend geht laut den letzten StackOverflow Surveys immer weiter in Richtung statisch typisierte Sprachen. Die Flexibilität von JavaScript und eine sichere Typisierung machen so jedes Projekt zukunftssicher und einfach zu verwalten. Seit unserer vollständigen TypeScript Migration ist es bei uns de-facto Standard, und wir möchten es nicht mehr missen.