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

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

背景

最近在做一个新项目,使用 vite 和 react-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...

相关推荐
生活的囚徒3 小时前
从一堆Excel到一套系统:项目管理+研发管理双门户的落地实践
react.js
ZhengEnCi1 天前
React 19 加 Vite 6 企业级前端项目目录结构:无路由 SPA、zustand 与 Tailwind 4 的分层架构指南
react.js
用户298698530141 天前
React 前端实现 Excel 与 CSV 互转:基于 WebAssembly 的浏览器端方案
javascript·react.js·excel
Highcharts.js3 天前
Highcharts Orbit 完全指南:把每一张图表变成交互式分析工具
react.js·前端框架·highcharts·orbit·使用指南·ai 图表·交互式分析工具
鸿蒙开发3 天前
小程序存档写到一半怎么办?双槽保存与损坏恢复实战
前端·javascript·react.js
FungLeo4 天前
成为全栈·Vue 管理后台篇·Vue3 + Vite + Naive UI:后台工程基座怎么搭
前端·vue.js·ui·typescript·vite·前端工程化·biome
周大侠0054 天前
从 Webpack 到 Vite:30 个存量项目的迁移踩坑与灰度方案
webpack·vite
古茗前端团队5 天前
由 key 引发的思考
前端·javascript·react.js
晓得迷路了6 天前
栗子前端技术周刊第 153 期 - Vitest 5.1、Remix v3.2、Node.js 27 Alpha...
前端·javascript·vite
用户298698530148 天前
React 前端将 Excel 工作表导出为图片的技术实践
javascript·react.js·excel