generouted: 生成式的 + Vite + File based 路由

可作用于 react-router 的生成式路由

01 安装依赖

安装依赖包

yarn add @generouted/react-router react-router-dom

02 配置 vite

对应的 vite 插件,会生成 ./router.tsx 文件,这个不要修改

// vite.config.ts

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import generouted from '@generouted/react-router/plugin';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react(), generouted()],
  resolve: { alias: { '@': '/src' } },
  server: {
    host: '0.0.0.0'
  }
});

03 针对 react browser router

main.tsx 入口文件

// src/main.tsx

import { createRoot } from 'react-dom/client'
import { Routes } from '@generouted/react-router'

createRoot(document.getElementById('root')!).render(<Routes />)

04 针对 hash router

相对更加通用的写法 src/main.tsx

import { createRoot } from 'react-dom/client'
import { RouterProvider, createHashRouter } from 'react-router-dom'
import { routes } from '@generouted/react-router'

const router = createHashRouter(routes)
const Routes = () => <RouterProvider router={router} />

createRoot(document.getElementById('root')!).render(<Routes />)

05 路由相关 cheatsheet

路由语法参考

FilePathConvention

(auth)/_layout.tsx

 Pathless Layout group

(auth)/login.tsx

/login

Regular route

(auth)/register.tsx

/register

Regular route

blog/_components/button.tsx

 Ignored route by an ignored directory

blog/_components/comments.tsx

 Ignored route by an ignored directory

blog/[...all].tsx

/blog/*

Dynamic catch-all route

blog/[slug].tsx

/blog/:slug

Dynamic route

blog/_layout.tsx

 Layout for /blog routes

blog/index.tsx

/blog

Index route

blog/tags.tsx

/blog/tags

Regular route

docs/-[lang]/index.tsx

/docs/:lang?/index

Optional dynamic route segment

docs/-[lang]/resources.tsx

/docs/:lang?/resources

Optional dynamic route segment

docs/-en/contributors.tsx

/docs/en?/contributors

Optional static route segment

+info.tsx

/info

Modal route

404.tsx

*

Custom 404 (optional)

_app.tsx

 Custom app layout (optional)

_ignored.tsx

 Ignored route

about.tsx

/about

Regular route

blog.w.o.layout.tsx

/blog/w/o/layout

Route without /blog layout

index.tsx

/

Index route
router react vite file pages