|
15 | 15 |
|
16 | 16 | ## 1.1 PWA 的定义 |
17 | 17 |
|
18 | | -PWA(Progressive Web App,渐进式 Web 应用)是一种使用 Web 技术构建的应用程序,但它能够提供接近原生应用的用户体验。你有没有想过:**一个网页,能不能像微信、抖音一样,直接安装在手机桌面上,点开就用,甚至断网也能跑?** 答案是:可以。这就是 PWA。 |
| 18 | +**PWA(Progressive Web App)** 是一种特殊的网页,它通过 **Service Worker** 技术获得了"缓存并接管自己"的能力。 |
19 | 19 |
|
20 | | -PWA 本质上还是一个网页,但它通过几项关键技术,让自己"进化"成了一个接近原生 App 的存在: |
| 20 | +### 为什么普通网站不能离线,PWA 可以? |
21 | 21 |
|
22 | | -* **可安装**:用户可以把它"安装"到桌面/主屏幕,拥有自己的图标和启动画面,打开后没有浏览器的地址栏,看起来就像一个独立的 App。 |
23 | | -* **可离线**:即使没有网络,App 也能正常打开并展示缓存过的内容。 |
24 | | -* **可推送**:像原生 App 一样发送通知提醒。 |
| 22 | +普通网站每次打开都要从服务器下载 HTML、CSS、JS 文件,断网就彻底打不开。而 PWA 首次访问时会通过 **Service Worker**(一个运行在浏览器后台的 JS 脚本)把这些文件缓存到本地。之后即使断网,Service Worker 会直接从本地缓存读取文件,让页面正常显示。 |
25 | 23 |
|
26 | | -简单来说,PWA 就是 **"穿上了 App 外衣的网页"**。 |
| 24 | +**打个比方**:普通网站像每次去图书馆借书(必须有网),PWA 像把书买回家放书架上(首次下载后,离线也能看)。 |
27 | 25 |
|
28 | | -<!--  --> |
29 | | - |
30 | | -## 1.2 PWA 开发 |
31 | | - |
32 | | -PWA 开发是指构建上述应用程序的全过程。在本教程的 Vibe Coding 开发模式中,借助 **AI 辅助编程模式**,它将开发者的角色从过去的"代码撰写者"转变为"产品架构师": |
33 | | - |
34 | | -1. **你(架构师/PM)**:负责业务逻辑设计、Prompt(提示词)编写以及最终效果验收。 |
35 | | -2. **AI 编程助手(工程师)**:负责执行指令,将自然语言转化为标准的 React 代码和 PWA 配置,并处理语法错误和逻辑细节。 |
36 | | -3. **Vite + vite-plugin-pwa(构建工厂)**:负责提供编译环境,将代码打包成可运行的 PWA,并自动生成 Service Worker 和 Manifest。 |
37 | | - |
38 | | -## 1.3 PWA 的三大核心技术 |
39 | | - |
40 | | -要让一个普通网页"进化"成 PWA,需要三样东西: |
41 | | - |
42 | | -**1. HTTPS(安全连接)** |
| 26 | +### PWA vs 普通网站 vs 原生 App |
43 | 27 |
|
44 | | -PWA 必须运行在 HTTPS 协议下。这是浏览器的硬性要求——只有安全的网站才有资格使用 Service Worker 等高级功能。好消息是,现在主流的部署平台(Vercel、Netlify、GitHub Pages)都自动提供免费的 HTTPS。 |
| 28 | +| 特性 | 普通网站 | PWA | 原生 App | |
| 29 | +|------|---------|-----|---------| |
| 30 | +| **安装** | 不需要 | 可选(添加到桌面) | 必须从应用商店下载 | |
| 31 | +| **离线使用** | ❌ 不能 | ✅ 能(缓存后) | ✅ 能 | |
| 32 | +| **更新方式** | 自动刷新 | 自动/后台更新 | 用户手动更新 | |
| 33 | +| **体积** | 无 | 几百 KB~几 MB | 几十 MB 以上 | |
| 34 | +| **开发成本** | 低 | 低(一套代码) | 高(iOS/Android 分开) | |
45 | 35 |
|
46 | | -**2. Web App Manifest(应用清单)** |
| 36 | +**一句话总结**:PWA 是"会自己存文件的网页"——它既有网站的轻量(无需安装、自动更新),又有原生 App 的体验(离线可用、可添加到桌面)。 |
47 | 37 |
|
48 | | -这是一个 JSON 配置文件,告诉浏览器:"我是一个 App,我叫什么名字、用什么图标、打开后长什么样"。它决定了你的 PWA 安装后的外观和行为。 |
49 | | - |
50 | | -**3. Service Worker(服务工作线程)** |
51 | | - |
52 | | -这是 PWA 的"灵魂"。它是一段运行在浏览器后台的 JavaScript 代码,充当你的 App 和网络之间的"中间人"。它可以拦截网络请求、缓存资源,从而实现离线访问。你可以把它理解为一个 **"住在浏览器里的小管家"**,负责帮你存东西、取东西。 |
53 | | - |
54 | | -<!-- 0 --> |
| 38 | +<!--  --> |
55 | 39 |
|
56 | | -## 1.4 为什么选择 PWA? |
| 40 | +## 1.2 为什么选择 PWA? |
57 | 41 |
|
58 | 42 | 在 Vibe Coding 时代,PWA 是性价比最高的"跨平台方案"之一: |
59 | 43 |
|
@@ -453,6 +437,123 @@ PWA 的 Service Worker 只在生产构建中生效(开发模式下不会注册 |
453 | 437 |
|
454 | 438 | <!-- 0 --> |
455 | 439 |
|
| 440 | +## 4.4 数据持久化与同步方案 |
| 441 | + |
| 442 | +现在你的番茄农场已经可以离线运行了,所有数据都保存在浏览器的 localStorage 中。但这里有一个关键问题:**如果用户换了一台设备,或者清除了浏览器数据,农场数据就会全部丢失**。对于严肃的生产应用,我们需要考虑数据持久化和跨设备同步的方案。 |
| 443 | + |
| 444 | +### 4.4.1 本地存储的局限性 |
| 445 | + |
| 446 | +目前我们使用的 localStorage 有几个明显的限制: |
| 447 | + |
| 448 | +| 限制项 | 说明 | |
| 449 | +|--------|------| |
| 450 | +| **设备绑定** | 数据只保存在当前设备的浏览器中,换设备即丢失 | |
| 451 | +| **容量有限** | 通常只有 5-10MB 的存储空间 | |
| 452 | +| **易丢失** | 用户清除浏览器数据、卸载 PWA 都会导致数据消失 | |
| 453 | +| **无法同步** | 手机上的进度无法同步到电脑 | |
| 454 | + |
| 455 | +如果你的番茄农场只是个人使用的小工具,这可能不是问题。但如果想让用户长期投入、积累数据,就需要更可靠的方案。 |
| 456 | + |
| 457 | +### 4.4.2 方案一:云端同步(推荐) |
| 458 | + |
| 459 | +最可靠的方案是将数据同步到云端数据库。对于 PWA 来说,**Supabase** 是一个绝佳选择——它提供 PostgreSQL 数据库、实时订阅、用户认证,而且有免费套餐。 |
| 460 | + |
| 461 | +**实现思路:** |
| 462 | + |
| 463 | +1. **用户登录**:使用邮箱/社交账号登录,建立用户身份 |
| 464 | +2. **数据自动同步**:每次操作后自动保存到云端 |
| 465 | +3. **离线优先**:即使断网也能继续操作,网络恢复后自动同步 |
| 466 | +4. **多端同步**:手机上的进度实时同步到电脑 |
| 467 | + |
| 468 | +**Prompt 示例:** |
| 469 | + |
| 470 | +``` |
| 471 | +请帮我把番茄农场的数据存储从 localStorage 改成 Supabase 云端同步: |
| 472 | +
|
| 473 | +**功能要求:** |
| 474 | +- 添加用户登录功能(邮箱+密码或 Google 登录) |
| 475 | +- 用户数据(积分、等级、菜地状态)保存到 Supabase 数据库 |
| 476 | +- 离线时也能正常使用,网络恢复后自动同步 |
| 477 | +- 支持多端同步,手机上种的菜电脑上也能看到 |
| 478 | +
|
| 479 | +**技术栈:** |
| 480 | +- 使用 @supabase/supabase-js 客户端 |
| 481 | +- 实现乐观更新(先更新 UI,再同步到云端) |
| 482 | +- 添加简单的同步状态提示 |
| 483 | +``` |
| 484 | + |
| 485 | +**优点:** |
| 486 | +- 数据永不丢失,换设备只需登录即可恢复 |
| 487 | +- 免费套餐足够个人项目使用 |
| 488 | +- 支持实时订阅,多端同步体验好 |
| 489 | + |
| 490 | +**缺点:** |
| 491 | +- 需要用户注册登录,增加了使用门槛 |
| 492 | +- 需要网络连接才能同步 |
| 493 | + |
| 494 | +### 4.4.3 方案二:导出/导入备份 |
| 495 | + |
| 496 | +如果你不想引入复杂的后端服务,一个简单的折中方案是 **手动备份与恢复**。 |
| 497 | + |
| 498 | +**实现思路:** |
| 499 | + |
| 500 | +1. **导出功能**:将农场数据打包成 JSON 文件,让用户下载保存 |
| 501 | +2. **导入功能**:用户可以选择之前导出的 JSON 文件恢复数据 |
| 502 | +3. **自动提醒**:定期提醒用户备份数据 |
| 503 | + |
| 504 | +**Prompt 示例:** |
| 505 | + |
| 506 | +``` |
| 507 | +请帮番茄农场添加数据备份功能: |
| 508 | +
|
| 509 | +**导出功能:** |
| 510 | +- 在设置页面添加"导出数据"按钮 |
| 511 | +- 将 localStorage 中的所有数据打包成 JSON 文件 |
| 512 | +- 自动下载到用户设备 |
| 513 | +
|
| 514 | +**导入功能:** |
| 515 | +- 添加"导入数据"按钮,支持选择 JSON 文件 |
| 516 | +- 验证文件格式后恢复数据 |
| 517 | +- 导入前提示会覆盖现有数据 |
| 518 | +
|
| 519 | +**自动提醒:** |
| 520 | +- 如果超过 7 天没有备份,显示温馨提示 |
| 521 | +``` |
| 522 | + |
| 523 | +**优点:** |
| 524 | +- 实现简单,不需要后端服务 |
| 525 | +- 用户完全掌控自己的数据 |
| 526 | +- 可以跨设备迁移(通过文件传输) |
| 527 | + |
| 528 | +**缺点:** |
| 529 | +- 需要用户手动操作,体验不够流畅 |
| 530 | +- 如果忘记备份,数据仍会丢失 |
| 531 | + |
| 532 | +### 4.4.4 方案三:浏览器扩展同步(Chrome 用户) |
| 533 | + |
| 534 | +如果你的 PWA 主要面向 Chrome 用户,可以考虑使用 **Chrome Storage Sync API**。这是 Chrome 浏览器提供的跨设备同步存储服务,数据会自动同步到用户的 Google 账号。 |
| 535 | + |
| 536 | +**注意:** 这需要将 PWA 打包成 Chrome 扩展的形式,适合有技术能力的开发者尝试。 |
| 537 | + |
| 538 | +### 4.4.5 方案选择建议 |
| 539 | + |
| 540 | +| 场景 | 推荐方案 | |
| 541 | +|------|----------| |
| 542 | +| 个人使用的小工具 | localStorage 即可,无需额外方案 | |
| 543 | +| 希望数据不丢失,但不想太复杂 | 导出/导入备份 | |
| 544 | +| 正式产品,需要完整用户体验 | Supabase 云端同步 | |
| 545 | +| 主要面向 Chrome 用户 | Chrome Storage Sync | |
| 546 | + |
| 547 | +**对于番茄农场这样的应用,我的建议是:** |
| 548 | + |
| 549 | +1. **MVP 阶段**:先用 localStorage,快速验证产品想法 |
| 550 | +2. **迭代阶段**:添加导出/导入功能,给用户一个数据保险 |
| 551 | +3. **成熟阶段**:接入 Supabase,实现真正的云端同步 |
| 552 | + |
| 553 | +记住:**渐进式增强**是 PWA 的核心理念。先让应用能跑起来,再逐步添加高级功能。 |
| 554 | + |
| 555 | +<!-- 0 --> |
| 556 | + |
456 | 557 | # 5 部署上线 |
457 | 558 |
|
458 | 559 | PWA 必须运行在 HTTPS 上才能正常工作。好消息是,现在主流的部署平台都自动提供免费的 HTTPS。我们以 **Vercel** 为例(也可以用 Netlify 或 GitHub Pages)。 |
|
0 commit comments