UNPKG

@gulibs/vgrove-autoroutes

Version:

🚀 基于文件系统的自动路由生成 Vite 插件,完整支持 React Router v7+ 和现代化的路由模式

313 lines (239 loc) 7.61 kB
# VGrove AutoRoutes > 🚀 零配置的文件系统自动路由生成器,为 React Router v7+ 打造 [![npm version](https://badge.fury.io/js/@gulibs%2Fvgrove-autoroutes.svg)](https://badge.fury.io/js/@gulibs%2Fvgrove-autoroutes) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ## ✨ 为什么选择 VGrove AutoRoutes? **告别手动路由配置的繁琐!** VGrove AutoRoutes 基于文件系统自动生成路由,让你专注于业务逻辑: - 🔥 **零配置启动** - 放入文件即生成路由,无需手动配置 - ⚡ **完美热更新** - 文件变化实时同步,开发体验丝滑 - 🎯 **智能识别** - 自动区分页面、布局、数据加载等文件类型 - 📦 **代码分割** - 内置 React.lazy 支持,自动优化性能 - 🛡️ **类型安全** - 完整 TypeScript 支持,智能提示无忧 ## 🚀 快速开始 ### 安装 ```bash npm install @gulibs/vgrove-autoroutes ``` ### 配置 ```typescript // vite.config.ts import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import autoRoutes from '@gulibs/vgrove-autoroutes'; export default defineConfig({ plugins: [ react(), autoRoutes({ dirs: [{ dir: './src/pages', baseRoute: '/' }], dynamic: true // 启用代码分割 }) ] }); ``` ### 创建页面 ``` src/pages/ ├── page.tsx # / 路由 ├── about.page.tsx # /about 路由 ├── users/ │ ├── page.tsx # /users 路由 │ ├── loader.tsx # 数据加载(不生成路由) │ └── [id]/ │ ├── page.tsx # /users/:id 路由 │ └── action.tsx # 表单处理(不生成路由) └── layout.tsx # 根布局 ``` ### 使用路由 ```typescript // src/main.tsx import React from 'react'; import ReactDOM from 'react-dom/client'; import { createBrowserRouter, RouterProvider } from 'react-router'; import { routes } from '@gulibs/react-autopages'; const router = createBrowserRouter(routes); ReactDOM.createRoot(document.getElementById('root')!).render( <React.StrictMode> <RouterProvider router={router} /> </React.StrictMode> ); ``` ## 📁 文件约定 ### 路由文件(生成路由) | 文件名 | 路由路径 | 说明 | |--------|----------|------| | `page.tsx` | `/` | 目录首页 | | `about.page.tsx` | `/about` | 扁平风格页面 | | `users.settings.page.tsx` | `/users/settings` | 多层路由 | | `[id].page.tsx` | `/:id` | 动态路由 | | `[...slug].page.tsx` | `/*` | 通配符路由 | | `layout.tsx` | - | 嵌套布局组件 | ### 辅助文件(不生成路由) | 文件名 | 功能 | 说明 | |--------|------|------| | `loader.tsx` | 数据加载 | 为同名路由提供数据 | | `action.tsx` | 表单处理 | 处理 POST/PUT/DELETE 请求 | | `middleware.ts` | 中间件 | 路由级别的中间件逻辑 | | `error.tsx` | 错误边界 | 错误处理组件 | | `loading.tsx` | 加载状态 | 加载指示器组件 | ## ⚙️ 配置选项 ```typescript interface AutoRoutesOptions { // 路由目录配置 dirs: Array<{ dir: string; // 扫描目录 baseRoute?: string; // 基础路由前缀 include?: string[]; // 包含模式 exclude?: string[]; // 排除模式 }>; // 路由模式 routeMode?: 'flat' | 'nested'; // 默认: 'flat' // 动态导入 dynamic?: boolean; // 默认: false // 调试模式 debug?: boolean; // 默认: false // 全局排除 exclude?: string[]; } ``` ### 多目录配置 ```typescript autoRoutes({ dirs: [ { dir: './src/pages', baseRoute: '/' }, { dir: './src/admin', baseRoute: '/admin' }, { dir: './src/api', baseRoute: '/api' } ], dynamic: true, exclude: ['**/test/**', '**/*.test.*'] }) ``` ## 📝 实用示例 ### 页面组件 ```typescript // src/pages/users/page.tsx import { useLoaderData, Form } from 'react-router'; export default function UsersPage() { const { users } = useLoaderData(); return ( <div> <h1>用户管理</h1> {users.map(user => ( <div key={user.id}>{user.name}</div> ))} <Form method="post"> <input name="name" placeholder="用户名" /> <button type="submit">添加用户</button> </Form> </div> ); } ``` ### 数据加载器 ```typescript // src/pages/users/loader.tsx import type { LoaderFunctionArgs } from 'react-router'; export default async function loader({ request }: LoaderFunctionArgs) { const users = await fetch('/api/users').then(res => res.json()); return { users }; } export function errorBoundary({ error }) { return ( <div className="error"> <h2>加载失败</h2> <p>{error.message}</p> </div> ); } ``` ### 表单处理器 ```typescript // src/pages/users/action.tsx import type { ActionFunctionArgs } from 'react-router'; import { redirect } from 'react-router'; export default async function action({ request }: ActionFunctionArgs) { const formData = await request.formData(); const name = formData.get('name'); await fetch('/api/users', { method: 'POST', body: JSON.stringify({ name }), headers: { 'Content-Type': 'application/json' } }); return redirect('/users'); } ``` ### 布局组件 ```typescript // src/pages/layout.tsx import { Outlet, Link } from 'react-router'; import { Suspense } from 'react'; export default function RootLayout() { return ( <div> <nav> <Link to="/">首页</Link> <Link to="/about">关于</Link> <Link to="/users">用户</Link> </nav> <main> <Suspense fallback={<div>加载中...</div>}> <Outlet /> </Suspense> </main> </div> ); } ``` ## 🔧 TypeScript 支持 添加类型声明以获得完整的智能提示: ```typescript // vite-env.d.ts /// <reference types="@gulibs/vgrove-autoroutes/react-routes" /> ``` 或在 `tsconfig.json` 中添加: ```json { "compilerOptions": { "types": ["@gulibs/vgrove-autoroutes/react-routes"] } } ``` ## 🐛 故障排除 ### 热更新不工作? **✅ v0.0.164 已完全修复热更新问题!** 如果仍有问题: - 确保文件在配置的目录中 - 检查文件命名是否符合约定 - 尝试重启开发服务器 ### 路由没有生成? 检查以下几点: - 文件名是否包含 `.page.tsx` 或为 `page.tsx` - 文件是否被 `exclude` 规则排除 - 启用 `debug: true` 查看详细日志 ### TypeScript 类型错误? ```typescript // 添加类型声明 declare module '@gulibs/react-autopages' { export const routes: Array<RouteObject>; } ``` ## 🎉 最新更新 ### v0.0.164 - 虚拟模块优化版本 - 🔥 **完全修复热更新** - 虚拟模块采用路径嵌入方式,避免时间戳冲突 - ⚡ **性能优化** - 减少不必要的模块重新创建 - 🛡️ **稳定性提升** - 热更新更加可靠和快速 ### v0.0.163 - 稳定性增强 - 🐛 修复文件监听循环问题 - 🚀 优化缓存机制 - ✅ 完善错误处理 ## 📄 许可证 MIT License - 详见 [LICENSE](LICENSE) 文件 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! - [GitHub 仓库](https://github.com/gulibs/vite-plugin-react-auto-routes) - [问题反馈](https://github.com/gulibs/vite-plugin-react-auto-routes/issues) --- **🚀 立即体验零配置路由的便利!** ```bash npm install @gulibs/vgrove-autoroutes ``` **如果这个项目对您有帮助,请给我们一个 ⭐ Star!**