阅读视图

发现新文章,点击刷新页面。

三件套快速上手 + 第一个可安装的 PWA(HTTPS + Manifest + 基础 Service Worker)

用最小的代码和配置,让一个普通网页变成可安装的 PWA。目标是 15–30 分钟内看到“添加到主屏幕”提示(Android 上自动,iOS 上通过分享菜单)。

前提条件(2026 年视角)

  • 你有一个基本的静态网站或 SPA(HTML + CSS + JS)。
  • 用现代构建工具(如 Vite、Next.js、Create React App)最好;纯静态 HTML 也可以。
  • 最终上线必须 HTTPS(本地开发可以用 localhost 或自签名证书)。

第一步:启用 HTTPS(本地开发必备)

PWA 必须在 HTTPS 下工作(localhost 除外)。2026 年推荐工具仍是 mkcert(零配置、本地信任 CA)。

  1. 安装 mkcert(跨平台):

    • macOS:brew install mkcert
    • Windows:用 Chocolatey 或 Scoop,或直接下载二进制
    • Linux:从 GitHub 下载
  2. 初始化本地 CA(只需一次):

    mkcert -install
    
  3. 为 localhost 生成证书:

    mkdir certs && cd certs
    mkcert localhost 127.0.0.1 ::1
    

    → 生成 localhost.pemlocalhost-key.pem

  4. 用它启动服务器:

    • Vite(推荐,超快):vite 默认支持 HTTPS

      // vite.config.ts
      import { defineConfig } from 'vite'
      import react from '@vitejs/plugin-react'
      
      export default defineConfig({
        plugins: [react()],
        server: {
          https: {
            key: './certs/localhost-key.pem',
            cert: './certs/localhost.pem',
          },
        },
      })
      

      运行 npm run devhttps://localhost:5173

    • 纯静态 或其他:用 http-serverlive-server --https 或 Node 的 https 模块。

访问 https://localhost:xxxx(忽略浏览器警告如果没信任 CA,但 mkcert 会自动信任)。

iOS Safari 测试:用真机连同一 WiFi,访问你电脑的 IP(如 https://192.168.1.100:5173)。iOS 26+ 对 PWA 支持更好,默认 Home Screen 打开像 web app。

第二步:创建 Web App Manifest

在项目根目录创建 manifest.json(或 manifest.webmanifest),内容如下(最小 + 2026 年推荐字段):

{
  "name": "我的第一个 PWA",
  "short_name": "PWA Demo",
  "description": "一个简单的渐进式 Web 应用示例",
  "start_url": "/",
  "display": "standalone",
  "display_override": ["standalone", "minimal-ui"],
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icon-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any maskable"
    },
    {
      "src": "/icon-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any maskable"
    }
  ],
  "scope": "/",
  "orientation": "any",
  "prefer_related_applications": false
}

关键字段解释(2026 年现状):

  • display: "standalone" → 像原生 App,无浏览器边框。
  • icons → 至少 192x192 和 512x512;iOS/Android 都认 maskable(自适应圆角)。
  • theme_color / background_color → 启动屏和状态栏颜色。
  • start_url / scope → 控制打开范围。

链接到 HTML(index.html 的 内):

<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#000000">
<!-- iOS 老 fallback,2026 年 manifest 优先 -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">

准备图标:用任意工具生成 192 和 512 的 PNG(推荐 maskable 形状:maskable.app/)放根目录。

第三步:注册基础 Service Worker

创建 sw.js(根目录):

// sw.js - 基础版:仅预缓存首页和核心文件
const CACHE_NAME = 'pwa-demo-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/styles.css',  // 你的 CSS
  '/app.js',      // 你的 JS
  '/icon-192.png',
  '/icon-512.png'
];

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

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        // 缓存命中,返回缓存
        if (response) {
          return response;
        }
        // 否则发网络请求
        return 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.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

在你的主 JS 文件(或 index.html 的 script)注册:

// main.js 或直接 <script> 内
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js')
      .then(registration => {
        console.log('Service Worker 注册成功:', registration);
      })
      .catch(err => {
        console.log('注册失败:', err);
      });
  });
}

测试你的第一个 PWA

  1. 运行 HTTPS 本地服务器 → 访问 https://localhost:xxxx
  2. Chrome DevTools → Application → Manifest:检查 manifest 是否加载。
  3. Application → Service Workers:看到 sw.js 已激活。
  4. Lighthouse(Chrome DevTools)跑 PWA 审计:应该看到 “Installable” 绿灯。
  5. Android:访问几次 → 自动弹出“添加到主屏幕” banner,或菜单 → 安装。
  6. iOS Safari(iOS 26+):分享 → “添加到主屏幕” → 会用 manifest 的图标和名称,standalone 打开(无地址栏)。

常见坑 & 快速修复

  • Manifest 404?→ 确认路径,Content-Type: application/manifest+json
  • SW 不工作?→ 确保 scope 正确(根目录 sw 覆盖全部)
  • iOS 不显示 standalone?→ 确认加到主屏幕后打开;Safari 26+ 默认 web app 模式好多了。
  • 图标不圆?→ purpose: "maskable" + 用 maskable.app 测试。

恭喜!你已经有了第一个可安装 PWA!它能离线打开(因为预缓存了首页),以 App 形式出现。

PWA 到底是什么?它在 2026 年解决了哪些真实痛点?

PWA 到底是什么?

Progressive Web App(渐进式 Web 应用,简称 PWA)是一种使用标准 Web 技术(HTML、CSS、JavaScript)构建的网页应用,但通过浏览器提供的增强能力,让它具备接近原生 App 的体验。

它不是一个全新的东西,而是一种“渐进增强”(Progressive Enhancement)的理念:从普通的网页开始,逐步添加高级特性,让用户感觉像在使用安装的原生应用。

PWA 的三大核心支柱(至今仍是)

  • 可靠(Reliable):即使在弱网/断网情况下也能加载并基本可用(靠 Service Worker + 缓存)。
  • 快速(Fast):瞬间加载、流畅交互(优化的缓存 + 性能最佳实践)。
  • 可安装(Installable):可以“添加到主屏幕”,以独立窗口(standalone)模式运行,有图标、启动画面,像 App 一样。

在 2026 年,PWA 已经从 2015 年的“概念”变成了许多企业实际落地的主流移动解决方案之一。浏览器支持大幅成熟,Chrome/Edge/Firefox 几乎完整,Safari(iOS)也追赶了很多年(虽仍有差距)。

它在 2026 年真正解决了哪些真实痛点?

以下是 2026 年开发者/产品/业务最常遇到的痛点,以及 PWA 如何针对性解决(基于当前浏览器现实支持情况):

  1. 开发和维护成本爆炸(Separate iOS + Android + Web)

    • 痛点:同一功能要写 3 套代码(Swift/Kotlin + Web),测试、上架、更新各走各的流程,维护成本高到离谱。
    • PWA 解决:一套代码跑三端(甚至桌面 Windows/macOS/ChromeOS)。2026 年 60%+ 的企业级移动项目已转向 PWA 或 hybrid 模式,开发成本可降 40–60%。更新无需 App Store 审核,秒级生效。
  2. 用户安装/获取摩擦巨大(App Store 下载壁垒)

    • 痛点:用户看到链接 → 去 App Store → 下载几十 MB → 安装 → 打开,转化率惨不忍睹(很多场景 <5%)。
    • PWA 解决:链接一点就用,符合条件可弹出“添加到主屏幕”提示(Android 自动 banner,iOS 手动但更顺畅)。安装后有图标、离线可用、无需占 App Store 空间。很多电商/内容/工具类 App 转化率因此提升 2–5 倍。
  3. 弱网/无网场景下体验崩坏

    • 痛点:地铁、电梯、农村、国际漫游……用户一断网就白屏/卡死,流失严重。
    • PWA 解决:Service Worker 预缓存 + 运行时缓存,核心页面/资源离线可用。2026 年 Workbox 等工具让实现几乎零成本。新闻、邮件、待办、天气、记账类 PWA 在断网时仍能浏览历史、写草稿,等联网再同步。
  4. 推送通知和用户再触达难

    • 痛点:H5 基本没推送,原生 App 推送又贵又麻烦(审核、权限)。
    • PWA 解决:Web Push 已跨平台可用。Android/桌面完整支持,iOS 从 iOS 16.4 开始支持(需加到主屏幕,非 EU 地区更稳定)。2026 年 Declarative Web Push 等新 API 让推送更可靠,企业再营销/订单提醒/消息触达率大幅提升。
  5. 加载慢、性能差直接影响收入

    • 痛点:移动端 3 秒未加载完,用户流失率飙升;Core Web Vitals 差 → SEO 排名掉。
    • PWA 解决:强制 HTTPS + 缓存策略 + 优化后,首屏加载常 <1s。Lighthouse PWA 分数 90+ 已成为标配,很多业务报告转化率提升 20–50%。
  6. 跨平台一致性 & 快速迭代

    • 痛点:iOS 和 Android 体验割裂,bug 修复要双平台发版。
    • PWA 解决:浏览器统一渲染逻辑,一处修复全局生效。2026 年 PWA 还能用 File System Access、Web Share、Badging API 等,让体验更接近原生。

2026 年 PWA 的真实平台支持对比(简表)

特性 Android (Chrome) iOS (Safari 26+) Windows/macOS 备注
添加到主屏幕/安装 完整(自动提示) 支持(手动 Share → Add) 支持 iOS 26 默认更倾向 web app 模式
离线 & 缓存 完整 完整(但存储配额仍限) 完整 Service Worker 跨平台
Push 通知 完整 支持(需 home screen,非EU更稳) 完整 iOS 无 silent push,reach 稍低
Background Sync 完整 部分/不支持 部分 iOS 仍最大短板
Periodic Sync 完整 不支持 部分 用于定期更新内容
硬件 API(相机、蓝牙等) 大部分支持 部分支持 部分 差距在缩小

总结一句话(2026 年视角)

PWA 不是要完全取代原生 App,而是解决了**“我想给用户 App 般的体验,但不想付出双平台原生开发的代价”** 这个最真实、最普遍的痛点。

特别适合:

  • 电商、新闻、社交工具、SaaS、生产力工具、内容平台
  • 预算有限、需要快速验证、重视 SEO 和链接分享的场景
  • 想覆盖桌面 + 移动 + 弱网用户的企业

不适合:

  • 重度游戏、AR/VR、深度硬件调用(如银行指纹/人脸支付完整链路)
  • 对 iOS 推送/后台要求极高的场景(仍需原生补位)
❌