Bonnes pratiques
Référencement
Éditer cette page sur GithubL'aspect le plus important du référencement (SEO en anglais) est de créer du contenu de bonne qualité que beaucoup d'autres sites web référencent via des liens. Cependant, certaines considérations techniques sont à connaître pour construire des sites bien référencés.
Clé-en-mainpermalink
SSRpermalink
Même si ces dernières années les moteurs de recherche se sont améliorés dans l'indexation du contenu rendu par du code JavaScript côté client, le contenu rendu côté serveur (SSR) est indexé plus fréquemment et plus efficacement. SvelteKit utilise le SSR par défaut, et bien que vous ayez la possibilité de le désactiver dans le hook handle
, vous devriez le laisser activé, à moins d'avoir une bonne raison de le désactiver.
Le rendu qu'effectue SvelteKit est très configurable, et vous pouvez implémenter du rendu dynamique si nécessaire. Ce n'est en général pas recommandé, puisque le SSR a d'autres avantages au-delà du référencement.
Performancepermalink
Les indicateurs tels que les Core Web Vitals impactent la qualité du référencement. Svelte et SvelteKit n'introduisent qu'une surcouche minimale, et permettent donc de facilement construire des sites très performants. Vous pouvez tester la performance de votre site en utilisant les outils PageSpeed Insights ou Lighthouse que propose Google. N'hésitez pas à lire la page dédiée aux performances pour plus de détails.
URLs normaliséespermalink
SvelteKit redirige les chemins avec des trailing slashs vers des chemins sans (ou inversement, selon votre configuration), car les URLs dupliquées détériorent votre référencement.
Gestion manuellepermalink
<title> et <meta>permalink
Chaque page devrait avoir des balises <title>
et <meta name="description">
uniques et bien écrites dans un <svelte:head>
. Des guides pour bien écrire ses titres et descriptions, ainsi que d'autres suggestions pour rendre le contenu compréhensible par les moteurs de recherche, sont disponibles dans la documentation de audits Lighthouse SEO (en anglais).
Une pratique classique est de renvoyer les données liées au référencement dans les fonctions
load
de page, puis de les utiliser (en tant que$page.data
) dans le<svelte:head>
de votre layout racine.
Sitemapspermalink
Les sitemaps aident les moteurs de recherche à prioriser les pages au sein de votre site, particulièrement lorsque vous avez une grande quantité de contenu. Vous pouvez créer un sitemap dynamiquement en utilisant un endpoint :
ts
export async functionGET () {return newResponse (`<?xml version="1.0" encoding="UTF-8" ?><urlsetxmlns="https://www.sitemaps.org/schemas/sitemap/0.9"xmlns:xhtml="https://www.w3.org/1999/xhtml"xmlns:mobile="https://www.google.com/schemas/sitemap-mobile/1.0"xmlns:news="https://www.google.com/schemas/sitemap-news/0.9"xmlns:image="https://www.google.com/schemas/sitemap-image/1.1"xmlns:video="https://www.google.com/schemas/sitemap-video/1.1"><!-- les éléments <url> sont définis ici --></urlset>`.trim (),{headers : {'Content-Type': 'application/xml'}});}
ts
export async functionGET () {return newResponse (`<?xml version="1.0" encoding="UTF-8" ?><urlsetxmlns="https://www.sitemaps.org/schemas/sitemap/0.9"xmlns:xhtml="https://www.w3.org/1999/xhtml"xmlns:mobile="https://www.google.com/schemas/sitemap-mobile/1.0"xmlns:news="https://www.google.com/schemas/sitemap-news/0.9"xmlns:image="https://www.google.com/schemas/sitemap-image/1.1"xmlns:video="https://www.google.com/schemas/sitemap-video/1.1"><!-- les éléments <url> sont définis ici --></urlset>`.trim (),{headers : {'Content-Type': 'application/xml',},},);}
AMPpermalink
Une réalité malheureuse du développement web moderne est qu'il est parfois nécessaire de créer une version AMP de votre site. Avec SvelteKit, ceci peut être fait en définissant l'option inlineStyleThreshold
...
ts
/** @type {import('@sveltejs/kit').Config} */constconfig = {kit : {// puisque les <link rel="stylesheet">// ne sont pas permis, inliner tous les stylesinlineStyleThreshold :Infinity }};export defaultconfig ;
...puis en désactivant le rendu côté client (csr
) dans votre fichier +layout.js
/+layout.server.js
racine...
ts
export constcsr = false;
ts
export constcsr = false;
...puis en ajoutant amp
dans votre fichier app.html
...
<html amp>
...
...et en transformant le HTML à l'aide de tranformPageChunk
et de la fonction transform
importée de @sveltejs/amp
:
ts
import * asamp from '@sveltejs/amp';/** @type {import('@sveltejs/kit').Handle} */export async functionhandle ({event ,resolve }) {letbuffer = '';return awaitresolve (event , {transformPageChunk : ({html ,done }) => {buffer +=html ;if (done ) returnamp .transform (buffer );}});}
ts
import * asamp from '@sveltejs/amp';import type {Handle } from '@sveltejs/kit';export consthandle :Handle = async ({event ,resolve }) => {letbuffer = '';return awaitresolve (event , {transformPageChunk : ({html ,done }) => {buffer +=html ;if (done ) returnamp .transform (buffer );},});};
Afin d'éviter d'envoyer du CSS inutilisé après avoir transformé une page en sa version AMP, nous pouvons utiliser le paquet dropcss
:
ts
import * asamp from '@sveltejs/amp';importCannot find module 'dropcss' or its corresponding type declarations.2307Cannot find module 'dropcss' or its corresponding type declarations.dropcss from'dropcss' ;/** @type {import('@sveltejs/kit').Handle} */export async functionhandle ({event ,resolve }) {letbuffer = '';return awaitresolve (event , {transformPageChunk : ({html ,done }) => {buffer +=html ;if (done ) {letcss = '';constmarkup =amp .transform (buffer ).replace ('⚡', 'amp') // dropcss ne sait pas gérer ce caractère.replace (/<style amp-custom([^>]*?)>([^]+?)<\/style>/, (match ,attributes ,contents ) => {css =contents ;return `<style amp-custom${attributes }></style>`;});css =dropcss ({css ,html :markup }).css ;returnmarkup .replace ('</style>', `${css }</style>`);}}});}
ts
import * asamp from '@sveltejs/amp';importCannot find module 'dropcss' or its corresponding type declarations.2307Cannot find module 'dropcss' or its corresponding type declarations.dropcss from'dropcss' ;import type {Handle } from '@sveltejs/kit';export consthandle :Handle = async ({event ,resolve }) => {letbuffer = '';return awaitresolve (event , {transformPageChunk : ({html ,done }) => {buffer +=html ;if (done ) {letcss = '';constmarkup =amp .transform (buffer ).replace ('⚡', 'amp') // dropcss ne sait pas gérer ce caractère.replace (/<style amp-custom([^>]*?)>([^]+?)<\/style>/, (match ,attributes ,contents ) => {css =contents ;return `<style amp-custom${attributes }></style>`;});css =dropcss ({css ,html :markup }).css ;returnmarkup .replace ('</style>', `${css }</style>`);}},});};
C'est une bonne idée d'utiliser le hook
handle
pour valider le HTML transformé grâce àamphtml-validator
, mais seulement si vous prérendez les pages, car ce processus est très lent.