Code splitting routes reduces initial bundle size and improves load times. React's lazy function dynamically imports components when routes are accessed. Wrapped in Suspense, lazy components show fallback UI while loading. I group related routes into chunks by organizing imports—admin routes load separately from public routes. The <Suspense> boundary can be at the route level or app level depending on desired granularity. Vite automatically creates separate bundles for dynamic imports. This pattern is essential for large apps where loading everything upfront would hurt performance. Users only download the code they need, when they need it.