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

可作用于 react-router 的生成式路由,自己常用的一种组件 APP 的方式

01 安装依赖

安装依赖包

# 必须安装
yarn add @generouted/react-router

# 已经初始化好项目的可以跳过此步骤
yarn add 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 示例 app/pages 结构

示例代码 _app.tsx

src
├── assets
│   ├── react.svg
│   └── styles
├── main.tsx
├── pages
│   ├── _app.tsx
│   ├── page1
│   ├── page2
│   ├── page3
│   └── page4
├── router.ts
├── shared
│   └── components
└── vite-env.d.ts

06 示例 Outlet 代码

示例代码 _app.tsx

import { Outlet } from 'react-router';
import { Link } from 'react-router-dom';

const Page = () => {
  return (
    <div className="flex size-full flex-col">
      <nav className="flex w-full items-center justify-center gap-2 py-2">
        <Link className="btn btn-sm" to="/page1">
          page1
        </Link>
        <Link className="btn btn-sm" to="/page2">
          page2
        </Link>
        <Link className="btn btn-sm" to="/page3">
          page3
        </Link>
        <Link className="btn btn-sm" to="/page4">
          page4
        </Link>
      </nav>
      <div className="flex-1">
        <Outlet />
      </div>
    </div>
  );
};

export default Page;

07 路由相关 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