پاسخ:
من مطمئن میشم که شرایط اصلی PWA رعایت شده:
در create-react-app خیلیاش آمادهست. من manifest.json رو شخصیسازی میکنم و service worker رو رجیستر میکنم:
// index.js
import * as serviceWorkerRegistration from './serviceWorkerRegistration';
serviceWorkerRegistration.register();
همچنین از Lighthouse برای بررسی و تایید استفاده میکنم.
پاسخ:
از یک service worker استفاده میکنم تا فایلهای اصلی (HTML, CSS, JS) و در صورت نیاز API ها رو کش کنم:
// نصب اولیه و کش فایلها
self.addEventListener('install', event => {
event.waitUntil(
caches.open('static-v1').then(cache =>
cache.addAll(['/index.html', '/main.css', '/main.js'])
)
);
});
برای کش کردن API:
// واکشی با fallback به کش
self.addEventListener('fetch', event => {
if (event.request.url.includes('/api/')) {
event.respondWith(
fetch(event.request).catch(() => caches.match(event.request))
);
}
});
پاسخ:
// گوش دادن به نوتیفیکیشن جدید
self.addEventListener('push', event => {
const data = event.data.json();
self.registration.showNotification(data.title, {
body: data.body,
icon: '/icons/icon-192.png'
});
});
در React من سابسکریپشن رو ذخیره میکنم و به backend میفرستم.
پاسخ:
idb) یا localStorage.// استفاده از کش هنگام قطع بودن شبکه
const getData = async () => {
try {
const res = await fetch('/api/data');
const json = await res.json();
localStorage.setItem('cachedData', JSON.stringify(json));
return json;
} catch {
return JSON.parse(localStorage.getItem('cachedData'));
}
};
پاسخ:
پاسخ:
manifest.json در index.html:<link rel="manifest" href="/manifest.json" />
{
"name": "My App",
"short_name": "App",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"icons": [
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
beforeinstallprompt.پاسخ:
navigator.onLine.// بعد از اتصال دوباره، صف رو اجرا کن
window.addEventListener('online', () => {
// اجرا عملیات در صف
});
پاسخ:
console.log().fetch و install اجرا میشن.// پاکسازی کش قدیمی
self.addEventListener('activate', event => {
// حذف نسخههای قبلی
});
پاسخ:
web-vitals برای متریکهایی مثل FCP، LCP، CLS.پاسخ: