记录第一个 vite 插件 vite-plugin-react-router-pages

最近整了个 vite 插件 vite-plugin-react-router-pages,解决 react 项目中的约定式路由。

背景

最近在做一个新项目,使用 vitereact-router-v6。那么可能会遇到这些问题

  • <Route path="xxx"PageRoutes.XXX 等会存在一堆样板代码。而且一旦更新,要改动的地方也多。
  • react-router 官方的 typescript 支持很弱,仅仅是其 api 的 typescript。但其路由常量等周边使用的时候就很弱。

于是想要搞一个基于文件系统的约定式路由,一开始的设想是这样:

1 基于文件系统的约定式路由

2 页面文件是 index.page.tsx(比 index.tsx 更语义化和兼容点)

3 布局文件是 layout.tsx。

4 样板代码能避免则避免。

5 typescript 友好,最起码体现在页面地址有 typescript 支持。

翻了下插件生态,比较好的是 vite-plugin-pages github.com/hannoeru/vi...,但是但是但是

1 作者以 Vue 为主,其 React 是 experimental 阶段,所以不太敢用。

2 页面组件和布局组件的神奇命名方式,个人认为是冲突的。如 页面组件是 user/index.tsx,布局组件是 user.tsx。这从模块的角度看命名是一个东西,作者却还采用这种方式。

所以真心不敢用。

造轮子

那就自己造轮子吧,貌似不难。

1 了解约定是路由

看下社区是怎么做的

貌似没有统一,各有各的约定。 没关系,我们也抄抄作业。

梳理下是

  • 约定页面目录./src/pages
  • 页面文件定义成 index.page.tsx。有些框架采用 index.tsx,个人觉得容易和现有的约定冲突,因为现有就有很多 index.tsx,但其可能并不是页面组件。
  • 布局组件定义成 layout.tsx。布局组件确定了当前的布局和所有子页面的布局。
  • 动态路由定义成 [uuid].tsx。会转换成路径的 /:uuid

2 不用插件怎么写

在没有插件的时候代码怎么写,这个得写的清晰。 最后再以此为模板,通过插件生成。

这里就不列具体代码了,梳理下来应该有那么几点

  • 通过 import.meta.glob 识别文件
  • 特别react-router以下概念:Dynamic Segments、Layout Routes、index、lazy
  • 以上信息你可以封装出类似这样的代码 react-pages.tsx

3 了解插件怎么写

官方文档 vite plugin cn.vitejs.dev/guide/api-p...

别人怎么写插件的,看别人源码 github.com/hannoeru/vi...

梳理下是

  • 插件的约定
  • 通过插件实现虚拟文件
  • 通过插件生成类型文件 react-pages.d.ts
  • 配置 server 监听文件变化,重新生成。
  • 插件如何接收配置

4 完善工程化部分

梳理下是

  • 提供完善的 README.md
  • 提供完善的案例,即 example/react
  • 打包,这里使用了 unbuild

5 上成品

代码都在这里了 github.com/liyatang/vi...

最后

目前的实现已经足够覆盖作者的使用场景了,如果你有更多诉求,可 PR 或者联系我。

资料

vite-plugin-pages github.com/hannoeru/vi...

vite plugin 文档 cn.vitejs.dev/guide/api-p...

相关推荐
天蓝色的鱼鱼8 小时前
前端开发者的组件设计之痛:为什么我的组件总是难以维护?
前端·react.js
XiaoSong12 小时前
从未有过如此丝滑的React Native开发体验:EAS开发构建完全指南
前端·react.js
用户76787977373213 小时前
后端转全栈之Next.js数据获取与缓存
react.js·next.js
小仙女喂得猪16 小时前
2025 Android原生开发者角度的React/ReactNative 笔记整理
react native·react.js
艾小码17 小时前
为什么你的页面会闪烁?useLayoutEffect和useEffect的区别藏在这里!
前端·javascript·react.js
骑自行车的码农17 小时前
【React用到的一些算法】游标和栈
算法·react.js
小高00717 小时前
🔍说说对React的理解?有哪些特性?
前端·javascript·react.js
江城开朗的豌豆19 小时前
从生命周期到useEffect:我的React函数组件进化之旅
前端·javascript·react.js
江城开朗的豌豆19 小时前
React组件传值:轻松掌握React组件通信秘籍
前端·javascript·react.js
遂心_1 天前
深入理解 React Hook:useEffect 完全指南
前端·javascript·react.js