TanStack Router 的大部分文档都是基于文件路由编写的,旨在帮助您更详细地了解如何配置基于文件的路由及其背后的技术实现细节。虽然文件路由是配置 TanStack Router 的首选和推荐方式,但如果您更倾向于代码方式,也可以使用基于代码的路由。
文件路由是一种利用文件系统来配置路由的方式。您无需通过代码定义路由结构,而是通过一系列代表应用路由层级的文件和目录来定义路由。这种方式具有以下优势:
虽然目录长期被用于表示路由层级,但文件路由引入了在文件名中使用 . 字符来表示路由嵌套的新概念。这样您既可以避免为少量深层嵌套路由创建目录,又能继续用目录组织宽泛的路由层级。下面通过示例说明!
目录可用于表示路由层级,既能将多个路由按逻辑分组,也能减少深层嵌套路由的文件名长度。
参考以下示例:
文件名 | 路由路径 | 组件输出 |
---|---|---|
ʦ __root.tsx | <Root> | |
ʦ index.tsx | / (精确匹配) | <Root><RootIndex> |
ʦ about.tsx | /about | <Root><About> |
ʦ posts.tsx | /posts | <Root><Posts> |
📂 posts | ||
┄ ʦ index.tsx | /posts (精确匹配) | <Root><Posts><PostsIndex> |
┄ ʦ $postId.tsx | /posts/$postId | <Root><Posts><Post> |
📂 posts_ | ||
┄ 📂 $postId | ||
┄ ┄ ʦ edit.tsx | /posts/$postId/edit | <Root><EditPost> |
ʦ settings.tsx | /settings | <Root><Settings> |
📂 settings | <Root><Settings> | |
┄ ʦ profile.tsx | /settings/profile | <Root><Settings><Profile> |
┄ ʦ notifications.tsx | /settings/notifications | <Root><Settings><Notifications> |
ʦ _pathlessLayout.tsx | <Root><PathlessLayout> | |
📂 _pathlessLayout | ||
┄ ʦ route-a.tsx | /route-a | <Root><PathlessLayout><RouteA> |
┄ ʦ route-b.tsx | /route-b | <Root><PathlessLayout><RouteB> |
📂 files | ||
┄ ʦ $.tsx | /files/$ | <Root><Files> |
扁平路由允许使用 . 表示路由嵌套层级。当存在大量独特的深层嵌套路由时,这种方式能避免为每个路由创建目录:
参考以下示例:
文件名 | 路由路径 | 组件输出 |
---|---|---|
ʦ __root.tsx | <Root> | |
ʦ index.tsx | / (精确匹配) | <Root><RootIndex> |
ʦ about.tsx | /about | <Root><About> |
ʦ posts.tsx | /posts | <Root><Posts> |
ʦ posts.index.tsx | /posts (精确匹配) | <Root><Posts><PostsIndex> |
ʦ posts.$postId.tsx | /posts/$postId | <Root><Posts><Post> |
ʦ posts_.$postId.edit.tsx | /posts/$postId/edit | <Root><EditPost> |
ʦ settings.tsx | /settings | <Root><Settings> |
ʦ settings.profile.tsx | /settings/profile | <Root><Settings><Profile> |
ʦ settings.notifications.tsx | /settings/notifications | <Root><Settings><Notifications> |
ʦ _pathlessLayout.tsx | <Root><PathlessLayout> | |
ʦ _pathlessLayout.route-a.tsx | /route-a | <Root><PathlessLayout><RouteA> |
ʦ _pathlessLayout.route-b.tsx | /route-b | <Root><PathlessLayout><RouteB> |
ʦ files.$.tsx | /files/$ | <Root><Files> |
完全采用目录或扁平路由结构很可能不适合您的项目,因此 TanStack Router 允许混合使用两种方式,在适当场景下各取所长:
参考以下示例:
文件名 | 路由路径 | 组件输出 |
---|---|---|
ʦ __root.tsx | <Root> | |
ʦ index.tsx | / (精确匹配) | <Root><RootIndex> |
ʦ about.tsx | /about | <Root><About> |
ʦ posts.tsx | /posts | <Root><Posts> |
📂 posts | ||
┄ ʦ index.tsx | /posts (精确匹配) | <Root><Posts><PostsIndex> |
┄ ʦ $postId.tsx | /posts/$postId | <Root><Posts><Post> |
┄ ʦ $postId.edit.tsx | /posts/$postId/edit | <Root><Posts><Post><EditPost> |
ʦ settings.tsx | /settings | <Root><Settings> |
ʦ settings.profile.tsx | /settings/profile | <Root><Settings><Profile> |
ʦ settings.notifications.tsx | /settings/notifications | <Root><Settings><Notifications> |
扁平路由和目录路由可以混合使用,在适合的场景发挥各自优势。
Tip
如果默认的文件路由结构不符合您的需求,您可以使用虚拟文件路由来控制路由来源,同时仍能享受文件路由的强大性能优势。
要开始使用文件路由,您需要配置项目的打包器以使用 TanStack Router 插件或 TanStack Router CLI。
启用文件路由需要 React 配合受支持的打包器使用。请查看以下配置指南中是否包含您使用的打包器:
通过受支持的打包器使用 TanStack Router 的文件路由时,我们的插件会在打包器的开发和构建流程中自动生成路由配置。这是使用 TanStack Router 路由生成功能的最简单方式。
如果您的打包器尚未支持,可以通过 Discord 或 GitHub 联系我们。在此之前也无需担心!您仍然可以使用 @tanstack/router-cli 包来生成路由树文件。
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.