Галоўная / Артыкулы / Практычныя прытамкі: як я оптымізав медленны React-даплік без перапісву яго

Практычныя прытамкі: як я оптымізав медленны React-даплік без перапісву яго

Практычныя прыказкі: як я оптымізав медленны React-даплык без перапісву яго — паслядованасць крокаў, перакрытчыкі і месца для дадзення коду для команд, якія викорыстоўваюць гэты патэрн.

1621 слоў

Існавайце гэта як перапрацоўку ідэй з артыкула «Як я оптымізаваў медленны 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анневымі.