Skip to main content

Référencement

L’aspect le plus important du référencement (SEO] est la création de contenu de qualité largement cité par d’autres ressources sur le web. Toutefois, il y a quelques considérations techniques permettant de créer des sites qui performent bien à ce niveau.

Clé-en-main

SSR

Même si les moteurs de recherche se sont améliorés depuis quelques années dans l’indexation de contenu rendu avec du code JavaScript côté client, le contenu rendu sur le serveur est indexé plus souvent et plus efficacement. SvelteKit utilise le SSR par défaut, et bien que vous puissiez le désactiver dans le hook handle, vous devriez le laisser activé à moins que n’ayez une bonne raison de ne pas le faire.

Le rendu de SvelteKit est très configurable et vous pouvez implémenter du rendu dynamique si nécessaire. Ce n’est généralement pas recommandé, puisque le SSR offre d’autres avantages que le référencement.

Performance

Des indicateurs comme les Core Web Vitals impactent le classment d’une page par les moteurs de recherche. Puisque Svelte et SvelteKit introduisent une surcouche minimale, ils rendent plus simple de créer des sites de haute performance. Vous pouvez tester les performances de votre site en utilisant les outils de Google PageSpeed Insights ou Lighthouse. Utiliser simplement certaines fonctionnalités clé comme le mode de rendu hybride qu’utilise SvelteKit par défaut, ou encore l’otpimisation de vos images, vous pouvez améliorer significativement la rapidité de votre site. Lisez la page sur les performances pour plus de détails.

URLs normalisées

SvelteKit redirige les chemins ayant des trailing slashes vers des chemins n’en ayant pas (ou inversement selon votre configuration), car les URLs dupliquées détériorent le référencement.

Mise en place manuelle

<title> et <meta>

Chaque page devrait avoir des éléments <title> et <meta name="description"> uniques et bien écrits dans un élément <svelte:head>. Des conseils sur comment écrire des titres et descriptions pertinentes, en plus d’autres suggestions sur comment rendre votre contenu compréhensible par les moteurs de recherche, sont disponibles dans la documentation Lighthouse SEO audits.

Un usage commun est de renvoyer les data concernant le référencement depuis vos fonctions load, puis de les utiliser (en tant que page.data) dans l’élément <svelte:head> de votre layout racine.

Sitemaps

src/routes/sitemap.xml/+server
export async function GET() {
	return new Response(
		`
		<?xml version="1.0" encoding="UTF-8" ?>
		<urlset
			xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
			xmlns:xhtml="http://www.w3.org/1999/xhtml"
			xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"
			xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"
			xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
			xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
		>
			<!-- les éléments <url> se déclarent ici -->
		</urlset>`.trim(),
		{
			headers: {
				'Content-Type': 'application/xml'
			}
		}
	);
}

AMP

Une réalité malheureuse du développement web moderne est qu’il est quelques fois nécessaire de créer une version Accelerated Mobile Pages (AMP) de votre site. SvelteKit vous permet de le faire en définissant l’option inlineStyleThreshold...

svelte.config
/** @type {import('@sveltejs/kit').Config} */
const config = {
	kit: {
		// puisque <link rel="stylesheet"> n'est pas
		// autorisé, inliner tous les styles
		inlineStyleThreshold: Infinity
	}
};

export default config;

..., en désactivant l’option csr de vos fichiers +layout.js / +layout.server.js...

src/routes/+layout.server
export const csr = false;

..., en ajoutant amp à votre fichier app.html...

<html amp>
...

..., et en transformant le HTML utilisant l’option transformPageChunk avec transform importé depuis @sveltejs/amp :

src/hooks.server
import * as amp from '@sveltejs/amp';

/** @type {import('@sveltejs/kit').Handle} */
export async function handle({ event, resolve }) {
	let buffer = '';
	return await resolve(event, {
		transformPageChunk: ({ html, done }) => {
			buffer += html;
			if (done) return amp.transform(buffer);
		}
	});
}
import * as amp from '@sveltejs/amp';
import type { Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
	let buffer = '';
	return await resolve(event, {
		transformPageChunk: ({ html, done }) => {
			buffer += html;
			if (done) return amp.transform(buffer);
		}
	});
};

To prevent shipping any unused CSS as a result of transforming the page to amp, we can use dropcss:

src/hooks.server
import * as amp from '@sveltejs/amp';
import dropcss from 'dropcss';

/** @type {import('@sveltejs/kit').Handle} */
export async function handle({ event, resolve }) {
	let buffer = '';

	return await resolve(event, {
		transformPageChunk: ({ html, done }) => {
			buffer += html;

			if (done) {
				let css = '';
				const markup = amp
					.transform(buffer)
					.replace('⚡', 'amp') // dropcss ne peut 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;
				return markup.replace('</style>', `${css}</style>`);
			}
		}
	});
}
import * as amp from '@sveltejs/amp';
import dropcss from 'dropcss';
import type { Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
	let buffer = '';

	return await resolve(event, {
		transformPageChunk: ({ html, done }) => {
			buffer += html;

			if (done) {
				let css = '';
				const markup = amp
					.transform(buffer)
					.replace('⚡', 'amp') // dropcss ne peut 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;
				return markup.replace('</style>', `${css}</style>`);
			}
		}
	});
};

C’est une bonne idée d’utiliser le hook handle pour valider le HTML transformé en utilisant amphtml-validator, mais uniquement si vous pré-rendez vos pages, car ce traitement est très lent.

Modifier cette page sur Github llms.txt