React Query(현 TanStack Query)로 유명한 Tanner Linsley가 개발한 헤드리스(Headless) 라우팅 라이브러리
헤드리스(Headless): UI나 특정 프레임워크에 종속되지 않고, 핵심 라우팅 로직만 제공하여 개발자가 자유롭게 UI와 통합할 수 있게 함
현재 React를 주요 타겟으로 하고 있으며(@tanstack/react-router), 추후 다른 프론트엔드 프레임워크(Vue, Svelte 등)로도 확장할 것으로 보인다.
TanStack Router는 "파일 기반 라우팅" 기능을 제공하며, 권장하고 있다.
Next.js를 사용해 본 경험이 있다면, 폴더 구조에 따라 자동으로 URL Path를 만들어주는 "파일 기반 라우팅"이 편리하다고 생각하는 경우가 많을 것이라 생각한다.
TanStack Router는 Next.js와 유사한 파일 기반 라우팅을 제공하기 때문에 약간의 러닝커브를 거친 후에 편리하게 사용할 수 있었다. 👍
검색을 통해 블로그를 참고하려고 해도 글이 많지 않고, 제대로 정리된 글도 찾기 힘들어서 공식문서를 읽고 직접 하나씩 실행해보면서 사용법을 익혔다...
사용법이 정리된 블로그들을 봐도 생략된 과정이 많고, 다른 사람이 알아볼만한 글이 아니었음 😠
react를 타겟으로 하며, 파일 기반 라우팅에 대해서만 정리함
코드 기반 라우팅은 React Router와 유사하며, TanStack 공식문서 참고
설치 및 실행에 앞서 대략적인 흐름을 아는 것이 이해에 도움이 될 것 같다.
(여러 글들에서 routeTree.gen.ts 파일 자동 생성 등에 대한 내용이 없어 한참 헤맸음...)
vite.config.ts 설정main.tsx에서 router 생성 및 <RouterProvider /> 컴포넌트 추가__root.tsx 파일 생성 (2-1 ~ 2-3 생략 가능)tsr generate 명령어 실행 (@tanstack/router-cli의 기능)__root.tsx에 코드가 자동으로 추가됨 + routeTree.gen.ts 생성됨index.tsx, _layout.tsx 등 파일 생성 및 generate 명령어 실행vite dev 명령어 실행routeTree.gen.ts 생성됨index.tsx 등의 파일을 생성하면 자동으로 코드가 추가됨npm create vite@latest
실행 후 안내를 따라 React, TypeScript를 사용하도록 설정함
npm i @tanstack/react-router
npm i -D @tanstack/react-router-devtools
npm i -D @tanstack/router-plugin # vite에 적용할 plugin
npm i -D @tanstack/router-cli # vite 없이 별도로 routeTree를 생성하기 위함
TanStack 공식문서에는 react-router-devtools는 npm install @tanstack/react-router-devtools로 되어있지만, devtools 라는 이름처럼 개발 과정에서 상태를 확인하기 위한 도구이므로 devDependencies(-D)로 설치하였음
import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [
TanStackRouterVite({
target: 'react',
autoCodeSplitting: true,
routesDirectory: './src/routes',
}),
react(),
],
});
routesDirectory 설정을 생략하면 기본값이 routes 폴더로 지정된다.
필요하다면 routeToken, indexToken 등의 설정을 통해 파일명 컨벤션이나 폴더 등을 원하는대로 변경할 수 있다.
// ...
import { RouterProvider, createRouter } from '@tanstack/react-router';
import { routeTree } from './routeTree.gen';
const router = createRouter({
routeTree,
});
createRoot(document.getElementById('root')!).render(
<StrictMode>
// ...
<RouterProvider router={router} />
// ...
</StrictMode>
);
routes 폴더 내부에 __route.tsx가 존재해야 routeTree를 생성할 수 있다.
아래와 같이 파일을 생성하자.
그 다음, npx tsr generate 혹은 npm run dev(npx vite dev) 실행
-> routeTree.gen.ts 파일이 자동으로 생성되며 main.tsx의 eslint 오류가 사라짐 + __root.tsx에 코드가 자동으로 채워짐
import * as React from 'react'
import { Outlet, createRootRoute } from '@tanstack/react-router'
export const Route = createRootRoute({
component: RootComponent,
})
function RootComponent() {
return (
<React.Fragment>
<div>Hello "__root"!</div>
<Outlet />
</React.Fragment>
)
}
vite dev로 개발서버 구동 중에 routes 폴더 내부의 파일들의 이름을 변경하거나 이동하게 되면, routeTree.gen.ts가 즉시 변경되는데, prettier의 영향을 받게 된다.
따라서 아래의 두 가지 방법을 통해 오류를 방지하였다.
// .prettierignore
routeTree.gen.ts
{
...
"files.readonlyInclude": {
"**/routeTree.gen.ts": true
},
"files.watcherExclude": {
"**/routeTree.gen.ts": true
},
"search.exclude": {
"**/routeTree.gen.ts": true
}
...
}
⚠️ 주의
개발서버 구동 중 파일 이동 or 파일명 변경 시 vscode에서 "~~에 대한 가져오기를 업데이트하시겠습니까"라는 문구의 prompt가 뜨는데, "예"를 선택 시routeTree.gen.ts파일이 이상하게 수정되어 오류가 발생하는 경우가 있다.
-> "아니요"를 선택하거나, 오류 발생 시routeTree.gen.ts를 다시 생성해야 함
index.tsx: 해당 경로의 기본 페이지 ("/example/")route.tsx: 해당 경로의 페이지 ("/example" - 정확히 그 경로만)<Outlet />을 포함하면, layout의 역할을 할 수 있음example.tsx 등: /example/route.tsx와 동일index.lazy.tsx: lazy loading 페이지 -> React Route에서 react의 lazy를 사용하는 것과 동일_pathless-layout(.tsx): url에 포함되지 않는 레이아웃용(?) 파일 및 폴더(pathless-route): url에 포함되지 않는 폴더File Naming Convention - TanStack Router https://tanstack.com/router/latest/docs/framework/react/routing/file-naming-conventions
참고
[공식문서] TanStack Router
https://tanstack.com/router/latest
TanStack Router의 추가적인 기능들은 추후 포스팅할 예정