PWA(Progressive Web App)是一种让 Web 应用具有类似原生 App 用户体验的技术体系。
PWA 不是一个框架,而是由一组浏览器 API 组成的技术集合,包括:
能力 | 描述 |
---|---|
可安装性 | 支持添加到桌面启动器,像原生 App 打开 |
离线能力 | 使用 Service Worker 缓存页面资源 |
响应式设计 | 跨设备自适应布局(桌面、平板、手机) |
这是让浏览器识别并提供“安装到桌面”入口的关键配置文件。
manifest.json
{
"name": "My PWA App",
"short_name": "PWA",
"start_url": "/index.html",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#3367D6",
"icons": [
{
"src": "/icons/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
<link rel="manifest" href="/manifest.json" />
Service Worker 是运行在浏览器主线程之外的一个 JS 文件,能拦截网络请求、缓存资源,实现离线体验和资源更新控制。
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
console.log('Service Worker 注册成功');
});
}
const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = ['/', '/index.html', '/style.css', '/main.js'];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache))
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(res => res || fetch(event.request))
);
});
浏览器在检测到符合条件的 manifest + service worker 后,会自动触发 “安装提示事件”:
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
deferredPrompt = e;
// 触发 UI 提示
showInstallButton();
});
installBtn.onclick = () => {
deferredPrompt.prompt();
};
条件 | 是否必需 |
---|---|
HTTPS 环境 | ✅ |
Manifest 配置完整 | ✅ |
Service Worker 注册成功 | ✅ |
页面被访问两次以上 | ✅ |
功能项 | 原生 App | PWA |
---|---|---|
离线访问 | ✅ | ✅ |
安装桌面图标 | ✅ | ✅(支持设备) |
推送通知 | ✅ | ✅(需授权) |
原生 API 支持程度 | ✅ 完全 | 部分限制 |
多平台发布 | 需打包 & 审核 | 一套代码,多端访问 |
@vue/pwa
插件)vue add pwa
会自动生成 manifest.json
和注册逻辑。
vite-plugin-pwa
)npm install vite-plugin-pwa --save-dev
// vite.config.ts
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
VitePWA({
registerType: 'autoUpdate',
manifest: {
name: 'My PWA App',
short_name: 'PWA',
icons: [...]
}
})
]
})
答:
PWA 是渐进式 Web 应用,提升 Web 体验接近原生 App。核心组成:
答:
通过注册 Service Worker 拦截浏览器发起的请求,并返回缓存的资源,实现离线访问。常用策略有:
答:
PWA 让 Web 应用拥有媲美原生的体验,特别适用于提升首次加载速度、增加用户粘性、提供离线支持和安装入口,是现代前端项目值得配置和掌握的重要技术。它既是技术提升,也是体验设计的加分项。