Практычныя прытамкі: як я оптымізав медленны React-даплік без перапісву яго
Практычныя прыказкі: як я оптымізав медленны React-даплык без перапісву яго — паслядованасць крокаў, перакрытчыкі і месца для дадзення коду для команд, якія викорыстоўваюць гэты патэрн.
Існавайце гэта як перапрацоўку ідэй з артыкула «Як я оптымізаваў медленны React-дапрацоўку без перапісваў яе» для аператараў: чыстыя этапы, арганізаваныя блакі коду і прымечанні па вяснаванню, якія застаюцца пасля перадачы задання. Этап Аналізу работае найэфектывней, калі яго спрыяваць як мерыемую плошчу. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прымечанні па вяснаванню перад тым, як расшырваць масштаб задання. Спрыявайце гэты этап як кантракт між вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад беззвучнага частковага завершэння.
Дыягназ: выявленне проблемы
Для выявлення стадіі дыягназу, перш чым зменшваць код, неабяжна адзначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыямы должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трэба час выконання і кост токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмовай среды ў спадзеленыя сераўы. Стан неабяжна размешчаць разам з компонентам, які керуе мутацыямі. Размешчэнне всего ў глобальным хранільніку ускладняе выяўленне багоў, зв’язаных з часам выконання.
1. React.memo: Найпростейшы спосаб
Для 1 React memo The stage неабяжна прадзець вводных дадзеных, адпаведнага власніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы схованы статус. Конфігурацыю трэба залічыць праза код аплікацыі. Файлы сяродавішняе сераўісу, храненні секрэтных дадзеных і флагі функцыйнасці должны знаходзіцца ў аднам месцы, якое аперацыйныя працавнікі могу пераглядаць, не чытаючы весь граф. Статус трэба размешчаць разам з компонентам, які керуе мутацыяй. Размешчэнне всего ў глобальным храненні ускладняе выяўленне багоў, зв’язаных з часам адпаведнай дзеяння.
const ExpensiveComponent = React.memo(({ data, onUpdate }) => {
// Component logic
});
2. useMemo і useCallback: Зупінка рэкурзыўных перасчытанняў
Для двух стадій useMemo і useCallback неабяжна прабыць з’явіцца вводныя даны, адміністратар шагу і крэтыяры выходу пры перадзеі коду. Аператары должны магчымаць перзапуск шагу з вядомай точкі контролю без неабяжнага адгадвання захаванага стану. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсцю часткай продукту, а не пасляднім дапрацоўкам. Размешчайце стан разам з компонентам, які керуе мутацыяй. Перанесенне всаго у глобальны хранільнік ускладняе выяўленне багоў з часама. Для двух стадій useMemo і useCallback неабяжна прабыць з’явіцца вводныя даны, адміністратар шагу і крэтыяры выходу пры перадзеі коду. Аператары должны магчымаць перзапуск шагу з вядомай точкі контролю без неабяжнага адгадвання захаванага стану. Спрыяйце цій стадыі як кантракту межа вводнымі данымі і перакананымі выходамі. Даўце назвы элементам, задайце крэтыяры успеху і адмовіцеся ад беззвучнага частковага завершэння.
const computedStats = useMemo(() => {
return expensiveAggregation(data);
}, [data]);
const handleUpdate = useCallback((id) => {
updateItem(id);
}, []);
3. useTransition: Адаптаванне да ўзаінтэресаванняў корыстувальніка
Калі працаваеце над стадзіяй 3 useTransition «Адаптаванне да ўзаінтэресаванняў корыстувальніка», спачатку запісайце умовы викорыстання: неабходныя данні, сигнал пра успех і тое, што выходзіць на падчасныя неудачы. Такі чарт дапамагае заліцваты змяны ў кодзе. Запісваючы час выканання і вартасць токена або запытку, дадзіце інфармацыю паўступна да рэзультатаў функцыяналізму. Відразка вартасці з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Расследвуйце эфекты як сінхронізацію з зовнішнім светам, а не як замену для вырахаваных значэнняў пад час атрыбутавання.
const [isPending, startTransition] = useTransition();
const handleSearch = (term) => {
startTransition(() => {
setSearchTerm(term);
// Filtering happens in the background
});
};
4. useDeferredValue: Спрыянне кращам выкананню дорогіх процэсаў
Калі працуеце з 4 стадзямі useDeferredValue Smoothing Out, спачатку запісайце шаблон кантракта: неабяжныя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемленае. Файлы сераўіса, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжнага чытання всіх элементаў. Расследжвайце эфекты як сінхронізацію з зовнішнім светам, а не як замену вырахаваных значэнняў пад час атрыбутацыі.
const deferredData = useDeferredValue(data);
// Chart receives deferredData and updates only when React has idle time
5. Вяртуалізацыя: Атрыбутацыя толькі таго, што відразлівае
Калі працуеце над стадзіяй «Толькі віртуалізацыя та рэндарынг», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал працэздання і тое, што выходзіць пад частковую нявыполненасць. Такі список дапамагае залічыцца з пазнейшымі змянамі ў коде. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не пазнейшым дапрацоўкам. Спрыяйце эфектам як сінхронізацыі з зовнішнім светам, а не як замене вырахаваных значэнняў пад час рэндарынгу. Калі працуеце над стадзіяй «Толькі віртуалізацыя та рэндарынг», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал працэздання і тое, што выходзіць пад частковую нявыполненасць. Такі список дапамагае залічыцца з пазнейшымі змянамі ў коде. Спрыяйце гэтай стадзіі як кантракту межа даннімі і перакананымі выходнымі даннымі. Даўце назвы элементам, задайце критэрыя успеху і не падтрымайце тыхія частковыя завершэння.
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>
{data[index].name}
</div>
);
<FixedSizeList
height={400}
itemCount={data.length}
itemSize={35}
width="100%"
>
{Row}
</FixedSizeList>
6. Атрыбут Lazy Loading: Раздзелэнне коду па маршрутах
Этап 6 атрыбута Lazy Loading працюе найкраща, калі яго розглядаць як параметр, які можна змерыць. Запісаўце адны ідеальны прыклад, адну ситуацыю неудачы і прыметкі па поверненню да пачатковага стану пры расшырэнні масштаба. Запісвайце часы выконання і выкалкаваныя косты токенаў або запытак разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў з’являецца рана, таму не будзе неспакою, калі маршрут пераходзіць з дэмаверсіі ў спяльныя сераўысы. Робіце процес атрыбутавання дашчыцай, а складныя вылічэнні пераводзіце пасля мемаізацыі, толькі пасля зьмерэння. Нераная мемаізацыя можа схаваць багі, вызваные застарэлымі даннымі.
const Dashboard = lazy(() => import('./views/Dashboard'));
const Analytics = lazy(() => import('./views/Analytics'));
function App() {
return (
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/" element={<Dashboard />} />
<Route path="/analytics" element={<Analytics />} />
</Routes>
</Suspense>
);
}
7. useMemoizedSelector: Оптымізацыя кантролю стану
Этап каштоўнае адбору дадзенняў з использованнем useMemoizedSelector работае наякша, калі яго розглядаць як мерыемую структуру. Запісаўце адна ідеальная прыкладна ситуацыя, адзін кейс неудачы і прыметкі па поверненню да пярвоначальнага стану пры расшырэнні сферы дзеяння. Зберагаўце настройкі за межамі коду аплікацыі. Файлы сераўнавання сяродовысі, хранілішча секрэтных дадзенняў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжнага чытання всей структуры. Зберагаўце процесы атракціі дадзенняў простымі, а складныя вычысленні пераводзіце пасля каштоўнае адбору толькі пасля ўзняцення мерыяў. Неранее каштоўнае адбору можа схаваць багі, вызваны застарэлымі параметрамі.
import { createSelector } from '@reduxjs/toolkit';
const selectFilteredData = createSelector(
(state) => state.items,
(state) => state.filterTerm,
(items, term) => items.filter(item =>
item.name.toLowerCase().includes(term.toLowerCase())
)
);
// In component:
const filteredData = useSelector(selectFilteredData);
Цыфры: да і пасля
Этап «The Numbers Before» працюе найкраща, калі яго розглядаць як мэркаваную плошчу. Зберагачыце адны ідеальны прыклад роботы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не чымось, што дадаецца пазней. Робіце процес генеравання даных дышаўным, а дорогія процесы вырахунку застаўляйце пасля мэркавання, толькі калі гэта неабходна. Неразумныя застосаванні мемацыі можу закрыць багі, зв’язаныя з застарэлымі даннымі. Этап «The Numbers Before» працюе найкраща, калі яго розглядаць як мэркаваную плошчу. Зберагачыце адны ідеальны прыклад роботы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Разглядайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўайце назвы элементам, задаюце критэрыя успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без падтверджэння.
Змена менталітэту
Для стадіі The Mindset Shift неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння пры змены коду. Аперацыйныя працавнікі должны магчыма ўвайсці крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і кост токенаў або запытаў праза функцыйнае рэзультат. Відкрытыя даны пра косцы запобегаюць неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўры. Размешчайце стан разам з компонентам, які керуе мутацыямі. Адкладанне всего ў глобальны хранільнік ускладняе выяўленне багоў, зв’язаных з часам выконання.
Апошнія заўважэнні
Для стадіі The Bottom Line неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Стан трэба размешчаць разам з компонентам, які керуе мутацыяй. Размешчэнне всього ў глобальным хранільніку ускладняе выяўленне багоў, зв’язаных з часам адпаведнай дзеяння.
Чэк-ліст для аперацый
Працюючы над стадіяй чэк-ліста для аперацый, спачатку запісайце умовы: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць пад час частковага абякання. Такі чэк-ліст дапамагае заставіць пасляўсія змены коду чыстымі.
Лепшыя маленькія, тэставаныя елементы, чым велікія скрыпты. Калі якісь крок не выйшае, адказчыкам трэба быць чыткімі, вказваючы на адзін конкрэтны элемент, а не на заплутаны ланцюг задач.
Эфекты трэба рассматрываць як сінхронізацыю з зовнішнім светам, а не як замену значэнням, якія гэтасяблі пад час адрасавання.
Зафіксавайце версіі залежнасцяў і запісаўце хэш-значэнне зображэння, якое было выкарыстоўванае пад час дэманстрацыі. Возможнасць павторэння важлівей, чым традыцыйныя знання.
Цей этап трэба рассматрываць як кантракт межаў вхідных дадзенняў і перакананых выходных рэзультатаў. Дайце назвы кожным элементам, задаць критэрыя успеху і не падтрымвайце частыя, непূরныя рэзультаты.
Эфекты трэба рассматрываць як сінхронізацыю з зовнішнім светам, а не як замену значэнням, якія гэтасяблі пад час адрасавання.
Перш чым запускать даныя стэка, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычных шляхоў і паказваце спосабы атрыбуціі. У спяльных средах неабходны ліміты частоты запытоў, пераканання ў правільнасці арендавання ресурсоў і чыста вялікі адпаведальны за змěну секрэтных даных. Валіце простую надзейнасць працы над крэатывнымі, адзінразовымі дамах.
Прыметка для d6a7f4e83dda: не кладзіце ключы прадаўцаў у репазітарый, задаце максімальную кантитатыву токеноў на сесію і зберагачыце транскрыпты празаўседы ў фіксатырах для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównанневымі.