← ./articles-ja

Tauri WebViewのlocalStorageアクセスはtry/catchで守る

localStorage は安全に見えますが、起動時にthrowするとアプリ全体が止まります。

Tauriアプリでは、WebViewの初期化、security context、storage状態、shutdown timingが通常のbrowser tabと違うことがあります。first-run checkが localStorage を直接読んでthrowすると、UIが復旧する前に壊れます。

storage accessは小さなsafe helperで包みます。

症状: render前にstartupが失敗する

よくある場所です。

  • onboardingを表示するか判断する
  • themeやlayout preferenceを読む
  • 前回session flagを読む
  • localStorage.getItem() が同期的にthrowする
  • blank screenや初期化失敗になる

同期throwなので、後段のasync fallbackでは拾えないことがあります。

readはsafe helper経由にする

小さなwrapperを作ります。

export function getSafeStorage(key: string, defaultValue = ""): string {
  try {
    return localStorage.getItem(key) ?? defaultValue;
  } catch (error) {
    console.warn(`localStorage read failed for ${key}:`, error);
    return defaultValue;
  }
}

startup codeではこう使います。

const onboardingShown = getSafeStorage("onboarding-shown", "false") === "true";

storage failureは「defaultを使う」になり、「app shellが壊れる」ではなくなります。

writeも守る

writeもquota、permission、teardown timingで失敗します。

export function setSafeStorage(key: string, value: string): boolean {
  try {
    localStorage.setItem(key, value);
    return true;
  } catch (error) {
    console.warn(`localStorage write failed for ${key}:`, error);
    return false;
  }
}

軽いpreferenceなら false を返すだけで十分な場合があります。重要な状態なら、recoverable warningを出すかRust-backed storeへ移します。

重要データをlocalStorageだけに置かない

localStorage に向くものです。

  • onboarding shown flag
  • theme preference
  • last selected tab
  • 小さなlayout choice

向かないものです。

  • license state
  • project data
  • unsaved editor contents
  • shutdown raceに耐えるべきsession recovery

desktop appの重要状態は、Tauri commandでapp data fileへ保存するほうが安全です。

fallbackは決定的にする

fallbackは undefined ではなく、実際のdefaultにします。

const theme = getSafeStorage("theme", "system");
const sidebarCollapsed = getSafeStorage("sidebar-collapsed", "false") === "true";

storage failure時のUIもtestできます。

検証チェック

  • storage read成功
  • storage readがthrow
  • storage writeがthrow
  • storage失敗時もfirst-run UIがrenderされる
  • preferenceがdocumented defaultに戻る
  • 重要データがlocalStorageだけに保存されていない

参考