Când scriem aplicații cu o singură pagină, este ușor și natural să ne lăsăm prinși în încercarea de a crea experiența ideală pentru cel mai comun tip de utilizatori – alți oameni ca noi. Această concentrare agresivă asupra unui singur tip de vizitator al site-ului nostru poate lăsa adesea pe dinafară un alt grup important – crawlerele și roboții utilizați de motoarele de căutare, cum ar fi Google. Acest ghid va arăta modul în care unele bune practici ușor de implementat și o mișcare către redarea pe partea serverului pot oferi aplicației dvs. cele mai bune din ambele lumi atunci când vine vorba de experiența utilizatorului SPA și SEO.
Precondiții
Se presupune o cunoaștere practică a Angular 5+. Unele părți ale ghidului se ocupă de Angular 6, dar cunoașterea acestuia nu este strict necesară.
Multe dintre greșelile SEO involuntare pe care le facem provin din mentalitatea că noi construim aplicații web, nu site-uri web. Care este diferența? Este o distincție subiectivă, dar aș spune că din punctul de vedere al focalizării efortului:
Aplicațiile web se concentrează pe interacțiuni naturale și intuitive pentru utilizatori
Site-urile web se concentrează pe punerea la dispoziție a informațiilor în general
Dar aceste două concepte nu trebuie să se excludă reciproc! Prin simpla reîntoarcere la rădăcinile regulilor de dezvoltare a site-urilor web, putem menține aspectul elegant al SPA-urilor și să punem informația în toate locurile potrivite pentru a realiza un site web ideal pentru crawlere.
Nu ascundeți conținutul în spatele interacțiunilor
Un principiu la care trebuie să ne gândim atunci când proiectăm componente este că crawlerele sunt oarecum proaste. Ei vor da clic pe ancorele dumneavoastră, dar nu vor trece la întâmplare peste elemente sau vor da clic pe un div doar pentru că în conținutul său scrie „Read More”. Acest lucru vine în contradicție cu Angular, unde o practică obișnuită pentru a ascunde informații este „*ngif it out”. Și de multe ori acest lucru are sens! Folosim această practică pentru a îmbunătăți performanța aplicației prin faptul că nu avem componente potențial grele care stau pur și simplu într-o parte nevizibilă a paginii.
Cu toate acestea, acest lucru înseamnă că, dacă ascundeți conținutul paginii dvs. prin interacțiuni inteligente, sunt șanse ca un crawler să nu vadă niciodată acel conținut. Puteți atenua acest lucru prin simpla utilizare a CSS în loc de *ngif pentru a ascunde acest tip de conținut. Desigur, crawlerele inteligente vor observa că textul este ascuns și va fi probabil ponderat ca fiind mai puțin important decât textul vizibil. Dar acesta este un rezultat mai bun decât ca textul să nu fie deloc accesibil în DOM. Un exemplu al acestei abordări arată astfel:
Nu creați „Ancore virtuale”
Componenta de mai jos arată un anti-pattern pe care îl văd foarte des în aplicațiile Angular și pe care îl numesc „ancoră virtuală”:
În principiu, ceea ce se întâmplă este că un manipulator de clic este atașat la ceva de genul unui tag <buton> sau <div> și acel manipulator va efectua o anumită logică, apoi va folosi Routerul Angular importat pentru a naviga către o altă pagină. Acest lucru este problematic din două motive:
Crawlerii probabil că nu vor face clic pe aceste tipuri de elemente și, chiar dacă o fac, nu vor stabili o legătură între pagina sursă și pagina de destinație.
Acest lucru împiedică funcția foarte convenabilă „Open in new tab” (Deschidere în tab nou) pe care browserele o oferă în mod nativ pentru etichetele de ancorare reale.
În loc să folosiți ancore virtuale, folosiți o etichetă reală <a> cu directiva routerlink. Dacă trebuie să efectuați o logică suplimentară înainte de navigare, puteți adăuga în continuare un gestionar de clic la eticheta de ancorare.
Nu uitați de titluri
Unul dintre principiile unui bun SEO este stabilirea importanței relative a diferitelor texte de pe o pagină. Un instrument important pentru acest lucru în trusa dezvoltatorului web sunt titlurile. Este obișnuit să se uite complet de titluri atunci când se proiectează ierarhia componentelor unei aplicații Angular; faptul că sunt sau nu incluse nu face nicio diferență vizuală în produsul final. Dar acesta este un aspect pe care trebuie să îl luați în considerare pentru a vă asigura că crawlerele se concentrează pe părțile corecte ale informațiilor dumneavoastră. Așadar, luați în considerare utilizarea etichetelor de titlu acolo unde are sens. Cu toate acestea, asigurați-vă că componentele care includ etichete de titlu nu pot fi aranjate în așa fel încât un <h1> să apară în interiorul unui <h2>.
Faceți ca „Search Result Pages” să poată fi legate
Returnând la principiul modului în care crawlerele sunt proaste – luați în considerare o pagină de căutare pentru o companie de widgeturi. Un crawler nu va vedea o intrare de text pe un formular și va tasta ceva de genul „Toronto widgets”. Din punct de vedere conceptual, pentru ca rezultatele căutării să fie disponibile pentru crawlere trebuie să se facă următoarele:
Este necesară configurarea unei pagini de căutare care să accepte parametrii de căutare prin intermediul căii și/sau al interogării.
Legături către căutări specifice pe care credeți că crawlerul le-ar putea găsi interesante trebuie adăugate la sitemap sau ca legături de ancorare pe alte pagini ale site-ului.
Strategia în jurul punctului 2 este în afara scopului acestui articol (Câteva resurse utile sunt https://yoast.com/internal-linking-for-seo-why-and-how/ și https://moz.com/learn/seo/internal-link). Ceea ce este important este că componentele și paginile de căutare ar trebui să fie proiectate ținând cont de punctul #1, astfel încât să aveți flexibilitatea de a crea o legătură către orice tip de căutare posibilă, permițând ca aceasta să fie injectată oriunde doriți. Acest lucru înseamnă să importați ActivatedRoute și să reacționați la modificările acesteia în calea și parametrii de interogare pentru a conduce rezultatele căutării pe pagina dumneavoastră, în loc să vă bazați doar pe componentele de interogare și filtrare de pe pagină.
Faceți ca paginarea să poată fi legată
În timp ce vorbim despre paginile de căutare, este important să vă asigurați că paginarea este gestionată corect, astfel încât crawlerele să poată accesa fiecare pagină a rezultatelor căutării dumneavoastră, dacă doresc acest lucru. Există câteva bune practici pe care le puteți urma pentru a vă asigura de acest lucru.
Pentru a reitera punctele anterioare: nu folosiți „Ancore virtuale” pentru legăturile „următor”, „anterior” și „numărul paginii”. Dacă un crawler nu le poate vedea ca fiind ancore, este posibil să nu se uite niciodată la nimic dincolo de prima dvs. pagină. Folosiți pentru acestea etichete reale <a> cu RouterLink. De asemenea, includeți paginarea ca parte opțională a URL-urilor dvs. de căutare cu link-uri – aceasta vine adesea sub forma unui parametru de interogare page=.
Puteți oferi indicii suplimentare crawlerelor despre paginarea site-ului dvs. prin adăugarea de tag-uri relative „prev”/”next” <link>. O explicație cu privire la motivul pentru care acestea pot fi utile poate fi găsită la: https://webmasters.googleblog.com/2011/09/pagination-with-relnext-and-relprev.html. Iată un exemplu de serviciu care poate gestiona automat aceste tag-uri <link> într-un mod prietenos pentru Angular:
Includeți metadate dinamice
Unul dintre primele lucruri pe care le facem la o nouă aplicație Angular este să facem ajustări la index.fișierul html – setarea faviconului, adăugarea de metaetichete responsive și, cel mai probabil, setarea conținutului etichetelor <title> și <meta name=”description”> la niște valori implicite sensibile pentru aplicația dumneavoastră. Dar dacă vă interesează cum apar paginile dvs. în rezultatele căutării, nu vă puteți opri aici. Pe fiecare traseu pentru aplicația dvs. ar trebui să setați în mod dinamic etichetele title și description pentru a se potrivi cu conținutul paginii. Acest lucru nu numai că va ajuta crawlerele, dar va ajuta și utilizatorii, deoarece aceștia vor putea să vadă titlurile informative ale filelor din browser, marcajele și informațiile de previzualizare atunci când partajează un link pe rețelele sociale. Fragmentul de mai jos arată cum puteți actualiza acestea într-un mod prietenos pentru Angular folosind clasele Meta și Title:
Test pentru crawlere care vă sparg codul
Câteva biblioteci terțe sau SDK-uri fie se închid, fie nu pot fi încărcate de la furnizorul lor de găzduire atunci când sunt detectați agenți de utilizator care aparțin crawlerelor motoarelor de căutare. Dacă o parte din funcționalitatea dvs. se bazează pe aceste dependențe, ar trebui să furnizați o soluție de rezervă pentru dependențele care nu permit crawlerele. Cel puțin, aplicația dvs. ar trebui să se degradeze în mod grațios în aceste cazuri, mai degrabă decât să prăbușească procesul de redare a clientului. Un instrument excelent pentru a testa interacțiunea codului dvs. cu crawlerele este pagina de testare Google Mobile Friendly: https://search.google.com/test/mobile-friendly. Căutați o ieșire ca aceasta care semnifică faptul că crawlerului i se blochează accesul la un SDK: