Perfect π Iβll give you a clean React + TypeScript + Vite + SWC + Bootstrap + React Router starter template.
This setup will:
- Use Vite as bundler
- Use SWC (
@vitejs/plugin-react-swc
) instead of Babel - Add Bootstrap styling
- Add React Router v6 for pages & navigation
- Include a Navbar + Footer layout
my-app/
βββ index.html
βββ vite.config.ts
βββ tsconfig.json
βββ src/
β βββ main.tsx
β βββ App.tsx
β βββ layouts/
β β βββ MainLayout.tsx
β βββ pages/
β β βββ Home.tsx
β β βββ About.tsx
β β βββ NotFound.tsx
β βββ components/
β βββ Navbar.tsx
β βββ Footer.tsx
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
export default defineConfig({
plugins: [react()],
})
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import App from './App'
// Bootstrap CSS
import 'bootstrap/dist/css/bootstrap.min.css'
createRoot(document.getElementById('root')!).render(
<StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</StrictMode>,
)
import { Routes, Route } from 'react-router-dom'
import MainLayout from './layouts/MainLayout'
import Home from './pages/Home'
import About from './pages/About'
import NotFound from './pages/NotFound'
function App() {
return (
<MainLayout>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="*" element={<NotFound />} />
</Routes>
</MainLayout>
)
}
export default App
import Navbar from '../components/Navbar'
import Footer from '../components/Footer'
import { ReactNode } from 'react'
type Props = {
children: ReactNode
}
export default function MainLayout({ children }: Props) {
return (
<div className="d-flex flex-column min-vh-100">
<Navbar />
<main className="container flex-grow-1 py-4">
{children}
</main>
<Footer />
</div>
)
}
import { Link } from 'react-router-dom'
import { Navbar as BsNavbar, Nav, Container } from 'react-bootstrap'
export default function Navbar() {
return (
<BsNavbar bg="dark" variant="dark" expand="lg">
<Container>
<BsNavbar.Brand as={Link} to="/">MyApp</BsNavbar.Brand>
<BsNavbar.Toggle aria-controls="basic-navbar-nav" />
<BsNavbar.Collapse id="basic-navbar-nav">
<Nav className="me-auto">
<Nav.Link as={Link} to="/">Home</Nav.Link>
<Nav.Link as={Link} to="/about">About</Nav.Link>
</Nav>
</BsNavbar.Collapse>
</Container>
</BsNavbar>
)
}
export default function Footer() {
return (
<footer className="bg-light text-center py-3 mt-auto border-top">
<small>© {new Date().getFullYear()} MyApp. All rights reserved.</small>
</footer>
)
}
export default function Home() {
return <h1>Welcome to MyApp π</h1>
}
export default function About() {
return <h1>About Page</h1>
}
export default function NotFound() {
return <h1>404 - Page Not Found</h1>
}
npm create vite@latest my-app -- --template react-ts
cd my-app
npm install
npm install react-router-dom bootstrap react-bootstrap @vitejs/plugin-react-swc -D
npm run dev
This gives you a modern, fast, bootstrap-styled React app with layouts.
π Do you also want me to wire this into file-based routing (like Next.js style with vite-plugin-pages
), or are you happy with plain react-router-dom
+ layouts for now?