本文将带你一步步制作一款基于阿里云的动漫名字分享 H5 渐进式 Web 应用,通过本文,你将学习到以下内容:
- PWA 的基本概念和特点
- 如何使用阿里云存储和 CDN 服务
- 如何制作 H5 渐进式 Web 应用
- 如何使用 Service Worker 实现离线缓存和推送通知
什么是 PWA
PWA(Progressive Web App)是一种渐进式 Web 应用,可以提供类似 Native App 的用户体验。它具有以下特点:
- 可靠性:PWA 可以在不稳定的网络环境下正常工作,并且可以缓存部分数据,实现离线访问。
- 快速:PWA 采用 Service Worker 技术,可以预缓存资源,提高应用的访问速度。
- 类似 Native App 的用户体验:PWA 可以实现 Add to Home Screen、推送通知等功能,给用户带来类似 Native App 的体验。
阿里云存储和 CDN 服务
阿里云提供了丰富的云存储和 CDN 服务,包括对象存储 OSS、文件存储 NAS、表格存储 TableStore 等。这些服务可以帮助我们存储和分发静态资源,提高应用的访问速度和可用性。
在本文中,我们将使用阿里云的 OSS 存储和 CDN 服务。OSS 是一种对象存储服务,可以存储任意类型的文件,同时提供了丰富的 API 和 SDK,方便我们在应用中使用。CDN 是一种内容分发网络,可以将静态资源缓存在全球各地的节点上,加速资源的访问。
制作 H5 渐进式 Web 应用
准备工作
在开始制作 H5 渐进式 Web 应用之前,我们需要准备以下工作:
- 注册阿里云账号,并开通 OSS 和 CDN 服务。
- 安装 Node.js 和 npm。
- 创建一个空的项目目录。
创建基本结构
在项目目录下,创建以下文件和目录:
- index.html - manifest.json - service-worker.js - assets/ - css/ - main.css - js/ - main.js
其中,index.html
是应用的入口文件,manifest.json
是 PWA 的配置文件,service-worker.js
是 Service Worker 的脚本文件,assets/
目录下存放应用的静态资源。
编写基本结构
打开 index.html
文件,添加以下代码:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="theme-color" content="#f00"> <title>动漫名字分享</title> <link rel="stylesheet" href="./assets/css/main.css"> <link rel="manifest" href="./manifest.json"> </head> <body> <h1>动漫名字分享</h1> <p>敬请期待...</p> <script src="./assets/js/main.js"></script> </body> </html>
其中,meta
标签用于设置页面的元信息,link
标签用于加载样式表和 PWA 的配置文件,script
标签用于加载脚本文件。
配置 PWA
打开 manifest.json
文件,添加以下代码:
{ "name": "动漫名字分享", "short_name": "动漫名字", "icons": [{ "src": "./assets/images/icon-192.png", "type": "image/png", "sizes": "192x192" }, { "src": "./assets/images/icon-512.png", "type": "image/png", "sizes": "512x512" } ], "start_url": "/index.html", "display": "standalone", "background_color": "#f00" }
其中,name
和 short_name
分别是应用的全称和简称,icons
是应用的图标,start_url
是应用的起始页面,display
是应用的显示方式,background_color
是应用的背景色。
注册 Service Worker
打开 service-worker.js
文件,添加以下代码:
const CACHE_NAME = 'my-site-cache-v1'; const urlsToCache = [ '/', '/index.html', '/assets/css/main.css', '/assets/js/main.js', '/assets/images/icon-192.png', '/assets/images/icon-512.png' ]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(CACHE_NAME) .then(function(cache) { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); }); self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request); }) ); });
其中,CACHE_NAME
是缓存的名称,urlsToCache
是需要缓存的静态资源。install
事件用于缓存静态资源,fetch
事件用于从缓存中获取资源,如果没有缓存,则从网络获取。
部署应用
将应用的静态资源上传到阿里云 OSS 中,然后在阿里云 CDN 中配置加速。在 index.html
文件中,将静态资源的 URL 替换为 CDN 的 URL。
至此,我们已经完成了一款基于阿里云的动漫名字分享 H5 渐进式 Web 应用的制作。下面,我们将介绍如何使用 Service Worker 实现离线缓存和推送通知。
离线缓存
在 Service Worker 中,我们可以使用 Cache API 实现离线缓存。Cache API 提供了一组方法,可以将资源缓存到本地,然后在离线状态下从缓存中获取资源。
缓存策略
在使用 Cache API 缓存资源时,需要考虑缓存策略。常见的缓存策略有以下几种:
- Cache First:优先从缓存中获取资源,如果没有缓存,则从网络获取。
- Network First:优先从网络获取资源,如果网络请求失败,则从缓存中获取。
- Cache Only:只从缓存中获取资源,如果没有缓存,则返回错误。
- Network Only:只从网络获取资源,如果网络请求失败,则返回错误。
- Stale While Revalidate:从缓存中获取资源,并同时发起网络请求,如果网络请求成功,则更新缓存。
缓存静态资源
在前面的例子中,我们已经使用 Service Worker 缓存了静态资源。下面是一个更完整的例子:
const CACHE_NAME = 'my-site-cache-v1'; const urlsToCache = [ '/', '/index.html', '/assets/css/main.css', '/assets/js/main.js', '/assets/images/icon-192.png', '/assets/images/icon-512.png' ]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(CACHE_NAME) .then(function(cache) { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); }); self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request); }) ); });
在 install
事件中,我们将需要缓存的资源添加到缓存中。在 fetch
事件中,我们从缓存中获取资源,如果没有缓存,则从网络获取。
缓存 API 响应
除了缓存静态资源以外,我们还可以使用 Service Worker 缓存 API 响应。下面是一个例子:
self.addEventListener('fetch', function(event) { if (event.request.url.startsWith('https://api.example.com')) { event.respondWith( caches.open('api-cache') .then(function(cache) { return cache.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request) .then(function(response) { cache.put(event.request, response.clone()); return response; }); }); }) ); } else { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request); }) ); } });
在这个例子中,我们使用 startsWith
方法判断请求的 URL 是否以 https://api.example.com
开头,如果是,则将响应缓存到 api-cache
中,否则按照之前的方式从缓存或网络获取资源。
缓存 HTML 页面
在使用 Service Worker 缓存 HTML 页面时,需要考虑页面的更新。如果页面已经更新,但缓存中的页面还是旧的版本,用户将看不到最新的内容。
为了解决这个问题,我们可以使用 Cache API 的 match
方法,检查缓存中的页面是否过期。如果过期,则从网络获取最新的页面,并将其缓存到本地。
下面是一个例子:
self.addEventListener('fetch', function(event) { if (event.request.mode === 'navigate') { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { const maxAge = 60 * 60 * 24; const date = new Date(response.headers.get('date')); if (date && (Date.now() - date.getTime()) / 1000 <= maxAge) { return response; } } return fetch(event.request) .then(function(response) { if (response.status === 200) { const cache = caches.open('html-cache'); cache.then(function(cache) { cache.put(event.request, response.clone()); }); return response; } return caches.match('/offline.html'); }) .catch(function() { return caches.match('/offline.html'); }); }) ); } else { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request); }) ); } });
在这个例子中,我们使用 mode
属性判断请求是否为页面导航,如果是,则从缓存中获取页面。如果缓存中的页面已经过期,则从网络获取最新的页面,并将其缓存到本地。
推送通知
PWA 还可以实现推送通知功能,可以向用户推送重要的消息,提高用户的参与度和留存率。
获取权限
在使用推送通知功能之前,需要获取用户的权限。下面是一个例子:
Notification.requestPermission(function(status) { console.log('Notification permission status:', status); });
在这个例子中,我们使用 requestPermission
方法请求用户的权限,如果用户同意,则可以向用户发送推送通知。
发送通知
在获取用户的权限之后,我们可以使用 Notification
API 发送推送通知。下面是一个例子:
if (Notification.permission === 'granted') { const options = { body: '这是一条推送通知。', icon: '/assets/images/icon-192.png' }; const notification = new Notification('动漫名字分享', options); }
在这个例子中,我们使用 Notification
构造函数创建一个通知对象,设置通知的标题和内容。如果用户已经授权,则将通知显示出来。
推送服务
在实际应用中,我们通常需要使用推送服务,将推送通知发送到用户的设备上。目前,主要的推送服务有 Firebase Cloud Messaging(FCM)、OneSignal、Pusher 等。
在使用推送服务之前,需要在服务商的控制台中注册应用,并获取应用的 API Key 和 Sender ID 等信息。然后,将这些信息配置到应用中,就可以使用推送服务了。
下面是一个使用 FCM 的例子:
const messaging = firebase.messaging(); messaging.requestPermission().then(function() { console.log('Notification permission granted.'); messaging.getToken().then(function(token) { console.log('FCM token:', token); }); }).catch(function(error) { console.log('Unable to get permission to notify.', error); });
在这个例子中,我们使用 Firebase Cloud Messaging(FCM)作为推送服务,使用 messaging
对象获取用户的权限和设备的 token。
总结
通过本文的介绍,我们了解了 PWA 的基本概念和特点,学习了如何使用阿里云存储和 CDN 服务,制作了一款基于阿里云的动漫名字分享 H5 渐进式 Web 应用,以及如何使用 Service Worker 实现离线缓存和推送通知。希望本文对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658a749feb4cecbf2dfa1f64