Best practices
SEO
Edit this page on GitHubSEO で最も重要なのは、高品質なコンテンツを作ること、そしてそれが web 上で広くリンクされることです。しかし、ランクが高いサイトを構築するためにいくつか技術的に考慮すべきこともあります。
Out of the boxpermalink
SSRpermalink
近年、検索エンジンはクライアントサイドの JavaScript でレンダリングされたコンテンツのインデックスを改善してきましたが、サーバーサイドレンダリングされたコンテンツのほうがより頻繁に、より確実にインデックスされます。SvelteKit はデフォルトで SSR を採用しています。handle
で無効にすることもできますが、適切な理由がない場合はそのままにしておきましょう。
SvelteKit のレンダリングは高度な設定が可能です。必要であれば、動的なレンダリング(dynamic rendering) を実装することも可能です。一般的には推奨されません、SSR には SEO 以外のメリットもあるからです。
パフォーマンスpermalink
Core Web Vitals のような指標は検索エンジンのランクに影響を与えます。Svelte と SvelteKit はオーバーヘッドが最小限であるため、ハイパフォーマンスなサイトを簡単に構築できです。Google の PageSpeed Insights や Lighthouse で、ご自身のサイトをテストすることができます。詳細は パフォーマンスのページ をお読みください。
URLの正規化permalink
SvelteKit は、末尾のスラッシュ(trailing slash)付きのパス名から、末尾のスラッシュが無いパス名にリダイレクトします (設定 で逆にできます)。URLの重複は、SEOに悪影響を与えます。
Manual setuppermalink
<title> と <meta>permalink
全てのページで、よく練られたユニークな <title>
と <meta name="description">
を <svelte:head>
の内側に置くべきです。説明的な title と description の書き方に関するガイダンスと、検索エンジンにとってわかりやすいコンテンツを作るためのその他の方法については、Google の Lighthouse SEO audits のドキュメントで見つけることができます。
よくあるパターンとしては、ページの
load
関数から SEO 関連のdata
を返し、それを最上位のレイアウトの<svelte:head>
で ($page.data
として) 使用することです。
サイトマップpermalink
サイトマップ は、検索エンジンがサイト内のページの優先順位付けをするのに役立ちます、特にコンテンツの量が多い場合は。エンドポイントを使用してサイトマップを動的に作成できます:
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"><!-- <url> elements go here --></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"><!-- <url> elements go here --></urlset>`.trim (),{headers : {'Content-Type': 'application/xml',},},);}
AMPpermalink
現代の web 開発における不幸な現実として、サイトの Accelerated Mobile Pages (AMP) バージョンを作らなければならないときがある、というのがあります。SvelteKit では、inlineStyleThreshold
オプションを設定することでこれを実現することができます…
ts
/** @type {import('@sveltejs/kit').Config} */constconfig = {kit : {// since <link rel="stylesheet"> isn't// allowed, inline all stylesinlineStyleThreshold :Infinity }};export defaultconfig ;
…最上位(root)の +layout.js
/+layout.server.js
の csr
を無効にします…
ts
export constcsr = false;
ts
export constcsr = false;
…amp
を app.html
に追加します
<html amp>
...
…そして、transformPageChunk
と、@sveltejs/amp
からインポートできる transform
を使用して、HTML を変換します:
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 );},});};
ページを amp に変換した結果として未使用の CSS が配布されてしまうのを防ぎたければ、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 can't handle this character.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 can't handle this character.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>`);}},});};
amphtml-validator
を使用して変換された HTML を検証するのに、handle
hook を利用するのは良いアイデアですが、非常に遅くなってしまうので、ページをプリレンダリングするときだけにしてください。