前端 PWA:别再开发原生应用了,Web 应用也能做到
什么是前端 PWA?
PWA(Progressive Web App)是一种结合了 Web 应用和原生应用优点的应用形式。别以为 PWA 只是一个网页,它可以像原生应用一样安装到设备上,提供离线访问、推送通知等功能。
为什么需要前端 PWA?
- 无需安装:用户可以直接访问,无需从应用商店下载
- 离线访问:即使在没有网络的情况下也能访问应用
- 推送通知:可以像原生应用一样发送推送通知
- 安装到主屏幕:可以添加到设备主屏幕,提供类似原生应用的体验
- 响应式设计:在不同设备上都能提供良好的用户体验
- 性能优化:加载速度快,使用流畅
- 安全可靠:通过 HTTPS 提供安全的访问
前端 PWA 核心技术
1. Service Worker
Service Worker 是 PWA 的核心技术,负责缓存资源、处理离线请求、推送通知等。
// service-worker.js const CACHE_NAME = 'my-pwa-cache-v1'; const urlsToCache = [ '/', '/index.html', '/styles.css', '/script.js', '/images/logo.png' ]; // 安装 Service Worker self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); }); // 激活 Service Worker self.addEventListener('activate', (event) => { const cacheWhitelist = [CACHE_NAME]; event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheWhitelist.indexOf(cacheName) === -1) { return caches.delete(cacheName); } }) ); }) ); }); // 处理网络请求 self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) .then((response) => { if (response) { return response; } return fetch(event.request) .then((response) => { if (!response || response.status !== 200 || response.type !== 'basic') { return response; } const responseToCache = response.clone(); caches.open(CACHE_NAME) .then((cache) => { cache.put(event.request, responseToCache); }); return response; }); }) ); }); // 处理推送通知 self.addEventListener('push', (event) => { const data = event.data.json(); const options = { body: data.body, icon: '/images/icon.png', badge: '/images/badge.png', vibrate: [100, 50, 100], data: { url: data.url } }; event.waitUntil( self.registration.showNotification(data.title, options) ); }); // 处理通知点击 self.addEventListener('notificationclick', (event) => { event.notification.close(); event.waitUntil( clients.openWindow(event.notification.data.url) ); });2. Web App Manifest
Web App Manifest 是一个 JSON 文件,用于定义应用的名称、图标、主题色等信息,使应用可以被安装到设备主屏幕。
{ "name": "My PWA App", "short_name": "My PWA", "description": "A progressive web app example", "start_url": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#007bff", "icons": [ { "src": "/images/icons/icon-72x72.png", "sizes": "72x72", "type": "image/png", "purpose": "any maskable" }, { "src": "/images/icons/icon-96x96.png", "sizes": "96x96", "type": "image/png", "purpose": "any maskable" }, { "src": "/images/icons/icon-128x128.png", "sizes": "128x128", "type": "image/png", "purpose": "any maskable" }, { "src": "/images/icons/icon-144x144.png", "sizes": "144x144", "type": "image/png", "purpose": "any maskable" }, { "src": "/images/icons/icon-152x152.png", "sizes": "152x152", "type": "image/png", "purpose": "any maskable" }, { "src": "/images/icons/icon-192x192.png", "