By : admin
Language: javascript
Date Published: 4 days, 3 hours ago
Code splitting is a technique that bundles your application into smaller chunks, loading only what's necessary for the initial render and deferring non-critical code. In large React apps, this significantly improves initial load time, especially important for users on slower connections or mobile devices. React.lazy and Suspense enable dynamic imports for components, while route-based splitting in frameworks like Next.js automates this for pages. Key strategies include splitting by route, separating vendor code, and lazy-loading heavy components like modals or editors. Always measure impact with tools like Webpack Bundle Analyzer and Lighthouse to ensure splits actually improve performance. Avoid over-splitting, as too many chunks can increase HTTP overhead; aim for 3-5 critical chunks for most applications. This pattern maintains developer experience while delivering faster user-facing performance.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | // Lazy-loading a heavy component with Suspense import React, { Suspense, lazy } from "react"; // Only load this component when needed const HeavyEditor = lazy(() => import("./components/HeavyEditor")); const AnalyticsDashboard = lazy(() => import("./components/AnalyticsDashboard")); export default function App() { return ( <div className="app"> <nav> {/* Navigation remains in initial bundle */} <Link to="/">Home</Link> <Link to="/editor">Editor</Link> <Link to="/analytics">Analytics</Link> </nav> <Suspense fallback={<div>Loading...</div>}> {/* Routes load their components only when visited */} <Outlet /> </Suspense> </div> ); } // Example with route-based splitting in React Router v6 // App.js import { BrowserRouter, Routes, Route, Link, Outlet } from "react-router-dom"; import Home from "./pages/Home"; // Assume these are small import Header from "./components/Header"; function App() { return ( <BrowserRouter> <Header /> <Routes> <Route path="/" element={<Home />} /> {/* Lazy load editor route */} <Route path="/editor" element={ <Suspense fallback={<div>Loading editor...</div>}> <LazyEditor /> </Suspense> } /> {/* Lazy load analytics route */} <Route path="/analytics" element={ <Suspense fallback={<div>Loading analytics...</div>}> <LazyAnalytics /> </Suspense> } /> </Routes> </BrowserRouter> ); } const LazyEditor = lazy(() => import("./pages/Editor")); const LazyAnalytics = lazy(() => import("./pages/Analytics")); // pages/Home.js - remains in initial bundle export default function Home() { return <h2>Home page</h2>; } // pages/Editor.js - split into separate chunk export default function Editor() { return <div>Heavy editor component...</div>; } // pages/Analytics.js - split into separate chunk export default function Analytics() { return <div>Analytics dashboard with charts...</div>; } |