Rute berbasis file yang dihasilkan untuk vite
Saya menikmati menggunakan perutean berbasis file sejak saya mencoba next.js (direktori halaman). Setelah menerapkan konsep yang sama dengan aplikasi vite dan sisi klien, saya mulai menulis posting blog yang mencakup implementasi perutean berbasis file sisi klien dengan react router yang dikemas kemudian seperti generouted .
Today generouted membawa banyak fitur, mendukung berbagai kerangka kerja dan router, dan menginspirasi ide dan konvensi dari Next.js, Remix, Expo, Docusaurus, Sveltekit dan banyak lagi.
generouted menggunakan API impor Glob Vite untuk mendaftar rute dalam direktori src/pages dan menghasilkan pohon rute dan modal berdasarkan konvensi generouted .
Ada juga plugin vite yang tersedia untuk beberapa integrasi untuk menyediakan komponen/kait/util yang aman jenis melalui generasi kode.
react-router-dom atau @tanstack/router ? atau @tanstack/react-location@solidjs/router@mdx-js/rollupgenerouted melalui StackBlitzsrc/pages/ File dan lihat perubahan Anda yang mencerminkan Jika Anda tidak memiliki proyek vite dengan React and TypeScript, periksa dokumentasi vite untuk memulai proyek baru.
pnpm add @generouted/react-router react-router-dom // vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import generouted from '@generouted/react-router/plugin'
export default defineConfig ( { plugins : [ react ( ) , generouted ( ) ] } ) // src/main.tsx
import { createRoot } from 'react-dom/client'
import { Routes } from '@generouted/react-router'
createRoot ( document . getElementById ( 'root' ) ! ) . render ( < Routes /> ) Tambahkan halaman beranda dengan membuat file baru src/pages/index.tsx → / , lalu ekspor komponen default:
export default function Home ( ) {
return < h1 > Home </ h1 >
}Periksa bagian Konvensi Routing di bawah ini.
Anda dapat menemukan detail lebih lanjut tentang navigasi jenis-aman dan modal global di @generouted/react-router .
Jika Anda tidak memiliki proyek vite dengan solid dan naskah, periksa dokumentasi vite untuk memulai proyek baru.
pnpm add @generouted/solid-router @solidjs/router // vite.config.ts
import { defineConfig } from 'vite'
import solid from 'vite-plugin-solid'
import generouted from '@generouted/solid-router/plugin'
export default defineConfig ( { plugins : [ solid ( ) , generouted ( ) ] } ) // src/main.tsx
import { render } from 'solid-js/web'
import { Routes } from '@generouted/solid-router'
render ( Routes , document . getElementById ( 'root' ) ! ) Tambahkan halaman beranda dengan membuat file baru src/pages/index.tsx → / , lalu ekspor komponen default:
export default function Home ( ) {
return < h1 > Home </ h1 >
} Lihat lebih lanjut tentang konvensi perutean generouted di bawah ini.
Anda dapat menemukan detail lebih lanjut tentang navigasi jenis-aman dan modal global di @generouted/solid-router .
Lihat dokumen di sini
Jika Anda tidak memiliki proyek vite dengan React and TypeScript, periksa dokumentasi vite untuk memulai proyek baru.
pnpm add generouted @tanstack/react-location // src/main.tsx
import { createRoot } from 'react-dom/client'
import { Routes } from 'generouted/react-location'
createRoot ( document . getElementById ( 'root' ) ! ) . render ( < Routes /> ) Tambahkan halaman beranda dengan membuat file baru src/pages/index.tsx → / , lalu ekspor komponen default:
export default function Home ( ) {
return < h1 > Home </ h1 >
} src/pages.tsx , .jsx dan .mdxsrc/pages/_app.tsx untuk tata letak level aplikasisrc/pages/404.tsx untuk halaman yang tidak ditemukan khusus src/pages/index.tsx → /src/pages/posts/index.tsx → /posts src/pages/posts/2022/index.tsx → /posts/2022src/pages/posts/2022/resolutions.tsx → /posts/2022/resolutions src/pages/posts/[slug].tsx → /posts/:slugsrc/pages/posts/[slug]/tags.tsx → /posts/:slug/tagssrc/pages/posts/[...all].tsx → /posts/* _layout.tsx di direktori bersarang → src/pages/posts/_layout.tsx<Outlet /> untuk membuat tata letak anak -anaksrc/pages/posts/ direktori dalam kasus ini, akan dibungkus dengan tata letak itu . Antara segmen yang akan dikonversi menjadi lereng ke depansrc/pages/posts.nested.as.url.not.layout.tsx → /posts/nested/as/url/not/layout ()src/pages/(auth)/_layout.tsxsrc/pages/(auth)/login.tsx → /login+ (berpikir modal adalah rute tambahan yang overlay rute saat ini)useModals()src/pages/+info.tsx → /infosrc/pages/+checkout/+details.tsx → /checkout/detailssrc/pages/+checkout/+payment.tsx → /checkout/payment - (berpikir segmen dapat dikurangi atau dihapus dari jalur rute)src/pages/-en/about.tsx → /en?/about → /en/about , /aboutsrc/pages/-[lang]/about.tsx → /:lang?/about → /en/about , /fr/about , /about _ akan diabaikansrc/pages/_ignored.tsxsrc/pages/posts/_components/button.tsxsrc/pages/posts/_components/link.tsxexport default Component() {...}export const Loader = () => {...}export const Action = () => {...}export const Pending = () => {...}export const Catch = () => {...}src/pages
├── (auth)
│ ├── _layout.tsx
│ ├── login.tsx
│ └── register.tsx
├── blog
│ ├── _components
│ │ ├── button.tsx
│ │ └── comments.tsx
│ ├── [...all].tsx
│ ├── [slug].tsx
│ ├── _layout.tsx
│ ├── index.tsx
│ └── tags.tsx
├── docs
│ ├── -[lang]
│ │ ├── index.tsx
│ │ └── resources.tsx
│ └── -en
│ └── contributors.tsx
├── +info.tsx
├── 404.tsx
├── _app.tsx
├── _ignored.tsx
├── about.tsx
├── blog.w.o.layout.tsx
└── index.tsx| Mengajukan | Jalur | Konvensi |
|---|---|---|
(auth)/_layout.tsx | Grup Tata Letak Tanpa Jalur | |
(auth)/login.tsx | /login | Rute reguler |
(auth)/register.tsx | /register | Rute reguler |
blog/_components/button.tsx | Rute yang diabaikan dengan direktori yang diabaikan | |
blog/_components/comments.tsx | Rute yang diabaikan dengan direktori yang diabaikan | |
blog/[...all].tsx | /blog/* | Rute tangkapan dinamis |
blog/[slug].tsx | /blog/:slug | Rute dinamis |
blog/_layout.tsx | Tata letak untuk /blog | |
blog/index.tsx | /blog | Rute indeks |
blog/tags.tsx | /blog/tags | Rute reguler |
docs/-[lang]/index.tsx | /docs/:lang?/index | Segmen rute dinamis opsional |
docs/-[lang]/resources.tsx | /docs/:lang?/resources | Segmen rute dinamis opsional |
docs/-en/contributors.tsx | /docs/en?/contributors | Segmen rute statis opsional |
+info.tsx | /info | Rute modal |
404.tsx | * | Custom 404 (opsional) |
_app.tsx | Tata Letak app Kustom (Opsional) | |
_ignored.tsx | Rute yang diabaikan | |
about.tsx | /about | Rute reguler |
blog.wolayout.tsx | /blog/w/o/layout | Rute tanpa /blog |
index.tsx | / | Rute indeks |
Via @generouted/react-router atau @generouted/solid-router
<Routes /> -Komponen perutean berbasis file untuk diterjemahkan di entri aplikasiroutes -Rute Berbasis File Pohon /Objek yang Digunakan Secara Default Di Komponen <Routes /> Via @generouted/react-router/lazy atau @generouted/solid-router/lazy
@generouted/react-router atau @generouted/solid-router untuk mengaktifkan malas-loadingsrc/pages/_app.tsx<Routes /> yang sama dan ekspor routes Via @generouted/react-router/plugin atau @generouted/solid-router/plugin
src/router.ts<Link> , <Navigate> , useModals() , useNavigate() , useParams() , redirect() , dll.@generouted/react-router atau @generouted/solid-router Docs untuk lebih jelasnya Via @generouted/react-router/core atau @generouted/solid-router/core
<Routes/>Ada beberapa pendekatan untuk mencapai itu. Jika Anda lebih suka menangani logika di satu tempat, Anda dapat menentukan rute yang dilindungi dengan penanganan pengalihan dalam suatu komponen:
// src/config/redirects.tsx
import { Navigate , useLocation } from 'react-router-dom'
import { useAuth } from '../context/auth'
import { Path } from '../router'
const PRIVATE : Path [ ] = [ '/logout' ]
const PUBLIC : Path [ ] = [ '/login' ]
export const Redirects = ( { children } : { children : React . ReactNode } ) => {
const auth = useAuth ( )
const location = useLocation ( )
const authenticatedOnPublicPath = auth . active && PUBLIC . includes ( location . pathname as Path )
const unAuthenticatedOnPrivatePath = ! auth . active && PRIVATE . includes ( location . pathname as Path )
if ( authenticatedOnPublicPath ) return < Navigate to = "/" replace />
if ( unAuthenticatedOnPrivatePath ) return < Navigate to = "/login" replace />
return children
} Kemudian gunakan komponen itu ( <Redirects> ) pada tata letak level root src/pages/_app.tsx untuk membungkus komponen <Outlet> :
// src/pages/_app.tsx
import { Outlet } from 'react-router-dom'
import { Redirects } from '../config/redirects'
export default function App ( ) {
return (
< section >
< header >
< nav > ... </ nav >
</ header >
< main >
< Redirects >
< Outlet />
</ Redirects >
</ main >
</ section >
)
}Anda dapat menemukan contoh lengkap dari pendekatan ini di Templat Render
Anda dapat menggunakan objek routes yang diekspor untuk menyesuaikan router atau menggunakan hash/router memori:
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 /> ) Mit