Офлайн-режим
Вопрос
Спроектируй приложение, которое работает без сети: заметки, которые можно править офлайн.
Веди разговор вслух, как на секции. Начинать с решения - главная ошибка: первые полторы минуты только вопросы.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
уточнил, что именно должно работать офлайн: чтение, правка или всё
service worker кэширует оболочку, IndexedDB хранит данные
очередь неотправленных изменений с ключами идемпотентности
стратегия разрешения конфликтов выбрана и названа явно
индикатор состояния: офлайн, синхронизируется, разошлось
фоновая синхронизация при возврате сети
версионирование кэша: как выкатывать новую версию приложения
что нельзя делать офлайн - сказать честно, а не изображать всемогущество
Что могут спросить следом
- Как разрешать конфликт, если правили с двух устройств?
- Чем IndexedDB лучше localStorage здесь?
- Как выкатить новую версию, не сломав открытые вкладки?
Разбор
Разделяем: оболочка (HTML, JS, CSS) кэшируется service worker'ом, данные живут в IndexedDB, изменения копятся в очереди.
Очередь - главное. Каждая правка получает клиентский идентификатор и уходит на сервер при возврате сети; ключ идемпотентности не даёт продублировать при повторе.
Конфликты - вопрос, ради которого задачу и дают. Варианты, которые надо назвать: последняя запись побеждает (просто, теряет данные), слияние по полям (сложнее, работает для заметок), CRDT (дорого, зато корректно). Выбор обосновывается ценой потери: для заметок потеря правки недопустима, для счётчика просмотров - безразлична.
Индикатор состояния обязателен: пользователь должен видеть, что изменения ещё не ушли. Молчаливая потеря данных хуже честной ошибки.
И версионирование: новый service worker не должен подхватываться посреди сессии - иначе получим смесь старого и нового кода.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.