TanStack Router 基于文件的路由

TanStack Router 的大部分文档都是基于"基于文件的路由"这一视角编写的,旨在帮助你深入理解如何配置它以及其背后的技术细节。虽然基于文件的路由是配置 TanStack Router 的首选和推荐方式 ,但如果你愿意,也可以使用 基于代码的路由

什么是基于文件的路由?

基于文件的路由是一种利用文件系统来配置路由的方式。你不需要通过代码定义路由结构,而是通过一系列代表应用程序路由层级的文件和目录来定义路由。这带来了许多好处:

  • 简单性 (Simplicity):对于新手和经验丰富的开发者来说,基于文件的路由都在视觉上更直观且易于理解。

  • 组织性 (Organization):路由的组织方式直接镜像了应用程序的 URL 结构。

  • 可扩展性 (Scalability):随着应用程序的增长,基于文件的路由使得添加新路由和维护现有路由变得容易。

  • 代码分割 (Code-Splitting):基于文件的路由允许 TanStack Router 自动对路由进行代码分割,以获得更好的性能。

  • 类型安全 (Type-Safety):基于文件的路由通过自动生成和管理路由的类型链接,极大提升了类型安全的上限,而在基于代码的路由中,这通常是一个繁琐的过程。

  • 一致性 (Consistency):基于文件的路由强制执行一致的路由结构,使得维护、更新应用程序以及在不同项目间迁移变得更加容易。

/ 还是 .

虽然目录长期以来一直用于表示路由层级,但基于文件的路由引入了一个额外的概念:在文件名中使用 . 字符来表示路由嵌套。这允许你避免为少量深度嵌套的路由创建目录,同时继续为更广泛的路由层级使用目录。让我们看一些例子!

目录路由 (Directory Routes)

目录可用于表示路由层级,这对于将多个路由组织成逻辑组以及减少大量深度嵌套路由的文件名长度非常有用。

请看下面的例子:

文件名 (Filename) 路由路径 (Route Path) 组件输出 (Component Output)
ʦ __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
┄ ʦ 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>
📂 account
┄ ʦ route.tsx /account <Root><Account>
┄ ʦ overview.tsx /account/overview <Root><Account><Overview>

扁平路由 (Flat Routes)

扁平路由赋予你使用 . 来表示路由嵌套层级的能力。

当你有大量独特的深度嵌套路由,并且希望避免为每一个路由都创建目录时,这非常有用:

请看下面的例子:

文件名 (Filename) 路由路径 (Route Path) 组件输出 (Component Output)
ʦ __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>
ʦ account.tsx /account <Root><Account>
ʦ account.overview.tsx /account/overview <Root><Account><Overview>

混合扁平路由和目录路由

极有可能 100% 的目录结构或 100% 的扁平路由结构都不完全适合你的项目,这就是为什么 TanStack Router 允许你将扁平路由和目录路由混合使用,从而创建一个结合两者优点的路由树。

请看下面的例子:

文件名 (Filename) 路由路径 (Route Path) 组件输出 (Component Output)
ʦ __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>
ʦ account.tsx /account <Root><Account>
ʦ account.overview.tsx /account/overview <Root><Account><Overview>

扁平路由和目录路由可以混合在一起,以便在合理的地方结合两者的优点来创建路由树。

!TIP

如果你发现默认的基于文件的路由结构不符合你的需求,你始终可以使用 虚拟文件路由 (Virtual File Routes) 来控制路由的来源,同时仍然享受基于文件路由带来的出色性能优势。

开始使用基于文件的路由

要开始使用基于文件的路由,你需要配置你项目的打包工具(Bundler)以使用 TanStack Router Plugin 或 TanStack Router CLI。

要启用基于文件的路由,你需要在使用 React 的同时使用受支持的打包工具。请查看下面的配置指南,看看你的打包工具是否在列表中。

当通过受支持的打包工具使用 TanStack Router 的基于文件的路由时,插件将通过打包工具的开发和构建过程自动生成你的路由配置。这是使用 TanStack Router 路由生成功能最简单的方法。

相关推荐
0思必得05 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5166 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino6 小时前
图片、文件的预览
前端·javascript
layman05288 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔8 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李8 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN8 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒8 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库8 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052478 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫