Add React Router to your Clerk + React application
Before you start
React Router supports three different routing strategies, or "modes":
- Declarative mode: Enables basic routing features like matching URLs to components, navigating around the app, and providing active states with APIs like
<Link>,useNavigate(), anduseLocation(). - Data mode: Adds data loading, actions, pending states and more with APIs like loader, action, and useFetcher. To use React Router in data mode, see the demo repository. A guide is coming soon.
- Framework mode: Use React Router as a framework to build your entire app. To use React Router as a framework instead, see the React Router quickstart.
This guide will cover how to add React Router in declarative mode, assuming you have followed the .
Install react-router and @clerk/react-router
Run the following command to install both React Router and the Clerk React Router SDK:
npm install react-router @clerk/react-routeryarn add react-router @clerk/react-routerpnpm add react-router @clerk/react-routerbun add react-router @clerk/react-routerAdd your Clerk Publishable Key to your .env file. This key can always be retrieved from the API keys page of the Clerk Dashboard.
- In the Clerk Dashboard, navigate to the API keys page.
- In the Quick Copy section, copy your Clerk Publishable Key.
- Add your key to your
.envfile.
The final result should resemble the following:
VITE_CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEYUpdate <ClerkProvider>
Update <ClerkProvider> to be imported from @clerk/react-router instead of @clerk/clerk-react.
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ClerkProvider } from '@clerk/react-router'
import './index.css'
import App from './App.tsx'
// Import your Publishable Key
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
if (!PUBLISHABLE_KEY) {
throw new Error('Add your Clerk Publishable Key to the .env file')
}
createRoot(document.getElementById('root')!).render(
<StrictMode>
<ClerkProvider publishableKey={PUBLISHABLE_KEY}>
<App />
</ClerkProvider>
</StrictMode>,
)Set up React Router
To use declarative mode, wrap your app in a <BrowserRouter>. To define your app's routes, add <Routes> and <Route> components. This example adds the / (home) route and renders the <App /> component when the URL matches. Read more about routing in the React Router docs.
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter, Routes, Route } from 'react-router'
import { ClerkProvider } from '@clerk/react-router'
import './index.css'
import App from './App.tsx'
// Import your Publishable Key
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
if (!PUBLISHABLE_KEY) {
throw new Error('Add your Clerk Publishable Key to the .env file')
}
createRoot(document.getElementById('root')!).render(
<StrictMode>
<BrowserRouter>
<ClerkProvider publishableKey={PUBLISHABLE_KEY}>
<Routes>
<Route path="/" element={<App />} />
</Routes>
</ClerkProvider>
</BrowserRouter>
</StrictMode>,
)Protect content and read user data
Learn how to use Clerk's hooks and helpers to protect content and read user data in your React Router application.
Feedback
Last updated on