A disciplined order of operations, since premature optimization here actively costs readability:
React.memo + useMemo/useCallback for the specific expensive subtree identified in step 1 — not applied blanket across the whole app.react-window or @tanstack/react-virtual) for lists with hundreds or thousands of items, where even a cheap-per-row render adds up.React.lazy) for routes/features not needed on initial load, to reduce the JavaScript the browser has to parse and execute before the app becomes interactive.