Vize

SSR ルール

このページに、各ルールの目的・前提・設定と、省略のない悪い例・良い例をまとめています。変更箇所は行の色で示します。コードをコピーすると、ソースコード全体を取得できます。各例に現在の対応範囲も明記しています。

ルール 例 目的
ssr/no-browser-globals-in-ssr 悪い · 良い SSR で実行されるコードのブラウザー専用グローバル参照を検出します。
ssr/no-hydration-mismatch 悪い · 良い サーバーとクライアントで一致しないテンプレート値を検出します。

全ルール · ルールのオプション · ESLint 移行対応表 · プロジェクトの検査 · 子への属性の継承

ssr/no-browser-globals-in-ssr

SSR で実行されるコードのブラウザー専用グローバル参照を検出します。

悪い例 · 良い例

既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。

設定(Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "ssr/no-browser-globals-in-ssr": "warn"
      }
    },
  },
});
vp run lint

悪い

setup の実行時に window.innerWidth を直接読みますが、サーバー上のコンポーネント実行時には window が存在しません。

<script setup lang="ts">
const width = window.innerWidth;
</script>

良い

幅を ref(0) で初期化し、ブラウザー API の参照をクライアントで実行される onMounted に移します。これにより、SSR の setup ではブラウザー API を参照しません。

<script setup lang="ts">
const width = ref(0);

onMounted(() => {
  width.value = window.innerWidth;
});
</script>

良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。

実装 · 全ルール

ssr/no-hydration-mismatch

サーバーとクライアントで一致しないテンプレート値を検出します。

悪い例 · 良い例

既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。

設定(Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "ssr/no-hydration-mismatch": "warn"
      }
    },
  },
});
vp run lint

悪い

テンプレートが描画時に Math.random() を評価し、同じ段落でもサーバーとクライアントで異なるテキストになり得ます。

<template>
  <p>{{ Math.random() }}</p>
</template>

良い

新たな乱数ではなく、安定した seed の状態を段落に描画します。この Nuxt 形式の例では useState が状態を共有し、初期値も定数 "stable" です。

<script setup lang="ts">
const seed = useState("seed", () => "stable");
</script>

<template>
  <p>{{ seed }}</p>
</template>

良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。

実装 · 全ルール