React Performance Optimization: Best Practices für 2024

15. Januar 20248 Min.

Entdecken Sie die neuesten Techniken zur Performance-Optimierung in React-Anwendungen. Von Code-Splitting bis zu Concurrent Features.

Inhaltsverzeichnis

React Performance Optimization: Best Practices für 2024


Performance ist entscheidend für den Erfolg moderner Web-Anwendungen. In diesem umfassenden Guide zeigen wir Ihnen die wichtigsten Techniken zur React Performance-Optimierung für 2024.


Warum Performance wichtig ist


Langsame Anwendungen führen zu frustrierten Benutzern und schlechten Conversion-Raten. Studien zeigen, dass bereits eine Verzögerung von 100ms die Conversion-Rate um 7% reduzieren kann.


Code-Splitting Strategien


Code-Splitting ist eine der effektivsten Methoden, um die initiale Ladezeit zu reduzieren. Anstatt eine große JavaScript-Datei zu laden, teilen wir den Code in kleinere Chunks auf.


Route-based Code Splitting


import { lazy, Suspense } from 'react'

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'


const Home = lazy(() => import('./components/Home'))

const About = lazy(() => import('./components/About'))

const Contact = lazy(() => import('./components/Contact'))


function App() {

return (

<Router>

<Suspense fallback={<div>Loading...</div>}>

<Routes>

<Route path="/" element={<Home />} />

<Route path="/about" element={<About />} />

<Route path="/contact" element={<Contact />} />

</Routes>

</Suspense>

</Router>

)

}


Component-based Code Splitting


Für größere Komponenten können Sie auch komponentenbasiertes Code-Splitting verwenden:


import { lazy, Suspense, useState } from 'react'


const HeavyModal = lazy(() => import('./HeavyModal'))


function MyComponent() {

const [showModal, setShowModal] = useState(false)


return (

<div>

<button onClick={() => setShowModal(true)}>

Open Modal

</button>


{showModal && (

<Suspense fallback={<div>Loading modal...</div>}>

<HeavyModal onClose={() => setShowModal(false)} />

</Suspense>

)}

</div>

)

}


React.memo und useMemo


React.memo verhindert unnötige Re-Renders von Komponenten, während useMemo teure Berechnungen cachiert.


React.memo effektiv nutzen


import { memo } from 'react'


const ExpensiveComponent = memo(({ data, onUpdate }) => {

return (

<div>

{data.map(item => (

<div key={item.id}>

{item.name}

</div>

))}

</div>

)

})


// Nur re-rendern wenn sich 'data' oder 'onUpdate' ändert


useMemo für teure Berechnungen


import { useMemo } from 'react'


function DataProcessor({ rawData, filters }) {

const processedData = useMemo(() => {

return rawData

.filter(item => filters.includes(item.category))

.sort((a, b) => a.priority - b.priority)

.map(item => ({

...item,

formatted: formatData(item)

}))

}, [rawData, filters])


return <DataTable data={processedData} />

}


Lazy Loading Komponenten


Lazy Loading reduziert die initiale Bundle-Größe erheblich:


import { lazy, Suspense } from 'react'

import LoadingSpinner from './LoadingSpinner'


const Charts = lazy(() => import('./Charts'))

const DataTable = lazy(() => import('./DataTable'))


function Dashboard() {

return (

<div>

<h1>Dashboard</h1>


<Suspense fallback={<LoadingSpinner />}>

<Charts />

</Suspense>


<Suspense fallback={<LoadingSpinner />}>

<DataTable />

</Suspense>

</div>

)

}


Bundle-Größe optimieren


Tree Shaking


Nutzen Sie ES6 Imports um ungenutzten Code zu eliminieren:


// Schlecht - importiert die gesamte Lodash Library

import _ from 'lodash'


// Gut - importiert nur die benötigte Funktion

import debounce from 'lodash/debounce'


Bundle Analyzer


Analysieren Sie Ihre Bundle-Größe mit webpack-bundle-analyzer:


npm install --save-dev webpack-bundle-analyzer

npx webpack-bundle-analyzer build/static/js/*.js


Concurrent Features nutzen


React 18 bringt neue Concurrent Features mit sich:


Automatic Batching


React 18 batcht Updates automatisch, auch in Timeouts und Promises:


function handleClick() {

setCount(c => c + 1)

setFlag(f => !f)

// React batcht diese Updates automatisch

}


useTransition für nicht-dringende Updates


import { useTransition, useState } from 'react'


function SearchResults() {

const [query, setQuery] = useState('')

const [results, setResults] = useState([])

const [isPending, startTransition] = useTransition()


function handleSearch(newQuery) {

setQuery(newQuery) // Dringend

startTransition(() => {

setResults(searchData(newQuery)) // Nicht dringend

})

}


return (

<div>

<input

value={query}

onChange={(e) => handleSearch(e.target.value)}

/>


{isPending && <div>Searching...</div>}


<SearchResultsList results={results} />

</div>

)

}


Performance Monitoring


Verwenden Sie React DevTools Profiler um Performance-Probleme zu identifizieren:


  • Öffnen Sie React DevTools
  • 2. Wechseln Sie zum Profiler Tab

    3. Starten Sie eine Aufzeichnung

    4. Interagieren Sie mit Ihrer App

    5. Stoppen Sie die Aufzeichnung und analysieren Sie die Ergebnisse


    Best Practices Zusammenfassung


  • **Code-Splitting**: Teilen Sie Ihren Code in kleinere Chunks auf
  • 2. **Memoization**: Nutzen Sie React.memo und useMemo strategisch

    3. **Lazy Loading**: Laden Sie Komponenten nur bei Bedarf

    4. **Bundle Optimierung**: Analysieren und reduzieren Sie Ihre Bundle-Größe

    5. **Concurrent Features**: Nutzen Sie useTransition für bessere UX

    6. **Monitoring**: Überwachen Sie Performance kontinuierlich


    Mit diesen Techniken können Sie die Performance Ihrer React-Anwendungen erheblich verbessern und eine bessere Benutzererfahrung schaffen.

    👨‍💻

    Max Müller

    Senior Frontend Developer

    Max ist Senior Frontend Developer mit über 8 Jahren Erfahrung in React und modernen Web-Technologien.

    Weitere interessante Artikel

    Entdecken Sie weitere spannende Inhalte aus unserem Blog