Closed12
rsbuild + tanstack router メモ

rsbuild と tanstack router で SPA 作ってみる.

rsbuild init
例のごとく wizard でチャチャっと init できる
pnpm create rsbuild@latest

tanstack router 組み込み
quickstart に従う

install
pnpm add @tanstack/react-router

Configuration with Rsbuild
install plugin
pnpm add -D @tanstack/router-plugin
Update rsbuild.config.ts
TanStackRouterRspack plugin を追加
rsbuild.config.ts
import { defineConfig } from '@rsbuild/core'
import { pluginReact } from '@rsbuild/plugin-react'
import { TanStackRouterRspack } from '@tanstack/router-plugin/rspack'
export default defineConfig({
plugins: [pluginReact()],
tools: {
rspack: {
plugins: [TanStackRouterRspack()],
},
},
})

Routes 作成
routes/__root.tsx
import { createRootRoute, Link, Outlet } from '@tanstack/react-router'
import { TanStackRouterDevtools } from '@tanstack/router-devtools'
export const Route = createRootRoute({
component: () => (
<>
<div>
<Link to="/">
Home
</Link>{' '}
<Link to="/about">
About
</Link>
</div>
<hr />
<Outlet />
<TanStackRouterDevtools />
</>
),
})
routes/index.lazy.tsx
import { createLazyFileRoute } from '@tanstack/react-router'
export const Route = createLazyFileRoute('/')({
component: Index,
})
function Index() {
return (
<div>
<h3>Welcome Home!</h3>
</div>
)
}
routes/about.lazy.tsx
import { createLazyFileRoute } from '@tanstack/react-router'
export const Route = createLazyFileRoute('/about')({
component: About,
})
function About() {
return <div >Hello from About!</div>
}

Routes を App に組み込み
src/app.tsx
import { RouterProvider, createRouter } from '@tanstack/react-router';
// Import the generated route tree
import { routeTree } from './routeTree.gen';
// Create a new router instance
const router = createRouter({ routeTree });
// Register the router instance for type safety
declare module '@tanstack/react-router' {
interface Register {
router: typeof router;
}
}
const App = () => {
return <RouterProvider router={router} />;
};
export default App;

dev server 実行
pnpm dev

build & deploy
build すると "dist" directory が生成されるので、この "dist" を deploy してあげれば良い。

production 環境では devTools を除外
TanStackRouterDevtools を production 環境で除外したい場合は手動で実装してあげる必要ありなので注意。
const TanStackRouterDevtools =
process.env.NODE_ENV === 'production'
? () => null // Render nothing in production
: React.lazy(() =>
// Lazy load in development
import('@tanstack/router-devtools').then((res) => ({
default: res.TanStackRouterDevtools,
// For Embedded Mode
// default: res.TanStackRouterDevtoolsPanel
})),
)
<Suspense>
<TanStackRouterDevtools />
</Suspense>

scaffolding rsbuild & tanstack router
tanstack router 側で rsbuild & tanstack router を scaffolding するコマンドが用意されてる。これで一発でここまで準備してきたものと同等のものが用意できる。
npm create @tanstack/router@latest
# or
pnpm create @tanstack/router
# or
yarn create @tanstack/router
# or
bun create @tanstack/router

HMR が効かない問題
__root.tsx
配下の変更で HMR が効かない...
issue に上がってるけど、2024/10/18 現在はまだ fix してないみたい
このスクラップは2024/10/11にクローズされました