Progressive Web App — это веб-приложение, которое может устанавливаться на устройство и вести себя как нативное: работать офлайн, запускаться с иконки, использовать кэш и push-уведомления. Preact хорошо подходит для PWA благодаря малому размеру и совместимости с экосистемой React.
Для установки PWA на устройства требуется корректная конфигурация трёх ключевых элементов:
Манифест описывает, как приложение выглядит и ведёт себя при установке.
Пример manifest.json:
{
"name": "Preact PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#673ab7",
"icons": [
{
"src": "/icons/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
Ключевые поля:
Подключение манифеста выполняется в HTML:
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#673ab7">
Service Worker отвечает за офлайн-режим, кэширование и установку PWA. Без него установка невозможна.
Регистрация в Preact-приложении:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js');
});
}
Простейший sw.js:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('preact-cache').then(cache =>
cache.addAll([
'/',
'/index.html',
'/bundle.js'
])
)
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response =>
response || fetch(event.request)
)
);
});
Основные события:
Для сложных сценариев рекомендуется Workbox — официальный инструмент Google.
Установка:
npm install workbox-webpack-plugin --save-dev
Интеграция в Webpack:
const { GenerateSW } = require('workbox-webpack-plugin');
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true
})
]
Workbox автоматически:
Android поддерживает установку PWA напрямую из браузера Chrome.
Условия появления предложения установки:
manifest.jsonПосле выполнения условий Chrome отображает баннер установки или пункт «Установить приложение» в меню браузера.
iOS не показывает автоматический баннер. Установка выполняется вручную:
Ограничения iOS:
Дополнительно требуется указать иконки через meta-теги:
<link rel="apple-touch-icon" href="/icons/icon-192.png">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
Preact CLI предоставляет готовый шаблон PWA.
Создание проекта:
npx preact-cli create pwa my-app
Встроенные возможности:
Структура:
src/
├─ manifest.json
├─ sw.js
├─ index.js
└─ routes/
Для проверки корректности установки используются:
Lighthouse оценивает:
Service Worker обновляется только после закрытия всех вкладок приложения.
Типовой сценарий обновления:
self.addEventListener('activate', event => {
event.waitUntil(self.clients.claim());
});
Для принудительного обновления:
self.skipWaiting();
Важно учитывать, что агрессивное обновление может привести к несинхронному состоянию приложения.
Для офлайн-работы применяются:
Preact не накладывает ограничений на используемые API браузера.
При этом Preact-PWA обеспечивает:
Типичная конфигурация:
Такое приложение устанавливается на Android, iOS и десктопные платформы, сохраняя единый код и минимальный объём.