NarraLeaf
NarraLeaf DesktopRenderer

Page Router

了解 NarraLeaf CLI 扫描的 renderer pages 目录

CLI 会扫描 renderer/pages,并生成传给 render() 的 route tree。页面会通过生成的 RootPages 组件在 NarraLeaf-React player 内渲染

文件规则

  • index.tsxindex.jsxindex.tsindex.js 处理目录的默认页面
  • layout.tsxlayout.jsxlayout.tslayout.js 包裹该目录下的子页面
  • pages 根目录下的 error.tsxerror.jsxerror.tserror.js 会成为全局错误 fallback
  • 其他文件按文件名成为页面
  • [name] 这样的目录名会成为 slug 参数
renderer/pages
├── index.tsx
├── save.tsx
├── settings.tsx
├── error.tsx
└── gallery
    ├── layout.tsx
    ├── index.tsx
    └── [id].tsx

Layouts

layout 模块导出一个接收 children 的 React 组件

renderer/pages/gallery/layout.tsx
import type { ReactNode } from "react";

export default function GalleryLayout({ children }: { children: ReactNode }) {
    return <section>{children}</section>;
}

Pages

page 模块导出一个 React 组件

renderer/pages/save.tsx
import { useSavedGames } from "narraleaf/renderer";

export default function SavePage() {
    const { results } = useSavedGames();

    return <pre>{JSON.stringify(results, null, 2)}</pre>;
}

Slugs

[ 开头并以 ] 结尾的目录名会被视为 slug 片段。可接受的 slug 名称字符包括字母、数字、下划线、连字符和常见 CJK 字符

renderer/pages/gallery/[id].tsx

路由冲突

一个目录可以使用以下两种方式之一:

  • 本地 index 文件
  • 与目录同名的兄弟文件

不要为同一路由同时使用两者

renderer/pages/gallery.tsx
renderer/pages/gallery/index.tsx

CLI 会把这视为路由冲突,因为两个文件都会处理 /gallery

本页目录