PWA知识点笔记

0 阅读3分钟

1. PWA简介

-‌ 定义‌:渐进式Web应用,是一种结合了web网站程序和原生应用程序两者优点的技术,旨在提供快速、可靠、安全的用户体验。 -‌ ‌特点‌: -‌跨平台‌:一套代码,多个平台运行。 -‌可安装‌:像原生应用一样,可添加到主屏幕,通过图标访问。 -‌离线访问‌:缓存核心资源,实现离线访问。 -‌推送通知‌:主动发送推送通知。 -‌快速加载‌:使用Service Workers缓存资源,加速加载。 -‌可搜索‌:可通过搜索引擎被发现,支持URL链接分享。 -‌热更新‌:部分内容更新时,自动进行局部热更新。

2. PWA核心技术

-‌ ‌Service Worker‌‌:拦截和控制网络请求,实现离线缓存、消息推送等功能。 -‌ ‌Web App Manifest‌‌:定义应用的元信息,如图标、名称、启动画面等,实现添加到主屏幕的功能。 -‌ ‌HTTPS‌‌:PWA必须通过HTTPS提供服务,确保安全性。

3. PWA开发流程

  • ‌准备HTTPS环境‌:确保项目部署在支持HTTPS的服务器上。
  • ‌创建Web App Manifest‌:定义应用的元信息。
  • ‌注册和编写Service Worker‌:拦截和控制网络请求,实现离线缓存等功能。
  • ‌实现离线页面‌:创建离线页面,确保用户离线时有良好的体验。
  • ‌测试和优化‌:使用Chrome DevTools等工具测试PWA功能,确保性能和兼容性达到最佳。
  • ‌部署到生产环境‌:将PWA部署到支持HTTPS的生产环境中。

4. 在Vue2+Element-UI+JS+Axios项目中应用PWA简单示例

1. 准备项目环境

  • 确保Vue2、Element-UI、Axios已安装。
  • 使用Vue CLI创建项目,并配置好路由。

2. 创建Web App Manifest

在public目录下创建manifest.json文件:

{
  "name": "My PWA",
  "short_name": "MyPWA",
  "display": "standalone",
  "start_url": "/",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

在index.html中引用manifest.json:

<link rel="manifest" href="/manifest.json">

3. 注册和编写Service Worker

在src目录下创建service-worker.js文件:

const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/css/app.css',
  '/js/app.js',
  '/icons/icon-192x192.png',
  '/icons/icon-512x512.png'
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => {
      return cache.addAll(urlsToCache);
    })
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

self.addEventListener('activate', event => {
  const cacheWhitelist = [CACHE_NAME];
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return Promise.all(
        cacheNames.map(cacheName => {
          if (!cacheWhitelist.includes(cacheName)) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

在main.js中注册Service Worker:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js').then(registration => {
      console.log('Service Worker registered:', registration);
    }).catch(error => {
      console.error('Service Worker registration failed:', error);
    });
  });
}

4. 创建离线页面

在public目录下创建offline.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Offline</title>
</head>
<body>
  <h1>You are offline. Please check your connection and try again.</h1>
</body>
</html>

在service-worker.js中添加离线页面缓存:

const urlsToCache = [
  '/',
  '/index.html',
  '/css/app.css',
  '/js/app.js',
  '/icons/icon-192x192.png',
  '/icons/icon-512x512.png',
  '/offline.html'
];

并在fetch事件中添加离线页面逻辑:

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request).catch(() => {
        return caches.match('/offline.html');
      });
    })
  );
});

5. 测试和优化

使用Chrome DevTools的Application面板检查Manifest和Service Workers是否正确加载。在Lighthouse标签中生成报告,确保PWA的性能和兼容性达到最佳。

6. 部署到生产环境

将PWA部署到支持HTTPS的生产环境中,如Nginx、Apache或Vercel等平台。确保服务器配置正确,支持Service Workers和HTTPS。