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

correctness/unmutated-state · 変更されない $state

一度も変更しない $state は、const(または $state.raw)で十分です。

重大度: info · カテゴリ: correctness

チェック内容

コンポーネント内のどこでも書き込まれず、外部にも渡らない let x = $state(...) を検出します。再代入も、変更(x.a = …x.push())も、バインド(bind:value={x})も、関数やコンポーネントへの受け渡しもないものです。

use:transition:animate: ディレクティブに渡した state も検出しません。受け取った側が参照を保持し、静的解析には見えない形で変更しうるためです。

なぜ重要か

変更されない $state は、使わないリアクティビティ(deep proxy と依存追跡)のコストを払っています。const の方が明確で軽量です。値をまるごと差し替えるだけ(プロパティは変更しない)なら $state.raw が適します。

修正方法

<script>
  // let title = $state('Dashboard'); の代わりに
  const title = 'Dashboard';

  // まるごと差し替えるが deep mutate しないなら $state.raw:
  let data = $state.raw(initial);
  data = nextValue;
</script>

モードによる違い

ありません。このルールが読むのは同じ .svelte / .ts のソースファイルなので、CLI、Vite プラグインのビルド、ライブダッシュボードの静的ベースラインのいずれでも結果は同一で、レンダリング済み HTML の解析で再評価されることもありません。--route で実行範囲を絞ると、このルールは動きません。コンポーネントスコープのルールには、検出を紐づけるルートが無いためです。

無効化

個別に抑制するには、対象行の直前に <!-- svelte-vitals-disable-next-line correctness/unmutated-state --> を置きます。ルールごと無効化するには、次のように設定します。

export default {
  rules: {
    'correctness/unmutated-state': 'off'
  }
};