全书目录

第三十篇:SvelteKit 完全指南 —— 轻量反应式剧场宇宙

第六章:`+layout` —— 一整层舞台共用的固定布景

1 分钟 164 字 第 544 / 962 个阅读单元

很多场景不是完全独立的。

比如你的剧院网站,所有页面都可能共用:

  • 顶部导航
  • 登录状态
  • 当前城市
  • 票务入口
  • 页脚

这就是 +layout 的职责。
它不是“顺手套一层壳”,而是共享舞台骨架

svelte
<!-- src/routes/+layout.svelte -->
<script lang="ts">
  import type { LayoutProps } from './$types';
  let { data, children }: LayoutProps = $props();
</script>

<header class="shell">
  <a href="/">星尘剧场</a>

  <nav>
    <a href="/plays">剧目</a>
    <a href="/box-office">订票</a>
  </nav>

  {#if data.user}
    <strong>{data.user.name}</strong>
  {:else}
    <a href="/login">登录</a>
  {/if}
</header>

<main>
  {@render children()}
</main>
ts
// src/routes/+layout.server.ts
import type { LayoutServerLoad } from './$types';

export const load: LayoutServerLoad = async ({ locals }) => {
  return {
    user: locals.user ?? null
  };
};

把它翻成剧场语言:

text
+layout.svelte        = 大舞台固定框架
+layout.server.ts     = 每次开场前给这层舞台准备公共信息

更重要的是,layout 会向下覆盖子目录。
这意味着剧院大厅、二楼小剧场、后台管理区,都可以有自己的局部布景层。