icon

메티의 블로그

React 프로젝트에서 디렉터리 기반 라우팅 적용
React 프로젝트에서 디렉터리 기반 라우팅 적용

React 프로젝트에서 디렉터리 기반 라우팅 적용

summary
이 블로그 글은 React 프로젝트에서 디렉터리 기반 라우팅을 적용하기 위해 vite-plugin-pages 플러그인을 사용하는 방법에 대해 설명하고 있습니다. 또한, 이 플러그인의 기능과 제한 사항에 대해서도 언급하고 있습니다.
Tags
React
view_count
날짜
Sep 6, 2024
상태
공개
React 프로젝트에서도 Next.js 처럼 디렉터리 기반 라우팅을 해주는 vite 플러그인(vite-plugin-pages)이 있어서 사용하고 적용해보게 되었습니다. 예전 Next.js 처럼 디렉터리 기반 라우팅 적용이며, layout, page 와 같은 최신 Next.js 같은 방식으로는 아직 적용하지 않았습니다.
 

개요

제가 next.js 에서 가장 편하다고 생각하는 기능은 디렉터리 기반 라우팅입니다. 이번에 팀 내에서 새로 시작하는 프로젝트는 next.js 를 사용하지 않습니다. 그래서 혹시나 하는 마음에 vite 플러그인 중에서 디렉터리 기반 라우팅 해주는걸 분명 누가 만들지 않았을까 싶어서 찾아봤는데, 아니나 다를까 있었습니다! 적용도 간단하고, 편해서 정리하게 되었습니다.
 

vite-plugin-pages

해당 플러그인 이름은 vite-plugin-pages 입니다. vue 플러그인으로 먼저 나와서 그런지 react 쪽은 기능이 조금 적습니다. 이 플러그인은 react-router-dom 과 같이 사용해야하며, 아주 약간의 보일러 플레이트가 있습니다.
 
  1. Vite config
import { defineConfig } from "vite"; import Pages from "vite-plugin-pages"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ // ... Pages({ dirs: "src/pages", }), ], });
다음과 같은 Pages 객체를 통해 여러 옵션을 추가할 수 있습니다. dirs 는 vite-plugin-pages 가 바라볼 엔트리포인트 설정이라고 보면 됩니다.
  1. vite-env.d.ts
declare module "virtual:generated-pages-react" { import { RouteObject } from "react-router-dom"; const routes: RouteObject[]; export default routes; }
다음과 같이 module 또한 작성해줍니다.
  1. App 컴포넌트와 첫 index.html
// App.tsx import { useRoutes } from "react-router-dom"; import { Suspense } from "react"; import routes from "virtual:generated-pages-react"; function App() { return <Suspense fallback={<p>Loading...</p>}>{useRoutes(routes)}</Suspense>; } export default App;
프로젝트에 따라 조금씩 다를 수 있겠지만, 다음과 같이 빌드 후 생성되는 routes 를 넘겨주는 방식으로 보일러플레이트 설정을 합니다.
// main.tsx import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import App from "./App.tsx"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; createRoot(document.getElementById("root")!).render( <StrictMode> <BrowserRouter> <App /> </BrowserRouter> </StrictMode> );
 

적용 후 사용

next.js 14 버전 처럼의 layout.tsx 등의 지원은 react 쪽에서는 안 되는 것 같았고, 기본적인 pages 하위 라우팅과 path param 적용 정도 까지 되는 것 같습니다.