Offline-режим в приложениях на базе Quasar строится вокруг концепции прогрессивных веб-приложений (PWA) и использования Service Worker. Основная задача — обеспечить корректную работу интерфейса и логики при отсутствии сетевого соединения, а также синхронизацию данных при восстановлении связи.
Ключевые составляющие:
Quasar предоставляет встроенную поддержку PWA через режим
pwa, который активируется в конфигурации проекта.
Для включения offline-возможностей необходимо активировать PWA режим:
quasar mode add pwa
После этого в проекте появляются:
src-pwa/register-service-worker.jsquasar.config.jsВ конфигурации задаются параметры Service Worker:
pwa: {
workboxMode: 'GenerateSW', // или 'InjectManifest'
workboxOptions: {
skipWaiting: true,
clientsClaim: true
}
}
Режимы работы:
GenerateSW — автоматическая генерация Service
WorkerInjectManifest — ручное управление логикой Service
WorkerДля сложных offline-сценариев предпочтителен
InjectManifest.
Service Worker использует различные стратегии кэширования:
Сначала проверяется кэш, затем сеть:
workbox.routing.registerRoute(
({ request }) => request.destination === 'image',
new workbox.strategies.CacheFirst()
)
Используется для:
Сначала сеть, при ошибке — кэш:
new workbox.strategies.NetworkFirst()
Подходит для:
Быстрый ответ из кэша с обновлением в фоне:
new workbox.strategies.StaleWhileRevalidate()
Баланс между скоростью и актуальностью.
Файл src-pwa/custom-service-worker.js (при
InjectManifest) позволяет управлять логикой:
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request)
})
)
})
Также можно реализовать:
Quasar предоставляет плагин Network:
import { Network } from 'quasar'
if (Network.isOnline) {
console.log('Online')
} else {
console.log('Offline')
}
Отслеживание изменений:
window.addEventListener('online', () => {
console.log('Соединение восстановлено')
})
window.addEventListener('offline', () => {
console.log('Соединение потеряно')
})
Это позволяет:
Для хранения данных используются:
Простой API:
localStorage.setItem('key', JSON.stringify(data))
Ограничения:
Асинхронное хранилище для больших данных:
const request = indexedDB.open('app-db', 1)
Преимущества:
Для удобства используются библиотеки:
Основная идея — приложение должно работать без сети по умолчанию.
Принципы:
Пример логики:
При отсутствии сети действия пользователя можно сохранять и выполнять позже.
Пример:
const queue = []
function addToQueue(action) {
queue.push(action)
}
При восстановлении соединения:
window.addEventListener('online', async () => {
for (const action of queue) {
await sendToServer(action)
}
queue.length = 0
})
Service Worker может использовать Background Sync API:
self.registration.sync.register('sync-queue')
При отсутствии сети можно показывать fallback-страницы:
workbox.routing.setCatchHandler(async ({ event }) => {
if (event.request.destination === 'document') {
return caches.match('/offline.html')
}
})
Используется для:
Новая версия Service Worker не активируется автоматически.
Настройка:
workboxOptions: {
skipWaiting: true,
clientsClaim: true
}
Также можно уведомлять пользователя:
navigator.serviceWorker.addEventListener('controllerchange', () => {
window.location.reload()
})
Пример кэширования API:
workbox.routing.registerRoute(
({ url }) => url.pathname.startsWith('/api'),
new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 3
})
)
Добавление fallback:
handlerDidError: async () => {
return caches.match('/fallback-data.json')
}
const CACHE_NAME = 'app-cache-v1'
Комбинация технологий:
Алгоритм:
Логика offline может быть вынесена в boot-файл:
export default () => {
window.addEventListener('offline', () => {
console.log('Offline режим активен')
})
}
Подключение в quasar.config.js:
boot: ['offline']
В браузере:
Проверяется:
Пример:
if (localVersion < serverVersion) {
updateData()
}
Все это реализуется через Service Worker и API браузера, а Quasar обеспечивает удобную интеграцию и конфигурацию.