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だけに保存されていない