Erziele 100 Punkte auf Google PageSpeed ​​Insights mit Meteor (dh eine Web-App-Zielseite)

7

Mein Kunde fordert eine funktionsreiche clientseitig gerenderte Web-App, die bei Google PageSpeed ​​Insights gleichzeitig 100/100 Punkte erreicht und beim ersten Laden mit einem leeren Cache sehr schnell rendert. Sie möchte die gleiche Seite sowohl als Web-App als auch als Zielseite nutzen und jede Suchmaschine kann die gesamte Seite mit guter SEO leicht durchforsten.

Ist das mit Meteor möglich? Wie kann es gemacht werden?

    
Noland 12.07.2016, 22:20
quelle

1 Antwort

23

Ja, das ist möglich und einfach mit Meteor 1.3, einigen zusätzlichen Paketen und einem kleinen Hack.

Siehe bc-real-estate-math.com für ein Beispiel. (Diese Seite erreicht nur 97 Punkte, weil ich die Bilder nicht sortiert habe und das Tracking von Analytics und FBs hat kurze Cache-Leben)

Traditionell war eine clientseitig gerenderte Plattform wie Meteor beim ersten Laden mit einem leeren Cache wegen der großen Javascript-Nutzlast langsam. Das serverseitige Rendering (mit React) der ersten Seite löst das fast, außer dass Meteor out-of-the-box kein asynchrones Javascript oder Inline-CSS unterstützt und somit Ihren ersten Rendervorgang verlangsamt und Ihren Google PageSpeed ​​Insights-Score zunichte macht Sie könnten über diese Metrik, es wirkt sich auf die AdWord-Preise meiner Kunden und damit optimieren ich für sie.

Das können Sie mit dem Setup dieser Antwort erreichen:

  • Sehr schnelle Zeit bis zum ersten Rendern bei leerem Cache, wie 500ms
  • Kein "flash of styled content"
  • Bewerten Sie 100/100 in Google PageSpeed ​​Insights
  • Verwendung eines beliebigen Webfont ohne den PageSpeed ​​Score zu verringern
  • Vollständige SEO-Kontrolle einschließlich Seitentitel und Meta
  • Perfekte Integration mit Google Analytics und Facebook Pixels, die zeichnet jede Seitenansicht unabhängig von Server- oder clientseitiges Rendering
  • Der Google-Such-Bot und andere Crawler sehen sofort alle echten HTML-Seiten Ihrer Seite, ohne Skripts auszuführen
  • Verwaltet #hash-URLs nahtlos, um zu Teilen einer Seite zu scrollen
  • Verwenden Sie eine kleine Zahl (wie & lt; 30) der Symbolschrift Zeichen, ohne Anforderungen hinzuzufügen oder Geschwindigkeitsbewertung zu verletzen
  • Skalieren Sie auf eine beliebige Größe von Javascript, ohne die Zielseitenerfahrung zu beeinträchtigen
  • All die regelmäßige Großartigkeit einer vollen Meteor Web-App

Was dieses Setup nicht erreichen kann:

  • Große monolithische CSS-Frameworks werden Ihren PageSpeed-Score beenden und die Zeit bis zum ersten Rendern verlangsamen. Bootstrap ist ungefähr so ​​groß, wie Sie können, bevor Sie anfangen, Probleme zu sehen
  • Sie können eine Flash-of-wrong-Schriftart nicht vermeiden und trotzdem 100/100 PageSpeed ​​beibehalten. Der erste Render wird die websichere Schriftart des Clients sein, der zweite Render wird die Schriftart verwenden, die Sie zuvor verschoben haben.

Im Wesentlichen können Sie Folgendes erreichen:

  • Der Client fordert jede URL in Ihrer Site an
  • Server sendet zurück a  Komplette HTML-Datei mit Inline-CSS, Async-Javascript und Deferred  Schriften
  • Der Client fordert Bilder an (falls vorhanden) und der Server sendet sie
  • Der Client kann nun die Seite
  • rendern
  • Zurückgebliebene Schriftarten (falls vorhanden) kommen an und die Seite wird möglicherweise erneut gerendert
  • Javascript Mutterschiff Nutzlast kommt in der  Hintergrund
  • Meteor fährt hoch und Sie haben eine voll funktionsfähige Web-App mit  all die Schnickschnack und keine First-Load-Strafe
  • So lange wie du  geben Sie dem Benutzer ein paar Zeilen Text zum Lesen und ein schönes Bild dazu  Schauen Sie sich an, sie werden nie den Übergang von statischem HTML bemerken  Seite zur ausgewachsenen Web-App

So erreichen Sie dies

Ich habe Meteor 1.3 und diese zusätzlichen Pakete benutzt:

  • reagieren
  • reaktivieren-dom
  • Reaktiv-Router
  • react-router-ssr
  • reag-Helm
  • postcss
  • autoprefixer
  • Meteorknoten-Stubs

React spielt gut mit serverseitigem Rendering ab, ich habe keine andere Rendering Engine ausprobiert. react-helmet wird verwendet, um die <head> jeder Seite sowohl auf Client- als auch auf Serverseite (z. B. zum Festlegen des Titels jeder Seite) einfach hinzuzufügen und zu ändern. Ich benutze den Autoprefixer, um alle anbieterspezifischen Präfixe zu meinem CSS / SASS hinzuzufügen, die für diese Übung sicherlich nicht benötigt werden.

Nach den Beispielen in der react-router-, reac-router-ssr- und react-helm-Dokumentation ist der Großteil der Website dann ziemlich einfach. Weitere Informationen zu diesen Paketen finden Sie in den Dokumenten dieser Pakete.

Zunächst einmal eine sehr wichtige Datei, die sich in einem gemeinsamen Meteor-Verzeichnis befinden sollte (dh nicht in einem Server- oder Client-Ordner). Dieser Code richtet das serverseitige React-Rendering, das <head> -Tag, Google Analytics und Facebook-Tracking ein und scrollt zu #hash anchors.

%Vor%

So werden die Routen eingerichtet. Beachten Sie die Titelattribute, die später an den Helm übergeben werden, um den <head> Inhalt festzulegen.

%Vor%

App.jsx - die äußere Anwendungskomponente. Beachten Sie das <Helmet> -Tag, das einige Meta-Tags und den Seitentitel basierend auf Attributen der spezifischen Seitenkomponente festlegt.

%Vor%

Eine Beispielseitenkomponente:

%Vor%

So fügen Sie verzögerte Schriften hinzu.

Diese Schriftarten werden nach dem anfänglichen Rendern geladen und verzögern daher nicht die Zeit bis zur ersten Wiedergabe. Ich glaube, dass dies die einzige Möglichkeit ist, Webfonts zu verwenden, ohne den PageSpeed-Score zu reduzieren. Es führt jedoch zu einer kurzen Fehlzeichung. Fügen Sie dies in eine Skriptdatei ein, die im Client enthalten ist:

%Vor%

Wenn Sie einen exzellenten Service wie fontello verwenden.com und hand-pick nur die Symbole, die Sie tatsächlich brauchen, können Sie sie in Ihre inline <head> CSS einbetten und Symbole beim ersten Rendern erhalten, ohne auf eine große Schriftdatei zu warten.

Der Hack

Das ist fast genug, aber das Problem ist, dass unsere Skripte, CSS und Schriften synchron geladen werden und das Rendering verlangsamen und unseren PageSpeed-Score verringern. Leider, so weit ich das beurteilen kann, unterstützt Meteor 1.3 offiziell keine Möglichkeit, CSS einzubinden oder den Skript-Tags das async-Attribut hinzuzufügen. Wir müssen ein paar Zeilen in 3 Dateien des Core-Boilerplate-Generator-Pakets hacken.

~ / .meteor / packages / Textbausteingenerator / .1.0.8.4n62e6 ++ os + web.browser + web.cordova / os / boilerplate-generator.js

%Vor%

~ / .meteor / packages / boilerplate-generator / .1.0.8.4n62e6 ++ web + web.browser + web.cordova / os / packages / boilerplate-generator / boilerplate_web.browser.html

%Vor%

Zählen Sie nun die Anzahl der Zeichen in diesen 2 Dateien, die Sie bearbeitet haben, und geben Sie die neuen Werte in das Längenfeld der Dateien ein, die in ~ / .meteor / packages / boilerplate-generator / .1.0.8.4n62e6 + enthalten sind + os + web.browser + web.cordova / os.json

Löschen Sie anschließend den Ordner project / .meteor / local , um Meteor zu zwingen, das neue Kernpaket zu verwenden und Ihre App neu zu starten (das Warmladen funktioniert nicht). Sie werden nur die Änderungen im Produktionsmodus sehen.

Dies ist offensichtlich ein Hack und wird brechen, wenn Meteor aktualisiert. Ich hoffe, dass wir mit dem Posting und dem Interesse daran, auf einen besseren Weg hinarbeiten werden.

Zu tun

Zu verbessern wäre:

  • Vermeide den Hack. Erhalte MDG, um asynchrone Skripts und Inline-Dateien offiziell zu unterstützen CSS auf flexible Weise
  • Erlaube granulare Kontrolle darüber, welches CSS inline und welches
  • verschoben werden soll
  • Erlaube granulare Kontrolle darüber, welches JS zu asynchron ist und welches zu synchronisieren ist was zu inline.
Noland 12.07.2016, 22:20
quelle