IndexedDB — гэта не толькі сховышча браузера: як стварыць
IndexedDB — гэта не простая схованка ў прыглядары: можна ствараць веб-дзеянні, якія працуюць без падключэння да Інтэрнету, за дапамою справжней базы дадзэння ў прыглядары, сховішчаў об’ектаў, індэксаў і правільна арганізаваных транзакцый.
Крыніцы: IndexedDB Isn’t Just Browser Storage: How to Build Offline-First Web Apps
У гэтым карыце практычным напамінанні перакладзенаецца шлях ад сыр'ёў да рабочай сістэмы для: «IndexedDB — гэта не проста сховішча браузера: як ствараць веб-дапрыямлінутыя прыклады без падключэння да Інтарнету». Акцэнт ставіцца на практычныя крокі, чысткія пераконтрацыі і код, які можна проста дадзіць у рэпазітарый без неабяснення меты. У стадыўцы «Аптаварыс» неабходна з'явіць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перадзеўсці крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест амаль неконтрольваных скрыптов. Калі крок не выйшоў, прычына нехарактэрыстыкі должна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцужок карацей.
localStorage больш не ўсё
Калі працюеце над стадзіяй «localStorage больш не дапрацоўвае», спачатку запісаце кантракт: неабходныя даны, сігнал пра успех і тое, што выходзіць пад частым нявыпаннем. Такі спіс контроля дапамагае заліцьваты змяны ў кодзе пазней. Спрэцьвачаце гэтую стадзію як кантракт межа данымі, якія вносзяцца, і перакананымі рэзультатамі. Даце назвы элементам, задаце крытэрыя успеху і не падтрымвайце тыхі частыя завершэння задання. Замерьце ступень запам’ятоввання на фіксаванай сэтцы запітаў прычым рэгулюванні падказак. Частая змена падказак рэдка калі вылечвае слабую сістэму адзыскання інформацыі.
localStorage.setItem("theme", "dark");
const theme = localStorage.getItem("theme");
localStorage.setItem(
"user",
JSON.stringify(user)
);
const user = JSON.parse(
localStorage.getItem("user")
);
50,000 products
10,000 orders
Thousands of customer records
Offline mutations
Synchronization metadata
IndexedDB — гэта база даных унутры браузера
Калі працюеце над этапам «IndexedDB — гэта база даных», спачатку запісайце умовы вікорыстоўвання: неабходныя даны, сігнал пра успех і тое, што выходзіць на частым невяскам. Такі спіс дапамагае заліцварыць можлівыя змены ў кодзе. Запісуйце час выканання аперацый, а таксама вартасць токенаў чы выкарыстоўваных запітаў разам з функцыональнымі рэзультатамі. Відразлівая вартасць зусім спачатку запобегае неспакойным рахункам, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўысы. Перад налаштаванням запітоў пераканайцеся, як сістэма адпавідае на фіксованыя наборы запітаў. Частая зміна формулазавання запітоў рэдка калі можа паспрабаваць выправіць слабкую эфектыўнасць пошуку.
Web Application
│
▼
IndexedDB
│
├── Users
├── Products
├── Orders
├── Messages
└── Pending Sync
Основныя концэпты
Калі працуеце над стадзіяй «Асновныя концэпцыі», спачатку запішыце умовы вярбавання: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частковыя аберанціі. Такі спіс дапамагае залічваць пазнейшыя змены ў кодзе чыстаюча.
База дадзеных
Этап базы дадзэнай работае наяўней, калі яго спрыяваць як меравальную плошчу. Зафіксавайце адны ідэальны прыклад, адзін прыклад неудачы і запіс пра абратэрэйшчык перш чым расшырваць масштабы. Спрыяйце гэтым этапам як кантракту между вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць крытэрыя успеху і адмовіцеся ад тыхняго частковага завершэння без паведамлення. Раздзеліце політыку часткавага абрабатвання дадзэнай ад політыкі ўтрымання іх. Змена адной з яных не павінна вымагаць перапісвання другой, калі зменяюцыся паказнікі якасці.
my-app-db
Хранэнне об’ектаў
Этап Object Store працюе найкрашча, калі яго розглядаць як параметрызаваную плошчу. Зафіксавце адны ідэальны прыклад працы, адну сітуацыю неудачы і прыметкі па поверненню да пачатковага стану пры розшырэнні масштаба. Запісвайце часы выканання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівая візуабельнасць костаў з самага пачатку запобегае неспакою з боку расчыткаў, калі працэс пераходзіць з дамовай асяроддзя ў спакульнаныя сераўы. Раздзеляйце правілы частковага апрацоўкі дадзеных і правілы ўтрымання іх. Змена аднаго з яных не должна вымагаць перапісвы другога, калі зменяюцца паказнікі якосці.
users
orders
products
Ключ
Этап Key работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Хавайце настройкі за межамі коду прыемлі. Файлы сераўнавання, храненні секрэтных даных і флагі функцый павінны знаходзіцца ў адном месцы, куда аператары можуць аўдытаваць іх, не чытаючы весь граф. Раздзеляйце політыку часткавання і політыку выявлення. Змена адной з яных не павінна вымагаць перапісвання другой, калі зменяюцыся паказнікі якосці. Этап Key работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, неудача павінна адносіцца да адной відповядачнай часткі, а не да заплутанага ланцоўка дзеяння.
user_123
order_456
Індэкс
Для этапы індэксавання неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цій этапы як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначыць крэтыры успеху і адмовіцеся ад бяспрэчнага частковага завершэння. Цітуйце тыя часткі, якія фактычна лежалі в основе адпаведнай адказы. Без цітатаў аператары не зможаць разлічыць галюцынацію ад прасоў у індэксаванні.
orders
├── id
├── customerId
├── status
└── createdAt
customerId
Транзакцыя
Для этапы адміністрування транзакцый неабяжна ўскладніць параметры вхідных дадзеных, адпаведнага власніка крока і крэтыніяў завершэння пры перадзеяванні коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы пра схованы стан. Запісваць трываласць выканання і кост токенаў або запытаў праза функцыйнае рэзультат. Відкрытыя даныя пра косцы запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Указваць часткі тэксту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аператары не можуць разлічыць галюцынацію ад прасоў у індэксаванні.
Просты прыклад
Для этапы «Апросты прыклад» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзеі коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыкладнага праграмы. Файлы сераўіса, хранальнікі секрэтных даных і флагі функцыйяў павінны быць у адном месца, якое аперацыйныя працавнікі могу пераглядаць, не чытаючы весь ланцуг задач. Паказваць трэба тыя часткі тэксту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цытатаў аперацыйныя працавнікі не можу разлічыць галюцынацію ад працягу індэксавання. Для этапы «Апросты прыклад» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзеі коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выканаецца, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцуг задач.
const request = indexedDB.open("MyAppDB", 1);
request.onupgradeneeded = () => {
const db = request.result; db.createObjectStore("users", {
keyPath: "id"
});
};request.onsuccess = () => {
const db = request.result; console.log("Database opened");
};
const transaction = db.transaction(
"users",
"readwrite"
);
const store = transaction.objectStore("users");store.put({
id: "user_123",
name: "Alex",
email: "alex@example.com"
});
const transaction = db.transaction(
"users",
"readonly"
);
const store = transaction.objectStore("users");const request = store.get("user_123");request.onsuccess = () => {
console.log(request.result);
};
Чаму важны індэксы
Калі працуеце над этапам «Чаму важны індэксы», спачатку запісайце угоду: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у случае частковага невыпання. Такі спіс пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрэчвайце гэты этап як угоду межа данымі і перакананымі выходамі. Дайце назвы элементам, задаце крытэрыі успеху і не падзеўляйцеся частковым завершэнням без паведамлення. Змяркуйце рывень вярнага аднаходжэння на фіксаванай сэтке запытаў прычым рэгулюванні падказак. Частае змена падказак рэдка калі вярнуе слабую працэздатнась аднаходжэння інформацыі.
100,000 orders
All orders for customer_123
orders
│
├── Primary Key: id
│
└── Index: customerId
customerId = customer_123
│
▼
Index
│
▼
matching orders
Транзакцыі маюць большое значэнне, чым здаецца
Калі працюеце над стадзіяй «Абароткі ўжо важлівейшыя», спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі спіс пераканальвае правядзіць чыстыя змены коду пазнейша. Запісвайце часы выканення і кост токена або запіту праза функцыональнымі рэзультатамі. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя. Замерьце рэткі адзыв на фіксаваныя наборы запытанняў прычым рэгулюванні прапазаў. Частыя змены прапазаў рэдка калі-небудзь вылечваюць слабую сістэму адзыва.
Transaction
│
├── Create Order
├── Create Order Items
└── Create Sync Job
│
▼
COMMIT
ROLLBACK
IndexedDB адкрывае можлівасць архітэктуры, якая працюе без падключэння да інтарнету
Калі працуеце над стадзіяй «IndexedDB – архітэктура, якая працюе без сеткі першым чынам», спачатку запісайце умовы вярбавання: неабяжлівыя даныя, сігнал працэйскага успеху і тое, што выходзіць на частым неудачам. Такі спіс дапамагае заліцьваты пазнейшыя змены коду. Храніце настройкі парадульна ад коду прыемлі. Файлы сераўіснага сэрвісу, храненні секрэтных дадзенаў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аўдыт без неабяжлівага чытання всей структуры. Перад налаштаваннем запытаў пераканайцеся ў працы сістэмы на фіксованым наборэ запытаў. Частыя змены запытаў рэдка калі выправляюць слабую эфектыўнасць адзысквання дадзенаў. Калі працуеце над стадзіяй «IndexedDB – архітэктура, якая працюе без сеткі першым чынам», спачатку запісайце умовы вярбавання: неабяжлівыя даныя, сігнал працэйскага успеху і тое, што выходзіць на частым неудачам. Такі спіс дапамагае заліцьваты пазнейшыя змены коду. Валіце маленькія, тэставаныя елементы над вялікімі скрыптамі. Калі якісь крок не выйшаў, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцоўкі задач.
No Internet
↓
Application stops working
┌──────────────┐
│ Web App │
└──────┬───────┘
│
┌──────▼───────┐
│ IndexedDB │
└──────┬───────┘
│
┌──────▼───────┐
│ Sync Engine │
└──────┬───────┘
│
Internet?
/ \
No Yes
│ │
▼ ▼
Stay API
Local │
▼
Server
Шаблон выходных дадзеных у прыгружальніка
Шаблон выходных дадзеных на данай стадыі працюе найкрашча, калі яго розглядаюць як меравальную плошчу. Запісаўце адна ідэальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштаб. Разглядзіце гэту стадыю як кантракт межа вхіднымі дадзенымі і перакананымі выходнымі. Даўце назвы артыфактам, задаце крытэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Раздзеліце політыку частковага абрабаткі дадзеных ад політыкі ўзяць іх збераганых. Змена адной з іх не павінна вымагаць перапісвання другой, калі зменяюцыся паказнікі якосці.
orders
outbox
{
id: "event_123",
type: "ORDER_CREATED",
aggregateId: "order_456",
payload: {...},
status: "pending",
createdAt: 1724930000
}
IndexedDB
│
▼
Pending Outbox Events
│
▼
Sync Worker
│
▼
API
│
▼
Server
pending
↓
synced
Але афляйн-сінхронізацыя стварае новыя проблемы
Сінхронізацыя But Offline працуе наўрадзей, калі яе розглядаць як мерыябельную паверхню. Запісайце адны ідэальны прыклад, адну сітуацыю неудачы і прыметкі па поверненню да пярвоначальнага стану пры розшырэнні масштаба. Запісвайце часы выканання і косты токена або запіта разам з функцыональнымі рэзультатамі. Відразлівае прадстаўленне костаў запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўысы. Раздзеляйце політыку частковага апрацоўкі дадзеных і політыку ўтрымання іх. Змена адной з яных не должна вымагаць перапісвы другой, калі зменяюцца паказнікі якосці.
Name = "John"
Name = "Jonathan"
Пяршы варыант выграе
Этап «Пярэдні запіс выграе» працюе наўзярэджэй, калі яго спрыяваць як меравальную плошчу. Зберагачыце адну ідэальную версію, адзін прыклад неудачы і запіс пра вярнэнне да поперадней версіі перш чым расшырваць сферу дзеяння. Храніце настройкі парадульна коду прыемлі. Файлы сераўіса, базы секрэтных даных і пазнакі функцый крануцца на адным месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх дадзеных. Раздзеляйце правілы часткавання і правілы выкарыстоўвання дадзеных. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцыся паказчыкі якосці. Этап «Пярэдні запіс выграе» працюе наўзярэджэй, калі яго спрыяваць як меравальную плошчу. Зберагачыце адну ідэальную версію, адзін прыклад неудачы і запіс пра вярнэнне да поперадней версіі перш чым расшырваць сферу дзеяння. Валіце малыя, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача павінна адносіцца да адной адпаведальнасці, а не да заплутанага ланцоўка дзеяння.
Перамога сервера
Для этапы «Перамога сервера» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяць гэтай этапы як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даць назвы артыфактам, узначыць перакананні успеху і адмовіцца ад беззвучнага частковага завершэння. Цітаваць тыя часткі, якія фактычна сталі падставай для адпаведнай адказы. Без цітатаў аперацыйныя працавнікі не зможуць адразліць галюцынацыю ад прасоў у індэксаванні.
Перамога кліента
Для этапы «Кліент выграў» неабходна пазначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры перадзеі коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выканання і вартасць токенаў або запытак палягліва разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне вартасцей запобегае неспадзяваным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя. Указваць тые часткі тэксту, якія фактычна ляглі в основу адпаведнай адказы. Без цых цітатаў аператары не можуць разлічыць галюцынацію ад прасоў у індэксаванні.
З’еднанне на рэвэле поляў
Для этапы з’еднання на рэгле поля неабяцо практычна апрацаваць вхідныя даны, выконавца крока і крэтыніяя для завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымаць перапрацоўваць крок з вядомага пункту контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемленае. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцый павінны быць у адном месца, якое працавнікі можуць пераглядаць, не чытаючы весь ланцуг аперацый. Неабяцо цітаваць тые часткі тэксту, якія фактычна лежаць у падставе адпаведнай адказы. Без цітатаў працавнікі не можуць адразнаць галюцынацыю ад працягу індэксавання. Для этапы з’еднання на рэгле поля неабяцо практычна апрацаваць вхідныя даны, выконавца крока і крэтыніяя для завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымаць перапрацоўваць крок з вядомага пункту контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выканаецца, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцуг аперацый.
Расляянне канфліктаў
Кал працуеце над стадзіяй расляяння канфліктаў, спачатку запішыце контракт: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыятлівае ставленне да гэтай стадзіі значыць спрыятлівае ставленне да контракта межу данымі і перакананымі выходамі. Даць назву кожнам элементам, задаць крытэрыя успеху і не падзеўляцца частковым завершэнням без паведамлення. Перад налаштовваннем запітоў пераканаце працу на фіксованым наборы запітанняў. Частае змена запітоў рэдка калі выправляе слабую эфектывнасць адзысквання інформацыі.
Ідэмпатэнтнасць таксама мае значэнне
Калі працуеце над этапам «Idempotency Matters Here Too», спачатку запісайце умовы вікорыстоўвання: неабходныя даныя, сігнал пра успех і тое, што выходзіць пад частковым невяскам. Такі спіс дапамагае заліцьваты пазнейшыя змены ў кодзе. Запісвайце час выканання і вартасць токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакою, калі працэс пераходзіць з дамо-версіі ў спяльныя сераўеры. Перад налаштаваннем запітоў пераканайцеся, што сістэма правільна вяртае даныя на фіксаваны набор запытанняў. Частае зміненне формул запытанняў рэдка калі-небудзь выправляе слабкую эфектыўнасць пошуку.
ORDER_CREATED
Request 1 → SUCCESS
Request 2 → SUCCESS
clientMutationId = "mutation_123"
UNIQUE(clientMutationId)
Не трэба спрыяжаць IndexedDB з базай дадзенаў сервера
Калі працуеце над этапам «Не трэба ставіцца да IndexedDB» спачатку запісайце умовы вікорыстання: неабяжлівыя даныя, сігнал працэйскага успеху і тое, што выканаецца у разе частковага невыпалення. Такі спіс дапамагае заліцьваты пасляэтапныя змены коду.
Server
│
PostgreSQL
│
▼
API
▲
│
Sync Layer
▲
│
IndexedDB
▲
│
Web App
Што трэба зберагчы?
Этап «Што трэба зберагчы» працюе наяўней, калі яго спрыяваць як мерыемую плошчу. Зафіксавайце адны ідэальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Спрыяйце гэтым этапам як даговор між вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць крытэрыя успеху і не падзеўляйцеся частым, непূরным выкананнем задач. Раздзеліце правілы частковай обработкі дадзенняў ад правіл ўтрымання іх. Змена адных не павінна прымусваць перапісванне іншых, калі змянююцыся показнікі якосці.
Products
Recent Orders
Customer Data
Drafts
User Preferences
Offline Mutations
Sync Metadata
Зберагчы не ў меры безлімітны
Этап «Зберохват не ў безлімітных мерах» працюе найэфектывней, калі яго розглядаць як віміроўваную паверхню. Запісайце адна ідэальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расшырваць масштабы. Запісвайце часы выканання і косты токеноў або запітаў разам з функцыональнымі рэзультатамі. Візуабельнасць костаў з самага пачатку запобегае неспакою з боку рахунковых підрахункаў, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Раздзеляйце політыку частковага апрацоўкі дадзеных і політыку ўтрымання іх. Змена адной з яных не должна вымагаць перапісвання другой, калі зменяюцыся показнікі якосці.
IndexedDB за замовчаннем не ўяўляе сабою кэш
IndexedDB Is Not a stage лепша працюе, калі яе спрыяваць як меравальную паверхню. Зберагачыце адны ідэальны прыклад працы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Храніце настройкі за межамі коду прыемленасці. Файлы сяродавішняе сераўедзбору, храненні секрэтных даных і флагі функцый павінны знаходзіцца ў адном месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Раздзеляйце правілы частковага апрацоўкі дадзеных ад правіл адчынення. Змена ў одных не павінна вымагаць перапісву іншых, калі зменяюцыся паказчыкі якосці. IndexedDB Is Not a stage лепша працюе, калі яе спрыяваць як меравальную паверхню. Зберагачыце адны ідэальны прыклад працы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Вядомей выбірайце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцоўкі дзеянняў.
Практычная архітэктура
Для этапы «Практычная архітэктура» неабяжна ўзначыць вхідныя даны, адпаведальнага за выкананне крока і крэтырыя завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабяжнага вычыслення захаваных станоў. Спрыяйце гэтай этапы як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначыць крэтырыя успеху і адмовіцеся ад беззвучнага частковага завершэння. Цітуйце тыя часткі, якія фактычна лежалі в основе адпаведнай адказы. Без цітаў аператары не зможаць розразліць галюцынацыю ад прасоў у індэксаванні.
┌───────────────┐
│ Web Client │
└───────┬───────┘
│
┌──────────▼──────────┐
│ Application State │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ IndexedDB │
│ │
│ Products │
│ Orders │
│ Drafts │
│ Outbox │
│ Sync Metadata │
└──────────┬──────────┘
│
Sync Engine
│
┌────────▼────────┐
│ API │
└────────┬────────┘
│
┌────────▼────────┐
│ Database │
└─────────────────┘
Звычныя памылкі
Для этапы «Звычныя памылкі» неабяжна ўзначыць вхідныя даны, адпаведальнага за выкананне крока і крэтырыя завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабяжнага вычыслення захаваных станоў.
Памылка 1: Іспользованне localStorage для усяго
Памылка 2: Спрыяванне IndexedDB як стацыонарнага крыніцы правды
Памялка 3: Ігнараванне суперсцэнаў
Памялка 4: Забыванне пра дублюванне сінхронізацыі
Памялка 5: Зберагачванне усяго
Памялка 6: Праектаванне падтрымкі без інтэрнэту на завершальным этапе
Большая наука
Заключныя мысляванні
Browser
↕
Server