Beim Schreiben von Single-Page-Anwendungen ist es einfach und natürlich, sich in dem Versuch zu verfangen, die ideale Erfahrung für die häufigste Art von Benutzern zu schaffen – andere Menschen wie wir selbst. Diese aggressive Konzentration auf eine bestimmte Art von Besuchern unserer Website lässt oft eine andere wichtige Gruppe außen vor – die Crawler und Bots, die von Suchmaschinen wie Google verwendet werden. Dieser Leitfaden zeigt, wie einige einfach zu implementierende Best Practices und eine Umstellung auf serverseitiges Rendering Ihrer Anwendung das Beste aus beiden Welten geben können, wenn es um SPA-Benutzererfahrung und SEO geht.
Voraussetzungen
Eine funktionierende Kenntnis von Angular 5+ wird vorausgesetzt. Einige Teile des Leitfadens befassen sich mit Angular 6, aber das Wissen darüber ist nicht unbedingt erforderlich.
Viele der unbeabsichtigten SEO-Fehler, die wir machen, kommen von der Denkweise, dass wir Webanwendungen und nicht Websites bauen. Worin besteht der Unterschied? Es ist eine subjektive Unterscheidung, aber ich würde sagen, dass der Schwerpunkt der Bemühungen folgendermaßen aussieht:
Webanwendungen konzentrieren sich auf natürliche und intuitive Interaktionen für die Benutzer
Websites konzentrieren sich darauf, Informationen allgemein zugänglich zu machen
Aber diese beiden Konzepte müssen sich nicht gegenseitig ausschließen! Indem wir uns einfach auf die Regeln der Website-Entwicklung besinnen, können wir das elegante Erscheinungsbild von SPAs beibehalten und die Informationen an den richtigen Stellen platzieren, um eine ideale Website für Crawler zu erstellen.
Verstecken Sie den Inhalt nicht hinter Interaktionen
Ein Grundsatz, den Sie bei der Gestaltung von Komponenten berücksichtigen sollten, ist, dass Crawler ziemlich dumm sind. Sie werden auf Ihre Anker klicken, aber sie werden nicht wahllos über Elemente streichen oder auf ein div klicken, nur weil auf dessen Inhalt „Read More“ steht. Dies steht im Widerspruch zu Angular, wo eine gängige Praxis zum Ausblenden von Informationen darin besteht, sie „auszublenden“. Und oft macht das auch Sinn! Wir verwenden diese Praxis, um die Anwendungsleistung zu verbessern, indem wir potenziell schwergewichtige Komponenten nicht in einem nicht sichtbaren Teil der Seite unterbringen.
Das bedeutet jedoch, dass, wenn Sie Inhalte auf Ihrer Seite durch clevere Interaktionen verstecken, die Chancen hoch sind, dass ein Crawler diese Inhalte nie zu Gesicht bekommt. Sie können dies abmildern, indem Sie einfach CSS und nicht *ngif verwenden, um diese Art von Inhalten zu verbergen. Natürlich werden intelligente Crawler bemerken, dass der Text versteckt ist, und er wird wahrscheinlich als weniger wichtig eingestuft als sichtbarer Text. Dies ist jedoch besser, als wenn der Text im DOM überhaupt nicht zugänglich wäre. Ein Beispiel für diesen Ansatz sieht so aus:
Erstelle keine „virtuellen Anker“
Die folgende Komponente zeigt ein Anti-Muster, das ich häufig in Angular-Anwendungen sehe und das ich „virtuelle Anker“ nenne:
Grundsätzlich ist es so, dass ein Klick-Handler an etwas wie einen <Button> oder <div>-Tag angehängt ist und dieser Handler eine gewisse Logik ausführt und dann den importierten Angular-Router verwendet, um zu einer anderen Seite zu navigieren. Dies ist aus zwei Gründen problematisch:
Crawler werden wahrscheinlich nicht auf diese Art von Elementen klicken, und selbst wenn sie es tun, werden sie keine Verbindung zwischen der Quell- und Zielseite herstellen.
Dies verhindert die sehr bequeme Funktion „In einem neuen Tab öffnen“, die Browser nativ für tatsächliche Anker-Tags bereitstellen.
Anstatt virtuelle Anker zu verwenden, verwenden Sie einen tatsächlichen <a>-Tag mit der Routerlink-Direktive. Wenn Sie vor der Navigation eine zusätzliche Logik ausführen müssen, können Sie immer noch einen Click-Handler zum Anker-Tag hinzufügen.
Vergessen Sie nicht die Überschriften
Eines der Prinzipien einer guten Suchmaschinenoptimierung ist die Festlegung der relativen Wichtigkeit verschiedener Texte auf einer Seite. Ein wichtiges Hilfsmittel im Werkzeugkasten des Webentwicklers sind Überschriften. Häufig werden Überschriften beim Entwurf der Komponentenhierarchie einer Angular-Anwendung völlig vergessen; ob sie enthalten sind oder nicht, macht im Endprodukt keinen visuellen Unterschied. Aber das ist etwas, das Sie berücksichtigen müssen, um sicherzustellen, dass Crawler sich auf die richtigen Teile Ihrer Informationen konzentrieren. Ziehen Sie also die Verwendung von Überschriften-Tags in Betracht, wenn dies sinnvoll ist. Achten Sie jedoch darauf, dass Komponenten, die Überschriften-Tags enthalten, nicht so angeordnet werden können, dass ein <h1> innerhalb eines <h2> erscheint.
Machen Sie „Suchergebnisseiten“ verlinkbar
Um noch einmal auf das Prinzip zurückzukommen, wie Crawler dumm sind – betrachten Sie eine Suchseite für eine Widget-Firma. Ein Crawler wird keine Texteingabe in einem Formular sehen und etwas wie „Toronto Widgets“ eingeben. Um Crawlern Suchergebnisse zur Verfügung zu stellen, muss Folgendes getan werden:
Eine Suchseite muss so eingerichtet werden, dass Suchparameter über den Pfad und/oder die Abfrage akzeptiert werden.
Links zu spezifischen Suchanfragen, von denen Sie glauben, dass sie für den Crawler interessant sein könnten, müssen der Sitemap oder als Ankerlinks auf anderen Seiten der Website hinzugefügt werden.
Die Strategie rund um Punkt #2 liegt außerhalb des Rahmens dieses Artikels (einige hilfreiche Ressourcen sind https://yoast.com/internal-linking-for-seo-why-and-how/ und https://moz.com/learn/seo/internal-link). Wichtig ist, dass die Suchkomponenten und -seiten unter Berücksichtigung von Punkt 1 entworfen werden, so dass Sie die Flexibilität haben, einen Link zu jeder möglichen Art von Suche zu erstellen, so dass er überall eingefügt werden kann. Das bedeutet, dass Sie ActivatedRoute importieren und auf Änderungen des Pfades und der Abfrageparameter reagieren müssen, um die Suchergebnisse auf Ihrer Seite zu steuern, anstatt sich nur auf Ihre Abfrage- und Filterkomponenten auf der Seite zu verlassen.
Machen Sie die Paginierung verlinkbar
Während wir gerade beim Thema Suchseiten sind, ist es wichtig, sicherzustellen, dass die Paginierung korrekt gehandhabt wird, so dass Crawler auf jede einzelne Seite Ihrer Suchergebnisse zugreifen können, wenn sie dies wünschen. Es gibt einige bewährte Verfahren, die Sie befolgen können, um dies zu gewährleisten.
Um frühere Punkte zu wiederholen: Verwenden Sie keine „virtuellen Anker“ für Ihre „nächsten“, „vorherigen“ und „Seitenzahl“-Links. Wenn ein Crawler diese nicht als Anker erkennen kann, wird er sich möglicherweise nie etwas anderes als Ihre erste Seite ansehen. Verwenden Sie für diese Links echte <a>-Tags mit RouterLink. Fügen Sie außerdem die Paginierung als optionalen Teil Ihrer verlinkbaren Such-URLs ein – dies geschieht oft in Form eines page=-Abfrageparameters.
Sie können Crawlern zusätzliche Hinweise auf die Paginierung Ihrer Website geben, indem Sie relative „prev“/“next“ <link>-Tags hinzufügen. Eine Erklärung, warum diese nützlich sein können, finden Sie unter: https://webmasters.googleblog.com/2011/09/pagination-with-relnext-and-relprev.html. Hier ist ein Beispiel für einen Dienst, der diese <link>-Tags auf Angular-freundliche Weise automatisch verwalten kann:
Dynamische Metadaten einbinden
Eines der ersten Dinge, die wir bei einer neuen Angular-Anwendung tun, ist die Anpassung der index.html-Datei vor – das Setzen des Favicons, das Hinzufügen von responsiven Meta-Tags und höchstwahrscheinlich das Einstellen des Inhalts der Tags <title> und <meta name=“description“> auf sinnvolle Standardwerte für Ihre Anwendung. Aber wenn Sie sich dafür interessieren, wie Ihre Seiten in den Suchergebnissen erscheinen, können Sie es nicht dabei belassen. Auf jeder Route Ihrer Anwendung sollten Sie die Tags title und description dynamisch so einstellen, dass sie zum Seiteninhalt passen. Dies hilft nicht nur den Crawlern, sondern auch den Nutzern, da sie informative Browser-Tab-Titel, Lesezeichen und Vorschaudaten sehen können, wenn sie einen Link in sozialen Medien teilen. Das folgende Snippet zeigt, wie Sie diese auf Angular-freundliche Weise mithilfe der Meta- und Title-Klassen aktualisieren können:
Testen Sie, ob Crawler Ihren Code beschädigen
Einige Bibliotheken oder SDKs von Drittanbietern werden entweder heruntergefahren oder können nicht von ihrem Hosting-Provider geladen werden, wenn User-Agents, die zu Suchmaschinen-Crawlern gehören, erkannt werden. Wenn ein Teil Ihrer Funktionalität von diesen Abhängigkeiten abhängt, sollten Sie einen Fallback für Abhängigkeiten bereitstellen, die Crawler nicht zulassen. Zumindest sollte Ihre Anwendung in diesen Fällen nicht den Rendering-Prozess des Clients zum Absturz bringen, sondern sich sanft zurückentwickeln. Ein hervorragendes Tool zum Testen der Interaktion Ihres Codes mit Crawlern ist die Google Mobile Friendly-Testseite: https://search.google.com/test/mobile-friendly. Achten Sie auf Ausgaben wie diese, die darauf hinweisen, dass dem Crawler der Zugriff auf ein SDK verwehrt wird: