Startseite / Artikel / Reaktionsleistung jenseits manueller Memo-Verwendung: Struktur und Scheduling

Reaktionsleistung jenseits manueller Memo-Verwendung: Struktur und Scheduling

Rat aus der Compiler-Ära: Platziere den Zustand an derselben Stelle, trenne dringende Aufgaben ab, liefe weniger JavaScript aus und memoisiere anschließend die ermittelten Hotspots.

803 Wörter

Jahrelang bestand der Standardrat für die Leistung in React darin, alles mit memo-APIs zu umhüllen:

const value = useMemo(() => expensiveCalculation(data), [data]);
const handleClick = useCallback(() => {
  doSomething(id);
}, [id]);export default React.memo(Component);
function ProductList({ products, onSelect }) {
  const processed = useMemo(
    () => processProducts(products),
    [products]
  );
  const handleSelect = useCallback(
    (id) => onSelect(id),
    [onSelect]
  );  return (
    <List
      products={processed}
      onSelect={handleSelect}
    />
  );
}
App
 │
 ├── Header
 ├── Sidebar
 ├── Search
 ├── ProductList
 └── Footer
function App() {
  const [query, setQuery] = useState("");
  // large component tree
}
App
 │
 ├── Header
 ├── Sidebar
 ├── Search
 │    └── query state
 ├── ProductList
 └── Footer
const [query, setQuery] = useState("");
const [isPending, startTransition] = useTransition();
function handleChange(event) {
  const value = event.target.value;  setQuery(value);  startTransition(() => {
    setSearchResults(filterProducts(value));
  });
}
User input
    │
    ├── urgent ───────► keep UI responsive
    │
    └── non-urgent ───► transition
const AnalyticsDashboard = lazy(
  () => import("./AnalyticsDashboard")
);
Initial JavaScript
       │
       ▼
┌─────────────────────┐
│ Everything          │
│ Dashboard           │
│ Analytics           │
│ Editor              │
│ Admin               │
└─────────────────────┘
Initial load
    │
    ├── Core UI
    │
    └── Later
          ├── Analytics
          ├── Editor
          └── Admin
"This component renders often."
        │
        ▼
Add useMemo
"This component renders often."
        │
        ▼
Why?
        │
 ┌──────┼───────────┐
 ▼      ▼           ▼
State  Expensive   Large
flow   work        subtree
 │      │           │
 ▼      ▼           ▼
Colocate  Optimize  Restructure
1. Measure
      ↓
2. Find the expensive work
      ↓
3. Fix component architecture
      ↓
4. Reduce unnecessary JavaScript
      ↓
5. Prioritize updates correctly
      ↓
6. Let React Compiler handle memoization
      ↓
7. Manually optimize only when evidence says you should

Allein die Memoisierung behebt nicht langsame Anwendungen. Ein perfekt gememoisierter Baum kann dennoch unter Überlast durch zu große State-Daten, dringende Updates, die undringliche Aufgaben ausführen, oder aufwändige JavaScript-Operationen im Hauptthread leiden.

Der React Compiler ändert den Standard

Der Compiler automatisiert viele Memoisierungsmechanismen. Dadurch rückt die Arbeit der Entwickler stärker auf Strukturierung und Zeitplanung – anstatt useMemo überall manuell einzubauen.

Zuerst: den State näher an den Ort bringen, an dem er verwendet wird

Ein hohes State-Niveau führt zur erneuten Darstellung großer Unterbäume. Platzieren Sie das State bei den Blättern, die es benötigen; heben Sie es nur dann auf, wenn eine gemeinsame Verwendung erforderlich ist.

Zweitens: Lassen Sie dringende Aktualisierungen keine nicht-dringenden Aufgaben ausführen

Bewahren Sie die Reaktionsfähigkeit von Eingabe und Animationen. Verschieben Sie nicht-dringende Aufgaben mithilfe von Übergängen oder verzögerten Werten, damit Tasteneingaben nicht durch aufwändige Filter blockiert werden.

Drittens: Schauen Sie sich die JavaScript-Code betrachten, den Sie bereitstellen

Große Synchronisationsschleifen, aufwändige Formatierer und unbegrenzte Listen dominieren vor dem Eingreifen des React-Reconcilers. Profilieren Sie den JavaScript-Code, nicht nur die in den React DevTools angezeigten Aspekte.

Wann sollten Sie also useMemo verwenden?

Er ist weiterhin nützlich für Referenzstabilität bei Kindkomponenten, die auf Props verzichten, sowie für wirklich aufwändige reine Berechnungen – nach Messung. Nicht als Standardlösung für jeden Wert.

Die neue Leistungsdenkweise bei React

Struktur → Planung → weniger JavaScript für den Versand → anschließend Micro-Memoisierung der häufig genutzten Bereiche. Die vom Compiler unterstützte Memoisierung ist ein Hilfsmittel, kein Ersatz für eine gute Gestaltung.

Fügen Sie zu Pull Requests ein Leistungsbudget hinzu: Zeit bis zur nächsten Neuberechnung der Darstellung für das Hauptformular sowie ein Snapshot des React Profilers für die bekannten Ressourcenintensiven Routen.

Listen sollten erst virtualisiert werden, bevor jede Zeile gememoisiert wird. Die Memoisierung bei 10.000 Zeilen führt dennoch zu Nachteilen.

Fügen Sie zu Pull Requests ein Leistungsbudget hinzu: Zeit bis zur nächsten Neuberechnung der Darstellung für das Hauptformular sowie ein Snapshot des React Profilers für die bekannten Ressourcenintensiven Routen.

Listen sollten erst virtualisiert werden, bevor jede Zeile gememoisiert wird. Die Memoisierung bei 10.000 Zeilen führt dennoch zu Nachteilen.

Fügen Sie zu Pull Requests ein Leistungsbudget hinzu: Zeit bis zur nächsten Neuberechnung der Darstellung für das Hauptformular sowie ein Snapshot des React Profilers für die bekannten Ressourcenintensiven Routen.

Listen sollten erst virtualisiert werden, bevor jede Zeile gememoisiert wird. Die Memoisierung bei 10.000 Zeilen führt dennoch zu Nachteilen.

Fügen Sie zu den Pull Requests ein Leistungsbudget hinzu: die Zeit bis zum nächsten Malen des Hauptformulars sowie ein React-Profiler-Snapshot für den bekannten Ressourcenintensiven Pfad.

Listen sollten virtualisiert werden, bevor sie jede Zeile speichern. Das Speichern von Daten bei einer Anzeige mit 10.000 Zeilen führt dennoch zu Verlusten.

Fügen Sie zu den Pull Requests ein Leistungsbudget hinzu: die Zeit bis zum nächsten Malen des Hauptformulars sowie ein React-Profiler-Snapshot für den bekannten Ressourcenintensiven Pfad.

Listen sollten virtualisiert werden, bevor sie jede Zeile speichern. Das Speichern von Daten bei einer Anzeige mit 10.000 Zeilen führt dennoch zu Verlusten.

Fügen Sie zu den Pull Requests ein Leistungsbudget hinzu: die Zeit bis zum nächsten Malen des Hauptformulars sowie ein React-Profiler-Snapshot für den bekannten Ressourcenintensiven Pfad.

Listen sollten virtualisiert werden, bevor sie jede Zeile speichern. Das Speichern von Daten bei einer Anzeige mit 10.000 Zeilen führt dennoch zu Verlusten.