PWA(Progressive Web App)是一种可以提升网站用户体验的技术。它可以使网站具有类似原生应用的功能,比如离线访问、推送通知、添加到主屏幕等。本文将介绍如何利用 PWA 技术提升网站用户体验,并提供实用的方法和示例代码。
1. 添加到主屏幕
PWA 可以让用户将网站添加到主屏幕,实现快捷启动和类似原生应用的体验。要实现这一功能,需要在网站的 manifest.json 文件中添加以下代码:
// www.javascriptcn.com code example
{
"name": "My PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"icons": [
{
"src": "/icon.png",
"sizes": "192x192",
"type": "image/png"
}
]
}其中,name 和 short_name 分别表示网站的全名和简称,start_url 表示网站的起始页,display 表示网站的显示方式,可以设置为 standalone、fullscreen、minimal-ui 或 browser。icons 表示网站的图标,可以添加多个不同尺寸的图标。
在网站中添加以下代码,可以让用户在移动设备上点击添加到主屏幕:
<link rel="manifest" href="/manifest.json"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <link rel="apple-touch-icon" href="/icon.png">
其中,link rel="manifest" href="/manifest.json" 表示加载 manifest.json 文件,meta name="apple-mobile-web-app-capable" content="yes" 表示可以将网站添加到主屏幕,meta name="apple-mobile-web-app-status-bar-style" content="black" 表示状态栏的颜色,可以设置为 black、black-translucent 或 default。link rel="apple-touch-icon" href="/icon.png" 表示添加网站的图标。
2. 离线访问
PWA 可以让网站实现离线访问,即使用户没有网络也可以访问网站。要实现这一功能,需要使用 Service Worker 技术。在网站中添加以下代码,可以注册 Service Worker:
// www.javascriptcn.com code example
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log('Service Worker registered:', registration);
}).catch(function(error) {
console.log('Service Worker registration failed:', error);
});
});
}其中,/sw.js 表示 Service Worker 的文件路径。在 sw.js 文件中,可以实现缓存网站的静态资源,以便在离线状态下访问。以下是一个示例代码:
// www.javascriptcn.com code example
const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = [
'/',
'/index.html',
'/styles.css',
'/script.js',
'/icon.png'
];
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Cache opened');
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
console.log('Cache hit:', event.request.url);
return response;
}
console.log('Cache miss:', event.request.url);
return fetch(event.request);
})
);
});其中,CACHE_NAME 表示缓存的名称,urlsToCache 表示需要缓存的资源列表。在 install 事件中,可以打开缓存并将资源添加到缓存中。在 fetch 事件中,可以判断资源是否已经缓存,如果已经缓存则直接返回缓存的资源,否则从网络中获取资源并添加到缓存中。
3. 推送通知
PWA 可以让网站实现推送通知,即使用户没有打开网站也可以收到通知。要实现这一功能,需要使用 Push API 技术。以下是一个示例代码:
// www.javascriptcn.com code example
if ('Notification' in window && 'serviceWorker' in navigator) {
Notification.requestPermission().then(function(permission) {
if (permission === 'granted') {
navigator.serviceWorker.ready.then(function(registration) {
registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array('...')
}).then(function(subscription) {
console.log('Subscription:', subscription);
}).catch(function(error) {
console.log('Subscription failed:', error);
});
});
}
});
}
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}其中,Notification.requestPermission() 表示请求通知权限,navigator.serviceWorker.ready 表示 Service Worker 准备就绪,registration.pushManager.subscribe() 表示订阅推送通知。applicationServerKey 表示推送服务的公钥,可以使用 Web Push 技术生成。urlBase64ToUint8Array() 是一个辅助函数,用于将 base64 编码转换为 Uint8Array 类型。
在服务器端,可以使用 Web Push 技术向订阅者发送推送通知。以下是一个示例代码:
// www.javascriptcn.com code example
const webPush = require('web-push');
webPush.setVapidDetails(
'mailto:your-email@example.com',
'publicKey',
'privateKey'
);
webPush.sendNotification(subscription, payload).then(function(response) {
console.log('Push notification sent:', response);
}).catch(function(error) {
console.log('Push notification failed:', error);
});其中,setVapidDetails() 表示设置 VAPID(Voluntary Application Server Identification)参数,包括邮件地址、公钥和私钥。sendNotification() 表示发送推送通知,subscription 表示订阅信息,payload 表示通知的内容。
结语
PWA 技术可以大大提升网站的用户体验,包括添加到主屏幕、离线访问和推送通知等功能。在实现这些功能时,需要使用一些新的技术,比如 Service Worker、Push API 和 Web Push。本文提供了实用的方法和示例代码,希望能够帮助前端开发者更好地利用 PWA 技术。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d29c15a941bf71344fe966