内容提要
作者将博客从SvelteKit 1.x升级至2.x,解决依赖兼容性和Node.js版本过时问题。主要更新依赖、调整路由结构(如+layout.svelte)、采用PageServerLoad和prerender配置支持SSG,并修复Vercel部署中searchParams不可用问题,优化部署流程。
延伸解读
升级动因:依赖与运行时的双重压力
作者升级SvelteKit并非单纯追求新功能,而是被两个实际问题推动:一是依赖兼容性错误(如vite-plugin-svelte与svelte版本不匹配),二是Vercel即将停止支持Node.js 16.x,若不升级将无法继续部署。这提醒开发者,技术栈升级往往源于外部环境变化,而非主动选择。
路由与数据加载的Breaking Changes
SvelteKit 2对文件路由命名和load函数做了重大调整:布局文件从_layout.svelte改为+layout.svelte,错误页改为+error.svelte,load函数从context="module"迁移到+page.server.js中的PageServerLoad。这些变化要求开发者重构现有代码,但官方迁移指南提供了清晰路径,降低了升级成本。
SSG与SSR的灵活配置
作者采用prerender = 'auto'策略,既保留静态生成(SSG)的构建效率,又为未来动态内容预留SSR能力。这种混合模式适合内容型网站,但需注意Vercel对PageServerLoad中searchParams的限制,作者因此调整了API接口,避免在服务端依赖URL参数。
Q&A
为什么需要将博客从 SvelteKit 1.x 升级到 2.x?
因为旧版依赖存在兼容性问题,例如 @sveltejs/vite-plugin-svelte 直接依赖 svelte 导致报错,且 Vercel 上使用的 Node.js 16.x 将于 2025 年 1 月 31 日停止支持,需要升级到 20.x。
SvelteKit 2 中路由文件命名有哪些变化?
旧版使用 _layout.svelte、_error.svelte、index@page.svelte,新版改为 +layout.svelte、+error.svelte、+page.svelte。
SvelteKit 2 中 load 函数如何使用?
旧版在 <script context="module"> 中定义 load,新版改为在 +page.server.js 中导出 load 函数,并通过 data 属性传递给页面组件。
如何配置 SvelteKit 2 实现 SSG(静态站点生成)?
在页面组件中导出 prerender 配置,例如 export const prerender = 'auto';,这样构建时会生成静态页面,同时保留 SSR 的扩展性。
在 Vercel 部署时遇到 searchParams 不可用的问题如何解决?
由于 Vercel 对 PageServerLoad 支持有限,searchParams 在服务器端不可用,因此需要移除对 url.searchParams 的依赖,改为直接使用固定参数。
SvelteKit 2 中如何生成 RSS 等静态文件?
在 src/routes/rss.xml/+server.js 中定义 GET 函数,返回 Response 对象,并设置 export const prerender = true; 使其在构建时生成静态文件。
升级 SvelteKit 2 后,package.json 中的脚本有哪些变化?
旧版使用 svelte-kit dev/build/preview,新版改为 vite dev/build/preview,并且 svelte-kit sync 不再默认需要。