【Svelte】本地正常,线上报错的奇怪问题

这个问题产生的原因是:在 Svelte 5 中,你不能在 +page.server.tsload 函数中使用 $app/state (如 page) 或 $app/stores

错误信息 lifecycle_outside_component 表明你尝试在 Svelte 组件生命周期之外(即在纯服务器端代码中)访问了 Svelte 的响应式状态。

为什么会报错?

$app/state 中的 page 是为 UI 组件 设计的,用于在浏览器中或组件渲染期间获取页面状态。而 +page.server.tsload 函数运行在服务器端,它本身就是一个获取数据的上下文,SvelteKit 已经通过参数(event 对象)把你需要的所有数据传给你了。

修复方案

直接从 load 函数的参数中获取 params,不要从 $app/state 导入。

修改后的代码:

typescript 复制代码
import type { PageServerLoad } from './$types';
import { API } from '$lib/api';
// 1. 删除这一行,不要在 server load 中使用 $app/state
// import { page } from '$app/state'; 

export const load: PageServerLoad = async ({ fetch, request, params }) => {
  let retData = {} as any;
  
  // 2. 直接使用参数里的 params
  const url = `${API.stories}/${params.id}`; 
  
  retData.url = url;
  return retData;
}

为什么本地正常,上线报错?

这种现象通常与 SvelteKit 的编译优化和运行环境有关:

  1. 开发模式 (Dev Mode): Vite 有时会因为模块热更新或单例处理比较宽松,或者在 SSR 渲染过程中,某种巧合下全局上下文还能访问到。
  2. 生产环境 (Production): 生产环境会进行严格的 Tree-shaking 和代码分割。$app/state 在服务器端并没有"当前活跃页面"的概念,它是基于 Svelte 的 Context API 实现的,而 load 函数执行时并没有进入组件树,所以 Context 为空,触发 Svelte 5 的安全保护机制报错。

总结

load 函数中,请始终使用参数提供的对象:

  • 获取路由参数:使用 params
  • 获取 URL 信息:使用 url (例如 url.searchParams)
  • 获取请求头:使用 request
  • 获取本地存储/状态:禁止使用 ,应通过 cookies 或数据库查询。
相关推荐
cup111 天前
[Full Clock 技术复盘] 二、SvelteKit 实战避坑指南:PWA、SSR 样式断裂、持久化防抖
i18n·ssr·svelte·localstorage·pwa
Anesthesia丶9 天前
Vite + Svelte + shadcn-svelte 最小化 Demo+Vue3语法对比总结
vue·vite·svelte·shadcn-svelte
cup1111 天前
[开源] 全屏时钟 / Full Clock:放弃 time.is,用 Svelte 5 写了一个极致纯净的全屏时钟,解决秒数焦虑
开源·工具·时钟·效率·svelte
天渺工作室2 个月前
Svelte/SvelteKit 多语言配置指南
前端·svelte
qq_172805592 个月前
Svelte 5 教学指南
svelte
belldeep2 个月前
nodejs:Vite + Svelte + ts 入门示例
typescript·node.js·ts·vite·svelte
天天打码5 个月前
Svelte-无虚拟DOM、极致性能的现代高性能Web开发框架!
前端·node.js·vue·svelte
ayuday5 个月前
Svelte - 现代高性能Web开发框架!轻量级‌、响应式、编译时优化‌特点
nodejs·svelte
亮子AI5 个月前
【Svelte】怎样将 Docusaurus 网站部署到 Svelte 网站的子路径 /docs 下?
svelte·docusaurus