PWA — это технология, позволяющая веб-приложениям работать как нативные мобильные приложения с оффлайн-доступом, push-уведомлениями и установкой на домашний экран.
Используйте Create React App с PWA-шаблоном:
npx create-react-app my-pwa --template cra-template-pwa
Или добавьте PWA в существующий проект:
npm install cra-template-pwa
{
"short_name": "MyPWA",
"name": "My Progressive Web App",
"icons": [
{
"src": "/icons/icon-192x192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "/icons/icon-512x512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
В файле index.js
:
import * as serviceWorkerRegistration from './serviceWorkerRegistration';
// Измените на serviceWorkerRegistration.register() для PWA
serviceWorkerRegistration.register();
В src/service-worker.js
:
const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = [
'/',
'/index.html',
'/static/js/bundle.js',
'/static/css/main.css'
];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => cache.addAll(urlsToCache))
});
Cache First (Сначала кеш):
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
});
Network First (Сначала сеть):
event.respondWith(
fetch(event.request)
.catch(() => caches.match(event.request))
);
В public/index.html
:
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#000000" />
Добавьте в package.json
:
"pwa": {
"name": "My PWA",
"short_name": "PWA",
"start_url": ".",
"display": "standalone"
}
const Home = React.lazy(() => import('./Home'));
workbox.precaching.precacheAndRoute(self.__WB_MANIFEST);
workbox.routing.registerRoute(
new RegExp('/api/'),
new workbox.strategies.NetworkFirst()
);
chrome://inspect/#service-workers
chrome://app-manifest/
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
Фоновая синхронизация:
self.addEventListener('sync', event => {
if (event.tag === 'sync-data') {
event.waitUntil(syncData());
}
});
Push-уведомления:
self.addEventListener('push', event => {
const options = {
body: event.data.text(),
icon: '/icons/icon-192.png'
};
event.waitUntil(
self.registration.showNotification('Новое уведомление', options)
);
});
создание PWA на React требует настройки Service Worker, манифеста и стратегий кеширования. Create React App упрощает начальную настройку, но для продвинутых возможностей потребуется ручная конфигурация Workbox. Всегда тестируйте PWA в разных условиях и соблюдайте best practices для обеспечения надежной работы.