摘要
近年来,渐进式 Web 应用(PWA)由于其跨平台性强、无需安装即用的特性,受到越来越多开发者和产品团队的青睐。与此同时,鸿蒙系统作为国产操作系统的代表,也在不断扩大其生态覆盖范围。为了兼容 Web 应用,鸿蒙提供了名为 WebAbility 的能力组件,让 PWA 应用能在鸿蒙系统上直接运行。本篇文章将手把手带你完成一个 PWA 应用的迁移与部署,涵盖从准备工作、加载示例到真实场景应用的全流程。
引言
PWA 技术解决了传统网页应用在移动端的弱体验问题,它允许 Web 应用拥有离线能力、通知功能、图标安装等“类原生”的特性。而 HarmonyOS 为了连接多设备和统一体验,也提供了 WebAbility 模块来加载 Web 页面,包括符合 PWA 标准的站点。这就为已有的 PWA 应用提供了低成本的迁移路径。
我们这篇文章主要讲两件事:
- 如何让你的 PWA 跑在鸿蒙上?
- 如何通过 WebAbility 提供良好的用户体验?
WebAbility 是什么?
基础介绍
WebAbility 是鸿蒙系统提供的一个 Web 加载能力组件。它有点像浏览器内核,可以嵌入到鸿蒙应用中,加载远程网页或者本地 HTML 文件。
对于开发者来说,最常见的应用场景包括:
- 显示官网、帮助页
- 嵌入第三方 Web 工具
- 加载现有的 PWA 应用
PWA 迁移的准备工作
迁移条件
在开始迁移之前,需要确保你的 PWA 应用满足以下要求:
- 已部署在 HTTPS 域名下(PWA 强制要求 HTTPS)
- 包含有效的
manifest.json - 配有 Service Worker 文件,实现缓存和离线能力
示例 Manifest.json(缩略)
{
"name": "My PWA App",
"short_name": "MyApp",
"start_url": "/index.html",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#317EFB",
"icons": [
{
"src": "/icon-192.png",
"sizes": "192x192",
"type": "image/png"
}
]
}
如果你的项目已经满足这些条件,就可以进入鸿蒙侧的开发了。
如何在鸿蒙应用中加载 PWA
使用 WebAbility 加载页面
我们可以在鸿蒙项目中直接通过 <web> 组件加载 PWA 应用的网址,非常简单。
示例代码(ArkTS)
// pages/Index.ets
@Component
struct Index {
build() {
Column() {
Web({
src: 'https://example.com/myPWA',
controller: new WebController()
}).width('100%').height('100%')
}
}
}
这个页面的意思就是:加载 https://example.com/myPWA 这个地址,并且用 WebAbility 显示出来。
注意事项:PWA 的 manifest 和 Service Worker 不需要额外迁移,WebAbility 会像浏览器一样处理它们。
场景实战:PWA 应用的 2 种典型迁移方式
加载远程站点:快速上线方式
如果你已经将 PWA 应用部署到服务器,只需要在 WebAbility 中指定远程地址即可。
示例代码
Web({
src: 'https://mydomain.com/app',
controller: new WebController()
}).width('100%').height('100%')
适合场景:
- 快速上线
- 动态更新
- 多平台共用一套 Web 后端
本地化部署:保证离线体验
将 PWA 的 HTML、JS、CSS 文件打包到鸿蒙资源目录下,再通过 web 加载本地路径。
示例代码
项目结构:
resources/
└── base/
└── media/
└── pwa/
├── index.html
├── app.js
└── style.css
加载方式:
Web({
src: 'media://pwa/index.html',
controller: new WebController()
}).width('100%').height('100%')
适合场景:
- 保证稳定体验
- 网络波动严重地区
- 与设备深度集成
实际案例分析:校园通知应用
假设你开发了一个 PWA 应用用于学生接收校园通知、课表安排等。
部署方式:
- 前端为 PWA,部署到
https://campus.notifier.cn - 后端接口也跨平台提供 JSON 数据
- 使用鸿蒙 WebAbility 直接加载网页,即可复用已有 Web 项目
代码加载如下:
Web({
src: 'https://campus.notifier.cn',
controller: new WebController()
})
这在实际中是非常常见的用法,尤其适用于政务、教育、医疗等已有 PWA 系统的场景。
QA 常见问题解答
Q1:WebAbility 支持离线缓存吗?
A:支持,但前提是你的 PWA 有正确的 service worker 配置。WebAbility 相当于一个浏览器,它会处理缓存逻辑。
Q2:鸿蒙是否会限制跨域请求?
A:不会特别限制,但你仍需要确保服务端支持 CORS。否则,像 fetch 或 XHR 请求仍可能失败。
Q3:可以通过 WebAbility 调用鸿蒙原生接口吗?
A:默认不支持直接调用。如果有这方面需求,可以通过 JSBridge 或鸿蒙 JS 接口能力实现跨层通信(进阶用法)。
总结
通过本文内容你可以看到,将 PWA 应用迁移到鸿蒙系统是非常友好的:
- WebAbility 提供标准的 Web 加载方式,无需重写大量代码
- 远程部署或本地打包都支持,适配多种使用场景
- 实际迁移成本低,只需调整加载方式即可接入鸿蒙生态
未来,随着鸿蒙系统对 Web 生态的持续兼容,PWA 将是连接 Web 与 HarmonyOS 的关键桥梁。如果你已经有一个 PWA,不妨花 10 分钟试试接入鸿蒙,相信效果不会让你失望。