コンテンツにスキップ
svelte-vitals
日本語
Esc
移動開く⌘Jプレビュー
このページの内容

ルール

svelte-vitals が行うチェックの一覧。カテゴリ別にまとめています。

svelte-vitals が報告するルールをカテゴリ別にまとめました。それぞれのルールから、何をチェックし、なぜ重要で、どう直すかを説明したページへ移動できます。

表に並ぶ重大度は初期値です。変えたり無効にしたりする方法は 設定 を参照してください。

SEO

ルール 重大度 概要
seo/title-presence 🔴 critical どのルートでも <title> が空にならないようにしましょう。
seo/canonical-url 🟡 warning すべてのルートに <link rel=“canonical”> タグを含めるべきです。
seo/charset 🟡 warning 文字エンコーディングは <meta charset> で宣言します。
seo/description-presence 🟡 warning すべてのルートに <meta name=“description”> が必要です。
seo/duplicate-description 🟡 warning meta description はルートごとに違う内容にしましょう。
seo/duplicate-title 🟡 warning <title> はルートごとに違う内容にしましょう。
seo/hreflang 🟡 warning hreflang の alternate には有効なコードを使いましょう。x-default はセレクター・リダイレクトページで推奨されます。
seo/html-lang 🟡 warning app.html の <html> に lang 属性を設定しましょう。
seo/image-alt 🟡 warning <img> には alt 属性を付けます。
seo/json-ld-relative-url 🟡 warning JSON-LD の URL は絶対 URL で書きます。
seo/json-ld-required-props 🟡 warning 認識できる @type には、リッチリザルトに必要なプロパティを揃えましょう。
seo/json-ld-validity 🟡 warning ページの JSON-LD は、@context と @type を備えた妥当な JSON である必要があります。
seo/og-image 🟡 warning <meta property=“og”> タグはどのルートにも必要です。
seo/og-title 🟡 warning <meta property=“og”> タグはどのルートにも必要です。
seo/og-url 🟡 warning og には、そのページの正規アドレスを入れましょう。
seo/robots-txt 🟡 warning プロジェクトに robots.txt を用意しましょう。
seo/single-h1 🟡 warning <h1> は 1 ページにつき 1 つだけにしましょう。
seo/sitemap-xml 🟡 warning プロジェクトに sitemap.xml を用意しましょう。
seo/ssr-disabled 🟡 warning export const ssr = false にすると、JS を実行しないクローラーからコンテンツが見えなくなり、初回描画も遅くなります。
seo/viewport 🟡 warning レスポンシブ表示のための viewport メタタグを宣言しましょう。
seo/description-length 🔵 info meta description は 70〜160 文字に収めましょう。
seo/heading-level-skip 🔵 info 見出しのレベルは飛ばさずに使いましょう。
seo/indexability 🔵 info ルートが誤って noindex になっていないか確認します。
seo/json-ld 🔵 info どのルートにも JSON-LD 構造化データを入れましょう。
seo/json-ld-date-format 🔵 info JSON-LD の日付プロパティは ISO-8601 形式で書きます。
seo/json-ld-deprecated-type 🔵 info 一部のスキーマ型は、Google のリッチリザルトが廃止または制限されました。
seo/json-ld-placeholder 🔵 info JSON-LD にプレースホルダのまま残っている値がないか確認します。
seo/og-description 🔵 info og はどのルートにも入れましょう。
seo/sitemap-in-robots 🔵 info robots.txt から sitemap の場所をクローラーに伝えましょう。
seo/title-length 🔵 info <title> は 30〜60 文字に収めましょう。
seo/twitter-card 🔵 info X/Twitter で大きなカード表示にするため、twitter を宣言しましょう。

Performance

ルール 重大度 概要
performance/font-preload-crossorigin 🟡 warning crossorigin を指定しないと、preload したフォントは使われません。
performance/image-dimensions 🟡 warning <img> には width と height を明示します。
performance/lcp-image 🟡 warning LCP になりそうな最初の画像は、遅延読み込みにしないでください。
performance/load-waterfall 🟡 warning universal load で依存関係のある await が数珠つなぎになると、1 ホップごとにブラウザからのネットワーク往復が発生します。
performance/minify-disabled 🟡 warning vite.config に build.minify が残っていると、ミニファイされていない JS/CSS がそのまま本番に配信されます。
performance/preload-missing-as 🟡 warning <link rel=“preload”> には as 属性を指定します。
performance/render-blocking-script 🟡 warning head の <script src> で HTML の解析を止めないようにしましょう。
performance/heavy-import 🔵 info サイズが大きく、ツリーシェイクも効かないパッケージの import は避けましょう。
performance/iframe-loading 🔵 info 画面外の iframe は、スクリプト・フォント・メディアを含むサードパーティのドキュメント全体を先読みし、画面外の画像より高くつくのが普通です。loading=“lazy” で遅延できます。
performance/image-loading-hint 🔵 info <img> には loading 属性を明示します。
performance/namespace-import 🔵 info ツリーシェイクを効かせるため、import * as ではなく名前付き import を使いましょう。
performance/preconnect 🔵 info ページが使うサードパーティのオリジンには、あらかじめ preconnect しておきましょう。
performance/responsive-image 🔵 info 大きな画像には srcset を用意しましょう。
performance/sequential-awaits 🔵 info 互いの結果を使わない await の逐次実行は無駄です。同時に開始しましょう。
performance/state-raw 🔵 info 再代入しかしないオブジェクト・配列の $state には、一度も使わない深いリアクティビティのコストがかかり続けます。$state.raw ならプロキシを省けます。

Correctness

ルール 重大度 概要
correctness/orphan-effect 🔴 critical コンポーネント初期化の外で作られた $effect はランタイムで effect_orphan エラーになります。
correctness/orphan-lifecycle 🔴 critical onMount や getContext などをコンポーネント初期化の外で呼ぶと、ランタイムで lifecycle_outside_component エラーになります。
correctness/server-browser-global 🔴 critical モジュールスコープや load・ハンドラで window や document、localStorage を参照すると、SSR が ReferenceError で落ちます。
correctness/autoplay-muted 🟡 warning ブラウザは音声付きの自動再生をブロックし、ブロックされてもエラーになりません。muted のない <video autoplay> は実際の訪問者の前で静かに再生されないままです。
correctness/base-path-navigation 🟡 warning ルート相対リンクをハードコードすると kit.paths.base ではなくドメインのルートを指すため、base path の配下ではアプリの外に出てしまい、本番で 404 になります。
correctness/checkable-bind-value 🟡 warning checkbox や radio の bind は DOM の value プロパティを見るため、チェックを切り替えても値が更新されません。
correctness/each-index-key 🟡 warning {#each} のキーに index を使うと、要素の同一性が位置で決まります。キーを付けないのと同じバグが、見えにくい形で起こります。
correctness/each-key 🟡 warning 動的なデータを回す {#each} にはキーを付けましょう。
correctness/effect-as-derived 🟡 warning 状態を代入するだけの $effect は $derived に置き換えましょう。
correctness/effect-as-onmount 🟡 warning reactive 値を読まない $effect は、イベントハンドラ、{@attach}、onMount のいずれかで書くべきです。
correctness/instance-browser-global 🟡 warning インスタンススクリプトは SSR 時にサーバーでも実行されるため、トップレベルで window や document を参照するとレンダリングが落ちます。
correctness/nonreactive-builtin-state 🟡 warning $state に入れた素の Map・Set・Date・URL・URLSearchParams はプロキシされないため、中身を変えても検知されず、気づかないうちに UI が更新されなくなります。
correctness/prop-mutation 🟡 warning $bindable を宣言していない $props() の値は書き換えないでください。
correctness/stale-prop-derivation 🟡 warning $derived を使わずに prop から計算した値は一度しか評価されず、気づかないうちに親の変更へ追従しなくなります。
correctness/unmutated-state 🔵 info 一度も変更しない $state は、const(または $state.raw)で十分です。

Security

ルール 重大度 概要
security/handler-state-write 🔴 critical load 関数や action が、import したモジュールの状態に書き込んでいます。サーバーではこの状態を全リクエストで共有します。
security/javascript-url 🟡 warning 属性に javascript: URL を使わないでください。
security/raw-html 🟡 warning {@html} は HTML をエスケープせずに描画します。値は必ずサニタイズしてください。
security/server-module-state 🟡 warning ルートや hooks のファイルで、モジュールスコープの変数を関数の中から再代入しています。サーバーではこの変数を全リクエストで共有します。
security/shared-state-import 🟡 warning server / universal ファイルが、モジュールスコープに $state を持つ .svelte.ts を import しています。サーバープロセスでは 1 つのインスタンスを全リクエストで共有します。

Architecture

ルール 重大度 概要
architecture/component-size 🔵 info 大きくなりすぎたコンポーネントは分割しましょう。
architecture/directory-naming 🔵 info ディレクトリは、その場所に宣言した記法で名付けるべきです。
architecture/doc-link-target 🔵 info コメントに書かれたドキュメントリンクは、実在する何かを指し続けている必要があります。
architecture/private-scope-import 🔵 info プライベートなディレクトリ内のユニットを、その外から import すべきではありません。
architecture/prop-count 🔵 info props が多すぎるコンポーネントは、担っている責務も多すぎます。
architecture/reserved-directory-names 🔵 info ディレクトリの直下に置ける名前は、その位置に宣言した名前だけにすべきです。
architecture/reserved-name-placement 🔵 info 予約ディレクトリ名は、その名前について宣言した場所にしか現れてはいけません。
architecture/route-component-import 🔵 info SvelteKit のルートエントリはフレームワークが描画するものであり、他のコンポーネントから import するものではありません。
architecture/unit-entry-file 🔵 info ユニットとして宣言したディレクトリには、同名のファイルを置くべきです。

Accessibility

ルール 重大度 概要
a11y/accessible-name 🟡 warning ボタン・リンク・画像ボタン・iframe には、アクセシブルネームを算出できる手がかりが必要です。
a11y/aria-hidden-focus 🟡 warning キーボードでフォーカスできる要素を aria-hidden=“true” で支援技術から隠してはいけません。
a11y/disallowed-aria-props 🟡 warning 要素の role が対応しない aria-* 属性は無視され、role が禁止する属性、たとえば素の div への名前付けは、公開されない名前になります。
a11y/disallowed-element 🟡 warning プロジェクトが「使わない」と宣言した要素の出現をすべて報告します。宣言するまでは何もしません。
a11y/duplicate-landmark 🟡 warning 1つのルートに main・banner・contentinfo ランドマークはそれぞれ1つまでにしましょう。
a11y/id-duplication 🟡 warning ルート内の id はすべて一意にしましょう。
a11y/interactive-nesting 🟡 warning インタラクティブな要素を、別のインタラクティブな要素の内側に置いてはいけません。
a11y/invalid-aria-value 🟡 warning aria-* 属性の値は、その属性に WAI-ARIA 仕様が定める型と一致させます。
a11y/invalid-role 🟡 warning role 属性には、タイポでも抽象ロールでもない、具体的な WAI-ARIA ロールを指定します。
a11y/label-has-control 🟡 warning label をフィールドと関連付けるには for 属性かラップされたコントロールが必要です。
a11y/no-accesskey 🟡 warning accesskey 属性はページレベルのショートカットキーを割り当てますが、実際のキーの組み合わせはブラウザと OS によって異なり、ユーザーには発見できず、支援技術のキーバインドと衝突します。
a11y/no-autofocus 🟡 warning autofocus はページ読み込み時にユーザーの意図と無関係にフォーカスを移動させます。スクリーンリーダーのユーザーは組み立てていたページの文脈を失い、キーボードのユーザーはページの途中に放り出されます。
a11y/no-missing-id-ref 🟡 warning id参照は、合成後のルートのどこかに存在する id を指している必要があります。
a11y/permitted-contents 🟡 warning すべての要素は、HTML のコンテンツモデル上、親要素に許可されたコンテンツでなければなりません。
a11y/placeholder-label-option 🟡 warning required かつ単一選択の select には、値を選ばせずに送信できてしまわないよう空の先頭 option が必要です。
a11y/positive-tabindex 🟡 warning 0 より大きい tabindex はその要素をページ内の自然順のすべての要素より前に置き、たった1つの tabindex=“1” がページ全体のキーボードナビゲーション順を組み替えてしまいます。
a11y/required-aria-props 🟡 warning state や property 属性を要求するロールには、ネイティブなホスト要素のセマンティクスで代替されない限り、それらの属性が必要です。
a11y/required-element 🟡 warning すべてのルートがプロジェクトの宣言する要素を含まなければなりません。合成されたルートで判定するので、レイアウトの <main> も数えます。
a11y/top-level-landmark 🟡 warning banner・main・complementary・contentinfo ランドマークは、他のランドマークの内側に置いてはいけません。
a11y/unknown-aria-attribute 🟡 warning aria-* 属性には、タイポではない実在の WAI-ARIA 属性名を指定します。
a11y/abbr-title 🔵 info title のない <abbr> は読者に展開形を提供しません。晴眼ユーザーにはツールチップが出ず、支援技術には展開するものがありません。
a11y/deprecated-aria 🔵 info ARIA 1.3 が全体として、または置かれた role 上で非推奨にした role や aria-* 属性は、いまも動くが、そこではもう定義されていません。
a11y/deprecated-attr 🔵 info HTML spec データがその要素で非推奨と記す属性は、標準ではなくレガシー互換によって挙動が決まっています。
a11y/deprecated-element 🔵 info HTML 標準の obsolete features に挙げられた要素は非適合であり、適合する代替要素があります。
a11y/doctype 🔵 info src/app.html の先頭は <!doctype html> で始めましょう。
a11y/no-duplicate-dt 🔵 info 1つの dl 要素の中で、同じ名前の dt 要素は複数あるべきではありません。重複した用語はたいてい、2つの説明が1つの dt を共有するはずだったコピペミスです。
a11y/pattern-title 🔵 info input に pattern を指定するときは、期待する形式を説明する title を含めるべきと仕様が述べています。それがないと、送信に失敗しても「値が違う」ことしか伝わりません。
a11y/require-datetime 🔵 info time 要素のテキストは機械可読であるか、datetime 属性で機械可読な値を補う必要があります。
a11y/unverified-id-ref 🔵 info オプトイン: 合成が完全には解決していないルート上で、検証できない id 参照を検出します。
a11y/use-list 🔵 info プレーンテキストに入力された行頭記号は、本物のリスト要素に置き換えるべきです。