router
这一部分讲 dioxus-router(packages/router/src,约 2700 行)、dioxus-router-macro(packages/router-macro/src,约 2700 行)和 dioxus-history(约 400 行),外加散在 dioxus-web、dioxus-fullstack-core、dioxus-server 里的三个 History 实现和 404 的处理。
router 没有运行时的路由表。路由是一个枚举,#[derive(Routable)] 在编译期生成「字符串 → 枚举」「枚举 → 字符串」「枚举 → 第几层的组件」三段代码;运行时只做三件事:从 History 读当前路由字符串并解析,按层号把组件交给各个 Outlet,导航时改 History 并让读过路由的组件重跑。
- Routable:derive 宏展开出的错误类型、
Display、render和FromStr;匹配树按「静态段 → 普通路由 → catch-all」排序,同档按声明顺序;RouteParseError的原文;尾斜杠两种都接受;/、%、&不转义,带这些字符的值往返会变样。 - Router 运行时:
RouterContext不缓存路由、真值在History里;WebHistory、MemoryHistory、FullstackHistory的分工和水合时的初始路由;Outlet用 context 数层;Link只拦无修饰键的左键点击;路由不匹配时 SSR 回 404,catch-all 的 404 页面要自己设状态码。
flowchart TB enumdef["路由枚举"] -->|"derive 宏"| gen["FromStr Display render"] hist["History"] -->|"当前路由字符串"| rctx[RouterContext] gen --> rctx rctx --> outlet["Outlet 第 n 层"] outlet -->|"render n"| comp["layout 或页面组件"] link[Link] -->|"push"| hist rctx -->|"解析失败"| e404["SSR 404"]
服务端的路由(server function、静态文件、fallback)是 axum 的 Router,和这里的 Router 组件无关,见一次请求的渲染。
💬 关联讨论
发起讨论加载中...