4.1.2 • Published 9 months ago

vite-plugin-remix-flat-routes v4.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

vite-plugin-remix-flat-routes

集成 Remix & remix-flat-routes 约定式路由,支持 react-router 数据路由/传统路由

注意

为了支持 react-refresh hmr,请安装 @vitejs/plugin-react >= 4.3.2@vitejs/plugin-react-swc >= 3.6.0

中文文档

English Docs

安装

npm i vite-plugin-remix-flat-routes

使用

配置typescript类型提示

在 tsconfig.json 中引入

{
  "compilerOptions": {
    "types": ["vite-plugin-remix-flat-routes/virtual"]
  }
}

或者在文件中引入

/// <reference types="vite-plugin-remix-flat-routes/virtual" />

配置 vite 插件

import { defineConfig } from 'vite'
import { remixFlatRoutes } from 'vite-plugin-remix-flat-routes'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [remixFlatRoutes()],
})

插件配置项

type Options = {
  appDirectory?: string // 默认为 'app'
  // remix-flat-routes 配置
  flatRoutesOptions?: {
    routeDir?: string | string[] // 默认为 'routes'
    ignoreRouteFiles?: string[] // 默认为 []
    basePath?: string // 默认为 '/'
    paramPrefixChar?: string // 默认为 '$'
    routeRegex?: RegExp
    visitFiles?: VisitFilesFunction
  }
  legacy?: boolean // 是否开启传统路由模式,默认自动探测
  handleAsync?: boolean // 是否将 handle 转为异步函数,默认为 false
}

按照remix-flat-routes文档组织路由

例如

app
├── main.tsx            // 入口文件,放在index.html中
├── root.tsx            // 根路由 (https://remix.run/docs/en/main/file-conventions/root)
└── routes              // 路由目录
    ├── $.tsx           // 404 页面
    ├── _index          // 首页
    │   └── _index.tsx
    └── _sign+
        ├── _layout.tsx
        ├── signin
        │   └── _index.tsx
        └── signup
            └── _index.ts

示例

约定

为了更好的支持 Remix 的路由规范,插件做了一些约定,具体如下

  1. 路由文件默认导出(export default)为懒加载路由
  2. 路由组件具名导出(export function Component)为非懒加载路由

数据路由模式(react-router-dom>=6.4.0)

配置 react-router-dom

import { createBrowserRouter, RouterProvider } from 'react-router-dom'
import { createRoot } from 'react-dom/client'
import { routes } from 'virtual:remix-flat-routes'

// https://reactrouter.com/en/main/routers/create-browser-router
const router = createBrowserRouter(routes)

const root = createRoot(document.getElementById('root'))

// **使用数据路由**
// https://reactrouter.com/en/main/router-components/browser-router
root.render(<RouterProvider router={router} />)

从文件中导出路由组件和配置

import { useEffect } from 'react'
import { type LoaderFunction, useMatches } from 'react-router-dom'

// https://reactrouter.com/en/main/route/route#handle
export const handle = {
  test: '这是handle',
}

export default function Page() {
  return <div>懒加载的路由</div>
}

// 也可以导出 lazy 函数懒加载组件
export const lazy = async () => ({
  Component: (await import('./_index.lazy')).default,
})

export function Component() {
  return <div>非懒加载的路由</div>
}

// https://reactrouter.com/en/main/route/route#loader
export const loader: LoaderFunction = (args) => {
  console.log('this is loader', args)
  return null
}

// 更多Data-API导出请参考 [react-router 文档](https://reactrouter.com/en/main/route/route)

传统路由模式(react-router-dom<=6.3.0)

传统路由模式仅支持 Handle 约定

配置 vite 插件

import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'
import { remixFlatRoutes } from 'vite-plugin-remix-flat-routes'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react(),
    remixFlatRoutes({
      // 默认插件会自动探测 react-router-dom 版本,如果大于等于 6.4.0 则默认开启数据路由模式
      // 否则开启传统路由模式
      // 也可以手动开启传统路由模式
      legacy: true,
    }),
  ],
})

配置 react-router-dom

import { BrowserRouter } from 'react-router-dom'
import { createRoot } from 'react-dom/client'
import { routes } from 'virtual:remix-flat-routes'
import { LegacyRouterProvider } from 'vite-plugin-remix-flat-routes/client' // 导入 LegacyRouterProvider

const root = createRoot(document.getElementById('root'))

// **使用传统路由**
root.render(
  <BrowserRouter>
    <LegacyRouterProvider routes={routes} />
  </BrowserRouter>,
)

从文件中导出路由组件

默认导出(懒加载)

export default function Page() {
  return <div>懒加载的路由</div>
}

export const handle = {
  test: 'this is handle',
}

具名导出Component(非懒加载)

export function Component() {
  return <div>非懒加载的路由</div>
}

获取 handle

有以下方式获取 handle

1. 从 props 中获取 handle

import { type PropsWithMatchRoute } from 'vite-plugin-remix-flat-routes/client'

export default function (props: PropsWithMatchRoute) {
  const { handle } = props
}

2. 使用 useMatchRoutes 获取 handle 信息

import { useMatchRoutes } from 'vite-plugin-remix-flat-routes/client'

export function Component() {
  const matchRoutes = useMatchRoutes()
}

注意事项

  1. routes目录下被 flatRoutesOptions.routeRegex 匹配的文件都被识别为路由组件,如果你不希望某些文件被视为路由组件,可以通过 flatRoutesOptions.ignoreRouteFiles 进行配置

例如

remixFlatRoutes({
  flatRoutesOptions: {
    ignoreRouteFiles: ['**/components/**', '**/hooks/**'],
  },
})

componentshooks 目录下的所有文件不会被识别为路由组件

  1. 如果不使用内置的 remix-flat-routes,可以通过传入 routes 设置路由约定,参考 remix routes

  2. 如果导出的 handle 有副作用,请在插件配置项中传入 handleAsync:true。插件会将 handle 转为异步函数,解决副作用导致的序列化问题

灵感来源

4.1.0

9 months ago

4.0.1

9 months ago

4.1.2

9 months ago

4.1.1

9 months ago

4.0.2

9 months ago

4.0.0

9 months ago

3.5.6

10 months ago

3.5.4

10 months ago

3.4.0

10 months ago

3.3.0

10 months ago

3.0.3

10 months ago

3.2.0

10 months ago

3.0.2

10 months ago

3.1.0

10 months ago

3.0.1

10 months ago

3.5.3

10 months ago

3.5.2

10 months ago

3.5.1

10 months ago

3.5.0

10 months ago

3.4.1

10 months ago

3.0.0

10 months ago

2.6.1

11 months ago

2.6.0

11 months ago

2.5.0

11 months ago

2.4.0

11 months ago

2.3.0

11 months ago

2.2.0

11 months ago

2.1.1

11 months ago

2.1.0

11 months ago

2.0.0

11 months ago

1.0.1

11 months ago

1.0.0

11 months ago