Практычныя прытамулі: IndexedDB — гэта не толькі сховышча браузера: як стварыць
Практычныя прыказкі: IndexedDB — гэта не толькі сховішча браузера: як стварыць контракты, перакрыцція і месца для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым карыце практычным напамінанні перакладзенаецца шлях ад сыр'ёў да рабочай системы для: «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