Галоўная / Артыкулы / Што такое React Query і як яго выкарыстоўваць у системах для прыменнага вядзення?

Што такое React Query і як яго выкарыстоўваць у системах для прыменнага вядзення?

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

2930 слоў

Наступныя прытамлівкі паказваюць практычны шлях для роботы з тэмай «Пачатак з React Query». Акцэнт ставіцца на кантракты, пераконтроўваннія і месца для коду, які можна проста адразу выкарыстоўваць, а не на мотывацыйныя аспекты. Калі працуеце на стадзіі Аптаварысу, спачатку запішыце кантракт: неабходныя даннэ, сігнал пра успех і тое, што выканаецца у разы частковага няўспэху. Такі список пераконтроўвання дапамагае заставіць пазнейшыя змены коду чыстымі. Спрыймайце гэтую стадзію як кантракт межаў між вхіднымі даннэмі і перакантролюванымі выходнымі рэзультатамі. Дайце назвы элементам, задаць критэрыя успеху і не падтрымайце частковае завершэння без паведамлення.

Стан сервера проты стану кліента

Стан сервера парадоксальна кліента працюе наяўней, калі яго спрыяваць як вимерную величыну. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце часы выканання і косты токеноў або запытак паляглі на рэзультатах функцыянальных тэстаў. Візуабельнасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Стараўцеся, каб процес адрасавання дадзеных заставаўся дышэўным, а дорогія процесы вырахоўвання пераводзіце пасля адпаведных вимероў. Неранее застосаванне мемаізацыі можа сховаць багі, вызваные застарэлымі дадзеннямі.

Традыцыйна, так мы запрашаем дадзеныя

Традыцыйнальна, такім чынам работае стэйдж, калі яго спрыяваць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да поперадньего стану перш чым расширваць масштаб. Зберагаўце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць аудытаваць, не чытаючы весь граф. Робіце процес рэндараўвання дышачым, а дорогія вычысленні пераводзіце праз мемоізацыю толькі пасля вимеравання. Нерэшаная мемоізацыя можа схаваць багі з застарэлымі параметрамі.

const [users, setUsers] = useState([])
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
useEffect(() => {
  async function fetchUsers() {
    try {
      setLoading(true)      const res = await fetch(
        "https://jsonplaceholder.typicode.com/users"
      )      const data = await res.json()      setUsers(data)
    } catch (err) {
      setError(err)
    } finally {
      setLoading(false)
    }
  }  fetchUsers()

За дапамогою React Query код вышэй становіцца такім:

За дапамою React Query этап працюе найкраща, калі яго спрыяваць як мераваемую плошчу. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па абратанню рэшынкі перад расширэнням масштаба. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Робіце процес рэндараўвання дышачым і адкладайце дорогія процесы вычыслення толькі пасля ўзятых мераванняў. Нечасова мемоізацыя можа схаваць багі, вызваные застарэлымі параметрамі.

function Users() {
  const {
    data,
    isLoading,
    error
  } = useQuery({
    queryKey: ["users"],
    queryFn: fetchUsers
  })
  if (isLoading) {
    return <p>Loading...</p>
  }  if (error) {
    return <p>Something went wrong</p>
  }  return (
    <ul>
      {data.map(user => (
        <li key={user.id}>
          {user.name}
        </li>
      ))}
    </ul>
  )
}

За дапамою React Query этап працюе найкраща, калі яго спрыяваць як мераваемую плошчу. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па абратанню рэшынкі перад расширэнням масштаба. Спрыяваць этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўце назвы элементам, задайце критэрыя успеху і адмовіцеся ад беззвучнага частковага завершэння.

Тады, як жа мы насправдзе яго выкарыстоўваем?

Как жа нам падготавіць, апрацаваць параметры, власніка крока і крэтыяры завершэння пры змены коду? Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трываласць выконання і кост токена або запыту праза функцыйнальныя рэзултаты. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмаверсіі ў спадзеленыя среды. Размешчаць стан разам з компонентам, які керуе мутацыяй. Перакладанне всего ў глобальны хранільнік ускладняе выяўленне багоў, зв’язаных з трываласцю выконання.

1. Настройка

У стадії 1 «Настройка» неабяжна прадзеявіць вхідныя даны, адпаведнага адпаведальніка крока і крэтыяры завершэння пры перадзеявленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемленае. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь лянцуг. Стан трэба размешчаць разам з компонентам, які керуе мутацыяй. Размешчэнне всего ў глобальным хранільніку ускладняе выяўленне багоў, зв’язаных з часам адпаведнення.

npm install @tanstack/react-query
const queryClient = new QueryClient();

root.render(
<QueryClientProvider client={queryClient}>
    <App />
</QueryClientProvider>
);

2. Зялучэнне дадзеных за дапамою useQuery

Для процэсу «Зялучча дадзейнаў з стадзіяй» неабходна перад зменыма коду задаць вхідныя даны, адпаведальнага за шаг і крэтыяры завершэння. Аператары должны магчымае перайсці на гэты шаг з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна аддзеўнаваць дакументацыю пра стандартны ход роботы і ход вярнення ў нормальны стан. Перапрыбуткі, людзкія перакрыцчы і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Стан неабходна размешчаць разам з компонентам, які керуе мутацыямі. Перанесенне всего ў глобальны хранільнік ускладняе выяўленне проблем з часама адпаведнаго выканання. Для процэсу «Зялучча дадзейнаў з стадзіяй» неабходна перад зменыма коду задаць вхідныя даны, адпаведальнага за шаг і крэтыяры завершэння. Аператары должны магчымае перайсці на гэты шаг з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце таму, каб гэтая стадзія выступала як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назвайце всі неабходныя элементы, задаць крэтыяры успеху і не падтрымайце бяспрыводна частковае завершэння роботы.

const { data,
isPending,
error } = useQuery({
 queryKey: ["users"],
 queryFn: fetchUsers
 })

2.1. Функцыя запита

Калі працуеце над стадзіяй 2.1 «Функцыя запита», спачатку запісайте умовы викорыстання: неабяжлівыя данні, сигнал успеху і тое, што выходзіць на падзею частковага невыпання. Такі список дапамагае заліцварыць будучыя змены ў кодзе. Запісвайце час выконання і вартасць токена або запита праз тыя ж рэзультаты функцыі. Відразлівае паказанне вартасцей запобегае неспадзячым расходам, калі працэўка пераходзіць з дамовай среды ў спяльную. Расследжвайце наследкі як сінхронізацыю з зовнішнім светам, а не як замену значэнняў, вылучаных пад час адрасавання.

async function fetchUsers() {
  const res = await fetch("/api/users")

  if (!res.ok) {
    throw new Error("Failed to fetch users")
  }

  return res.json()
}
useQuery({
  queryKey: ["users"],
  queryFn: fetchUsers
})

2.2. Ключ запита

Калі працюеце над стадзіяй 2 2 Query Key, спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі список пераконтролюе чыстасць пазнейшых змян у кодзе. Зберагайце настройкі за межамі коду прыемліка. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры. Спрэчывайце эфекты як сінхронізацыю з зямёй занэчы, а не як замену вырахаваных значэнняў пад час атрыбутавання.

3. Кэшаванне

Калі працюеце над 3 стадзямі кэшавання, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага неудачы. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам. Спрыяйце эфектам як сінхронізацыі з зовнішнім светам, а не як замене вырахаваных значэнняў пад час адрасавання. Калі працюеце над 3 стадзямі кэшавання, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага неудачы. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыяйце гэтай стадзіі як контракту межа даннімі і перакананымі выходнымі даннымі. Даўце назвы элементам, задайце правіла пераканання успеху і не прымайце тыхнавальныя частковыя рэзультаты.

4. staleTime

Этап 4 staleTime работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Запісвайце часы выконання і кост токена або запиту разам з функцыональнымі рэзультатамі. Відразлівае прадставленне костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльнаныя сераўы. Храніце процесы рэндарування простымі і адкладайце дорогія процесы вырахунку пасля адметаўвання, толькі пасля ўзяць спісаў. Неранее адметаўванне можа схаваць багі, зв’язаныя з застарэлымі параметрамі.

useQuery({
  queryKey: ["users"],
  queryFn: fetchUsers,
  staleTime: 60,000 // 60 seconds
})

Чаму нам патрэбны сталетайм??

Роботу з адаптаванням працюе найкраща, калі яе розглядаць як вимерную плошчу. Запісаце адзін ідеальны прыклад, адзін прыклад неудачы і прыметку парадоксу перад расшырэнням масштабаў. Зберагачыце настройкі праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функций павінны знаходзіцца ў адном месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагачыце процесы гэнеравання дадзеных простымі, а складныя процесы выканання пасля вимеравання — толькі за дапамою мемацыі. Неразумнае викорыстанне мемацыі можа закрыць багі, вызваные застарэлымі дадзенымі.

Розумеўце staleTime

Этап Understanding staleTime працюе найкраща, калі яго розглядаць як параметр, які можна змерыць. Зберажыце адны ідеальны прыклад роботы, адну справу з бягамі та прыметку па поверненню да пачатковага стану пры розширэнні масштаба. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль та обработка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшага доўрабатвання. Робіце процес генеравання інфармацыі дашчацкім, а складныя вырахунакі выконвайце толькі пасля змерэння. Нечасава мемоізацыя можа сховаць багі, зв’язаныя з застарэлымі даннымі. Этап Understanding staleTime працюе найкраща, калі яго розглядаць як параметр, які можна змерыць. Зберажыце адны ідеальны прыклад роботы, адну справу з бягамі та прыметку па поверненню да пачатковага стану пры розширэнні масштаба. Разглядзайце этап як кантракт межа вхіднымі даннымі та перакананымі выходнымі рэзультатамі. Даўце назвы элементам, задаце критэрыя успеху та не прабуйце прыймать часткова завершаныя рэзультаты без паведамлення.

User visits page
       ↓
Fetch users
       ↓
User navigates away
       ↓
User comes back
       ↓
Fetch users again
staleTime: 5 * 60 * 1000

5. gcTime

Для 5-го этапа gcTime неабяжна прадзеўкі, адпаведальнага за крок, і крэтарыя выходу пры перадзеўці коду. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трэба час выконання і кост токена або запыту праза функцыйнальныя рэзултаты. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі парадок пераходзіць з дэмаверсіі ў спяльныя среды. Стан трэба размешчаць разам з компонентам, які адпаведальны за мутацыю. Размешчэнне всього ў глобальным хранільніку ускладняе выяўленне багоў з часам выконання.

useQuery({
  queryKey: ["users"],
  queryFn: fetchUsers,
  gcTime: 60000
})

У чым разлік межа staleTime і gcTime?

У стадії «Яка разлік?» неабяжна прадзеўніць вхідныя даны, адпаведальную за крок і крэтыры завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемленае. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцый павінны быць у адном месца, якое працавнікі можуць аудытаваць, не чытаючы весь лянцуг задач. Стан трэба размешчаць разам з компонентам, які керуе мутацыяй. Размешчэнне всього ў глобальным хранільніку ускладняе выяўленне багоў, зв’язаных з часам адпаведнай дзеяння.

6. Перзапытка дадзеных

Для 6-й стадзіі паўтаральнага запрашэння дадзеных неабходна практычна адначаса змянай код узгадаць вхідныя даны, адпаведальнага за этап і крэтыяры завершэння. Аператары должны магчымае запускать этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна адначаса задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Практыка павтарэння спроб, перакрыцчя ад чалавека і обработка непрацэсуючых паведамленняў є частью самага продукту, а не якім-небудзь пазнейшым дапраўленнем. Стан неабходна размешчаць разам з компонентам, які керуе мутацыямі. Перанесенне всего ў глобальны хранільнік ускладняе выяўленне багоў, зв’язаных з часам адпаведнай дзеяння. Для 6-й стадзіі паўтаральнага запрашэння дадзеных неабходна практычна адначаса змянай код узгадаць вхідныя даны, адпаведальнага за этап і крэтыяры завершэння. Аператары должны магчымае запускать этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяць гэтую стадзію як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назваць всі неабходныя элементы, узгадаць крэтыяры успеху і не практыкуваць мовчанліва частковае завершэння задачы.

const { refetch } = useQuery(...)
refetch()
useQuery({
  queryKey: ["users"],
  queryFn: fetchUsers,
  refetchInterval: 30,000
})

7. Мутацыі — стварэнне, адкоректаванне, выдаленне

Калі працуеце над этапамі стварэння, адкоректавання та выдалення мутацый, спачатку запісайте умовы кантракта: неабяжлівыя данні, сигнал працэйскага успеху та тое, што выканаецца у разы ўзельнага нявыполнення. Такі чарт дапамагае заліцвачыць пасляэйшныя змены ў кодзе. Запісвайце час выканання та кост токена або запыту праза функцыйнальныя рэзултаты. Відразлівасць коста з самага пачатку запобегае неспакою, калі працэ пераходзіць з дамовай среды ў спяльнаваныя сераўеры. Расследвайце эфекты як сінхронізацію з зовнішнім светам, а не як замену значэнняў, вылучаных пад час атрыбутавання.

async function createUser(user) {
  const response = await fetch(
    "https://jsonplaceholder.typicode.com/users",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(user),
    }
  );

  if (!response.ok) {
    throw new Error("Failed to create user");
  }

  return response.json();
}
import { useMutation } from "@tanstack/react-query";

function CreateUser() {
  const mutation = useMutation({
    mutationFn: createUser,
  });

  return (
    <button
      onClick={() =>
        mutation.mutate({
          name: "John Doe",
          email: "john@example.com",
        })
      }
      disabled={mutation.isPending}
    >
      {mutation.isPending ? "Creating..." : "Create User"}
    </button>
  );
}

export default CreateUser;
Button click
    ↓
mutation.mutate(user)
    ↓
createUser(user)
    ↓
POST request
    ↓
Server

7.1. Станы мутацый

Калі працюеце над стадзіяй 7 1 Mutation States, спачатку запісайце угоду: неабяжлівыя даны, сигнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўнавання, хранальнікі секрэтных данных і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Спрэцявляйце эфекты як сінхронізацію з зовнішнім светам, а не як замену вырахаваных значэнняў пад час атрыбутавання.

const {
  mutate,
  isPending,
  isSuccess,
  isError,
  error,
  data,
} = useMutation({
  mutationFn: createUser,
});
<button
  onClick={() => mutate({ userName: "delfina ghimire" })}
  disabled={isPending}
>
  {isPending ? "Creating..." : "Create user"}
</button>

8. Кліент запыту

Калі працюеце над 8 стадзямі Query Client, спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены коду. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсць частынай продукту, а не пазнейшым дапрацоўкам. Спрыяйце эфектам як сінхронізацыі з зовнішнім светам, а не як замене вырахаваных значэнняў пад час адрасавання. Калі працюеце над 8 стадзямі Query Client, спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены коду. Спрыяйце гэтай стадзіі як контракту межа данымі і перакананымі выходнымі даннымі. Даўце назвы элементам, задайце правілы пераканання успеху і не прымайце тыхнучых частковых рэзультатаў.

9. Анавергацыя запитоў

Этап 9 «Анулювання запитаў» працюе найэфективней, калі яго розглядаюць як параметр, які можна змерыць. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры розширэнні масштаба. Запісвайце часы выконання і вартасьць токеноў чы запитаў разам з функцыйнальнымі рэзультатамі. Візуальная наявнасьць вартасцей з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Стараўцеся, каб праця з обробкай дадзеных была недорогой, і пераводзіце дарожлівыя процесы на аператыўнае запам’ятаванне толькі пасля зьмерэння. Неразумнае запам’ятаванне можа сховаць багі, вызваны застарэлымі дадзеннямі.

[
  { id: 1, userName: "delfina ghimire" },
  { id: 2, userName: "spiderman ghimire" },
]
mutation.mutate({
  userName: "ironman ghimire",
});
const queryClient = useQueryClient();
const mutation = useMutation({
  mutationFn: createUser,
  onSuccess: () => {
    queryClient.invalidateQueries({
      queryKey: ["users"],
    });
  },
});
Create Users (Mutation)
     ↓
Server data changes
     ↓
Invalidate ["users"]
     ↓
Query becomes stale
     ↓
Refetch
     ↓
UI gets fresh data

Анулювання проты падзялу дадзеных

Этап «Неяксаванне» проты «Пацерк занова» работае наяўней, калі яго розглядаць як параметр, які можна змерыць. Зафіксавайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра анулювання змян, перш чым расширваць сферу дзеяння. Зберагаюце настройкі пазыром ад коду прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функций павінны знаходзіцца ў адном месцы, куда аператары можуць адбавіць аудыт без неабяжнага чытання всіх дадзеных. Робіце процес атрыбутавання даскладным толькі пасля зьмерэння, а дорогія вычысленні застаўляйце пасля мемоізацыі. Неранняя мемоізацыя можа схаваць багі, вызваные застарэлымі параметрамі.

Вывад

Этап Заключэння працюе найкраща, калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў ёсць часткай продукту, а не чымось, што дадаецца пазней. Робіце процес генеравання даных дышаўным, а дорогія процесы вырахоўвання застаўляйце пасля меравання, толькі з выкарыстоўваннем мемаізацыі. Нерэшаная мемаізацыя можа закрыць багі, вызваны застарэлымі даннымі. Этап Заключэння працюе найкраща, калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Спрыявайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўайце назвы элементам, задаюце критэрыя успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без паведамлення.

Короткая сутнасць

Для стадіі TL DR неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры перадзяле коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан.

Чэк-ліст для аперацый

Для стадіі чэк-ліста для аперацый неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры перадзяле коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан.

Лепшыя маленькія, тэставаныя елементы, чым велікія скрыпты. Калі якісь крок не выйшае, адказнасць за гэта патрабуецца толькі ад однаго элемента, а не ад усіяўшайся сэткі працы.

Размешчайте стан разам з компонентам, які керуе змянамі. Перакладанне всего ў глобальны хранільнік ускладняе выяўленне багоў, зв’язаных з часам адпаведзення.

Напісайце кароткі посібнік: як зменяць канты, як спрачыслаць чергу, як відмовіцца ад пасляпэльнага запрацоўвання последніх дадзеных.

Спрыяйце цім этапам як даговору межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Назвайце всі элементы, задаць критэрыя успеху і не падтрымайце частковае завершэння без адпаведных падтверджэнняў.

Размешчайте стан разам з компонентам, які керуе змянамі. Перакладанне всего ў глобальны хранільнік ускладняе выяўленне багоў, зв’язаных з часам адпаведзення.

Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтрольванне прав на выкарыстоўвання ресурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзяйнасць працы замест крэатывных, адзінразовых дэманстрацый.

Запіс для 1aa45226c385: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенав на кожную сесію і зберагачыце транскрыпты празаўседы ў фіксатырах для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.