Рэакцыя на выконанне за межах ручнага выкарыстоўвання memo: структура і планаванне
Парадыгма кампайляра: размешчай стан усёў, аддзельна выконвай тыя задачы, якія трэба адразу, выдаўай менш JS-кода, а пасля запісваў результаты выкарыстоўвання найчастае коду.
Прывычна ўжо гады рэкамендацыя ўжываць React для падвышэння працэздатнасі заключалася ў тым, каб усё абгортваць за дапамогою API memo:
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
Толькі мемаўванне не вылечыць медленных прыкладоў програм. Абсалютна мемаўваныя структуры все равно можу працаваць неэфективна з-за занадта вялікаг колькасці данных, тэрміновых апдэйтаў, якія выканываюць не тыя задачы, чыя ўжо трэба, або з-за важкаг JavaScript на галоўнай сцыялке.
React Compiler зменіў стандарт
Кампайлер автаматызуе багато процэсаў мемаўвання. Чыныцаючы, адпаведальнасць за структуруранне коду і планаванне выконання задач пераходзіць на людзя, а не на ручныя вызывы useMemo у кожнай частцы коду.
Перша практыка: размістыце данні ближэй да месца ўжывання
Высокі статус у дрэве занова атрыбутуе шырокія паддрэвы. Размешчайце статус разам з лістамі, якія яго патрабуюць; паднімайце яго толькі тады, калі для спільнага викорыстоўвання гэта неабходна.
Друга рэкамендацыя: не дазволяйце трыбутным апдэтаў выплываць некалькітабельную работу
Зберагаюце чутлівасць до клавішных натысканняў і анімацый. Адкладзіце некалькітабельную работу за дапамою пераходаў/адкладзеных значэнняў, каб натысканні клавіш не блакалі дорогія фільтры.
Трэцяя рэкамендацыя: разглядзіце JavaScript, які вы аплываеце
Большыя ціклы сінхронізацыі, дорогія форматары і необмежаныя лісты прадомінуюць, прычыму не можа дзеяць механізм супраўляння React. Аналізуйце код JavaScript, а не толькі падсвечванні ў інструментах React DevTools.
Тады калі трэба вжываць useMemo?
Ён яшчэ корыстны для падтрымкі стабільнасці значэнняў між дзецкімі элементамі, якія не прымаюць прапсы, а таксама для сапраўдна дорогіх чыстых вычысленняї — пасля ўзяць співваротнасці. Не як стандартны атрыбут для кожнага значэння.
Новы падход да аптимізацыі выконвання ў React
Структура → планаванне → адкаліненне JS → пасля чаго мікромемацыя актуальных элементаў. Мемацыя за дапамогай кампіляра ўжо яе падказчык, а не замена дизайну.
Да PR-аў трэба дадаць бюджет на выконання: час адзінаковай перработы галоўнага форму і кадр з профілярам React для вядомай навантажанай стазы.
Спісы павінны вярчуванаць перш чым мемаваць кожны ряд. Мемацыя 10-тысячнага спісу все равно прызводзіць да втрат.
Да PR-аў трэба дадаць бюджет на выконання: час адзінаковай перработы галоўнага форму і кадр з профілярам React для вядомай навантажаной стазы.
Спісы павінны вярчуванаць перш чым мемаваць кожны ряд. Мемацыя 10-тысячнага спісу все равно прызводзіць да втрат.
Да PR-аў трэба дадаць бюджет на выконання: час адзінаковай перработы галоўнага форму і кадр з профілярам React для вядомай навантажаной стазы.
Спісы павінны вярчуванаць перш чым мемаваць кожны ряд. Мемацыя 10-тысячнага спісу все равно прызводзіць да втрат.
Даўце бюджет на выконання для PR-запросаў: вялічыну часу, неабходную для наступной перамальвання главнай формы, а таксама кадр з інструменту профілювання React для вядомага траекторыю з вялікай навантажэнням.
Спісы павинны вярчуванніцавацца раней, чым запам’ятовваць кожны рядок. Запам’ятовванне дадзеных для 10 тысяч рядкоў у момент стварэння все равно прызводзіць да втрат.
Даўце бюджет на выконання для PR-запросаў: вялічыну часу, неабходную для наступной перамальвання главнай формы, а таксама кадр з інструменту профілювання React для вядомага траекторыю з вялікай навантажэнням.
Спісы павинны вярчуванніцавацца раней, чым запам’ятовваць кожны рядок. Запам’ятовванне дадзеных для 10 тысяч рядкоў у момент стварэння все равно прызводзіць да втрат.
Даўце бюджет на выконання для PR-запросаў: вялічыну часу, неабходную для наступной перамальвання главнай формы, а таксама кадр з інструменту профілювання React для вядомага траекторыю з вялікай навантажэнням.
Спісы павинны вярчуванніцавацца раней, чым запам’ятовваць кожны рядок. Запам’ятовванне дадзеных для 10 тысяч рядкоў у момент стварэння все равно прызводзіць да втрат.