You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SvelteKit中+page.ts用params.slug获取localStorage数据遇404问题

解决SvelteKit中刷新/手动访问页面无法获取localStorage数据的404问题

问题根源

SvelteKit默认启用服务器端渲染(SSR),+page.ts中的load函数会在服务器端执行,但localStorage是浏览器专属API,服务器环境无法访问。你的persisted store在服务器端会使用默认的空数组,导致find找不到对应slug的笔记,直接抛出404错误。

解决方案

方案1:仅在客户端执行数据查找

通过browser变量判断当前环境,服务器端返回占位数据,客户端再实际获取localStorage中的内容:

修改+page.ts:

import { browser } from '$app/environment';
import { get } from 'svelte/store';
import { notedata } from '$lib/store'; // 替换为你的store实际路径
import { error } from '@sveltejs/kit';

/** @type {import('./$types').PageLoad} */
export async function load({ params }) {
    // 服务器端返回空,避免提前抛出404
    if (!browser) {
        return { result: null };
    }

    const note = get(notedata).find(e => e.id === params.slug);
    
    if (note) {
        return { result: note };
    }

    // 客户端环境才抛出404
    error(404, 'Not found');
}

修改+page.svelte,处理客户端数据加载:

<script lang="ts">
    import { onMount } from 'svelte';
    import { page } from '$app/stores';
    import { get } from 'svelte/store';
    import { notedata } from '$lib/store';
    import { error } from '@sveltejs/kit';

    export let data;
    let note = data.result;

    onMount(() => {
        if (!note) {
            const targetSlug = $page.params.slug;
            note = get(notedata).find(e => e.id === targetSlug);
            
            if (!note) {
                error(404, 'Not found');
            }
        }
    });
</script>

{#if note}
    <h1>{note.title}</h1>
    <p>{note.note}</p>
    <small>创建于:{note.dateCreated}</small>
{:else}
    <p>加载中...</p>
{/if}

方案2:禁用当前页面的SSR

如果你的笔记页面不需要SEO,可以直接设置为纯客户端渲染,让load函数仅在浏览器环境执行,直接访问localStorage:

修改+page.ts:

// 禁用服务器端渲染
export const ssr = false;

import { get } from 'svelte/store';
import { notedata } from '$lib/store';
import { error } from '@sveltejs/kit';

/** @type {import('./$types').PageLoad} */
export async function load({ params }) {
    const note = get(notedata).find(e => e.id === params.slug);
    
    if (note) {
        return { result: note };
    }

    error(404, 'Not found');
}

方案对比

  • 方案1:保留SSR优势(SEO、首屏加载快),但需要额外处理客户端数据补全和加载状态。
  • 方案2:实现简单,无需额外逻辑,但失去SSR优势,适合完全依赖客户端存储的页面。

内容的提问来源于stack exchange,提问作者boredcodebyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:55:20