一个前端工程师的 HarmonyOS 上手实录,附一个已上架的真实应用

前端去搞鸿蒙,是不是想不开?

作为一个写了多年前端、React / Vue / 小程序都摸过的人,第一次打开 DevEco Studio、面对满屏的 .ets 文件时,我的第一反应和大多数同行一样:又一个要重新学的语言?

但真正上手之后我发现,事情没那么糟——ArkTS 看起来和 TypeScript 几乎一样,ArkUI 的声明式写法也和 React/Vue 有八分神似。真正让我"卡住"的,是那些官方文档没明说的严格模式和工具链细节。

于是就有了今天这篇文章的主角:MarkBook——一款已经上架华为应用市场的鸿蒙原生应用,一个运行在手机上的 Git 仓库管理客户端,纯 ArkTS 实现。

这篇文章想聊聊,作为一个有经验的前端工程师,做鸿蒙应用到底能"白捡"哪些优势、必须补哪些课,以及 ArkTS 和 JS/TS、ArkUI 和 React/Vue 到底差在哪。

核心结论放前面:只要你会 TypeScript + 一种声明式 UI 框架,上手 ArkTS/ArkUI 的成本大概是一到两周。 前端转鸿蒙,比想象中平滑得多。

一、先搞清楚:ArkTS 到底是什么

一句话:ArkTS 是 TypeScript 的严格静态子集,专门为 ArkCompiler 的 AOT 编译优化。

它保留了 TS 绝大部分好用的东西——interface、泛型、async/await——但把 TS 里"灵活"的部分砍掉了,换取编译期就能确定类型的确定性。

对比项 TypeScript / JavaScript ArkTS
类型检查 编译期宽松,any 横行 严格模式,禁止 any/unknown
对象字面量 const a = {} 随便写 需要显式 interface
delete 支持 禁止(赋默认值代替)
解构 常用 参数/声明层禁止解构
动态加属性 obj.x = 1 需要显式索引访问
状态管理 useState / ref / reactive 装饰器 @State/@Prop/@Link…
UI DOM + CSS ArkUI 组件 + 链式属性

对你我这种 TS 老手来说,上面这些"限制"其实不痛不痒——写多了反而发现,严格模式逼着你写出更稳的代码

二、前端工程师"白捡"的四个优势

1. TypeScript 直接迁移

如果你在项目里已经用了 TS,那么 ArkTS 的语法你大概认识 90%。interface、泛型、async/await、类、枚举……全部直接能用。

2. 声明式 UI + 响应式状态,就是 React/Vue 的"亲戚"

ArkUI 的核心心智模型和 React/Vue 几乎一样:UI 是状态的函数,状态变了 UI 自动更新

// ArkUI 组件:声明式 + 响应式
@Entry
@Component
struct Counter {
  @State count: number = 0;      // 相当于 useState / ref

  build() {
    Column() {                    // 相当于 flex-direction: column
      Text(`点击了 ${this.count}`)
        .fontSize(20)
      Button('+1')
        .onClick(() => { this.count++; })   // 改状态自动刷新 UI
    }
  }
}

React 开发者看到 @State 会心一笑——这不就是 useState 吗?Vue 开发者看到 @State 也会心一笑——这不就是 ref 吗?声明式 + 响应式 + 状态驱动,前端最核心的思维模型在这里全部成立。

3. Flex 布局思维直接平移

ArkUI 没有 CSS,但有你熟悉的 flex:

  • Column = display:flex; flex-direction: column
  • Row = display:flex; flex-direction: row
  • .layoutWeight(1) = flex: 1
  • Stack = 定位叠加

写过小程序或 React Native 的人,半小时就能上手 ArkUI 布局。

4. 路由跳转的思路,和小程序 / RN 是同一套

前端最熟的路由跳转,在鸿蒙上也是老熟人,三个平台的核心都是「路由栈 + push/pop + 传参」:

平台 跳转写法 传参方式
React Native navigation.navigate('Detail', { id: 1 }) params 对象
微信小程序 wx.navigateTo({ url: '/pages/detail/detail?id=1' }) URL query 字符串
鸿蒙(Navigation) pathStack.pushPath({ name: 'Detail', param: { id: 1 } }) param 对象
// 鸿蒙:Navigation + NavPathStack
pathStack.pushPath({ name: 'Detail', param: { id: 1 } });   // 相当于 RN 的 navigate
pathStack.pop();                                             // 返回上一页

区别只在两点:

  • 小程序参数走 URL query,得拼字符串、再序列化;RN 和鸿蒙直接传 对象param 可以是任意可序列化对象)
  • 小程序要把页面注册进 app.json;鸿蒙新版用 NavigationnavDestination 声明式分发,不用全局注册表,路由栈对象还能通过 @Provide/@Consume 在组件树里跨层传递(思路类似 React Context)

写过小程序或 RN 的人,鸿蒙的路由几乎零成本迁移。

三、需要"补课"的四个地方

白捡的多,但要补的也不少。别怕,都是"学一次管终身"的东西。

1. ArkTS 严格模式 —— 最容易被编译错误劝退

前端的 TS 项目里 any 是常态,但 ArkTS 严格模式编译期就拒绝 any,报错还会给你一个 arkts-no-any-unknown 这样的代号。一开始很抓狂,写几周就习惯了,而且代码质量肉眼可见地变好。

2. ArkUI 组件体系 —— 不是 CSS,是链式 API

没有 .class{} 选择器,一切用链式属性:

Column()
  .width('100%')
  .padding(16)
  .backgroundColor('#F5F5F5')
  .borderRadius(12)

记忆成本在于组件 API 很丰富(List、Scroll、Grid、Tabs、Navigation、Swiper……),但都遵循同一套链式风格,查一次文档就能举一反三。

3. Stage 模型 —— 全新的应用生命周期

HarmonyOS 用的是 Stage 模型:UIAbility + module.json5,对应前端的"入口 + 配置文件"。没有 Android 的 Activity、没有 iOS 的 ViewController,需要重新理解一次应用是怎么启动、怎么传参、怎么退到后台的。

4. 工具链 —— 从 npm 到 hvigor

没有 npm run dev,构建用 hvigor,包管理用 ohpm,调试靠 hilog 和 DevEco Studio。签名、上架华为应用市场又是一套流程。这些没有学习门槛,纯粹是"熟能生巧"。

四、我的第一个鸿蒙应用:MarkBook

铺垫了这么多,该上正菜了。

MarkBook 是什么? 一个运行在手机上的 Git 仓库管理客户端。你可以浏览任意 Git 仓库的文件树、查看文件内容、Markdown 预览、收藏离线阅读、查看提交历史。核心是基于 Git HTTP Smart Protocol 的纯 ArkTS 实现,不需要任何后端。

做它的原因很朴素:鸿蒙生态里几乎没有趁手的 Git 工具,而我在 GitHub 上看代码的习惯又停不下来。需求永远是最好的老师。

下面挑两个最值得说的功能点,讲讲实现思路和踩过的坑。

功能点一:从零实现 Git HTTP Smart Protocol

鸿蒙上没有现成的 Git 客户端库,所以最硬核的部分——Git 协议本身——只能自己写。

实现思路其实是一个标准流程:

  1. refs 发现:请求 info/refs?service=git-upload-pack,拿到分支/标签和 HEAD
  2. fetch 请求:按 Git Protocol v2 发送 command=fetch + want + deepen
  3. 解析响应:处理 pkt-line 分帧 → 找到 PACK 段 → 解析 packfile(变长整数、delta 解压)→ DEFLATE 解压 → 还原出 commit / tree / blob 对象

上面这套流程落到代码上,第 2 步「构造 fetch 请求体」大概长这样:

// 构造 Git Protocol v2 fetch 请求(ArkTS)
const bodyLines: string[] = [];
bodyLines.push(this.encodePktLine('command=fetch\n'));    // 协议命令
bodyLines.push('0001');                                   // 能力/参数分隔符
bodyLines.push(this.encodePktLine('deepen 8\n'));         // 只取最近 8 层历史(按仓库规模动态调整)
bodyLines.push(this.encodePktLine('filter blob:none\n')); // 跳过文件内容,只要 commit/tree
bodyLines.push(this.encodePktLine('done\n'));
// 发请求 → 拿响应 → pkt-line 分帧 → 找 PACK 段 → 解析 packfile → DEFLATE 解压
const response = await this.httpPostBinary(url, bodyLines.join(''),
  'application/x-git-upload-pack-request');

难点主要在三个地方:

  • packfile 是二进制格式,边角细节极多(ofs-delta、ref-delta、可变长编码……),和前端熟悉的 JSON 完全是两个世界
  • API 24 没有现成的 Inflater,DEFLATE 解压得自己实现
  • 大仓库响应体积可达几十 MB,解析时的内存峰值控制不好就 OOM

这部分的收获是"跨语言通用"的:搞懂 Git 的对象模型和 pack 格式之后,任何平台上写 Git 工具都有底。

功能点二:大仓库的性能与内存优化

前端对性能天然敏感,这个习惯在鸿蒙上帮了我大忙。

以 tensorflow 这种超大仓库为例:如果按"逐层遍历文件树"的方式,每个目录要 2~5 次 HTTP 请求,走一遍下来请求量爆炸,还极易 OOM。我的应对策略是:

  • 大仓库模式:响应上限从 2MB 放宽,配合降级确认弹窗
  • blob SHA 直取:文件列表返回 blob SHA,详情页直接按 SHA 拉内容,绕过整棵树的遍历
  • 滑动窗口:包数据内存按需释放,缓存设上限,防止对象滞留堆内存
  • 提交历史按仓库规模动态降级:分支多的大仓库逐 commit 获取,控制内存峰值

其中最立竿见影的是「blob SHA 直取」——文件列表把 blob SHA 一起返回,详情页直接按 SHA 拉内容,完全跳过树遍历:

// 详情页:优先用文件列表传来的 blob SHA 直接获取内容
const blobSha = AppStorage.get<string>('detail_blob_sha') ?? '';
if (blobSha !== '') {
  content = await this.gitService.getBlob(blobSha);      // 一条请求搞定
} else {
  content = await this.gitService.getFileContentByPath(  // 回退:沿树逐层找
    this.filePath, ref || undefined);
}

做得好的地方: 纯 ArkTS 零第三方依赖跑通完整 Git 协议;大仓库从"直接崩"到"能打开";Markdown 渲染、代码高亮、深浅色主题这些体验也做完了。

还能优化的地方: 文件级提交历史目前在主线程解析 packfile,超大仓库会触发系统 THREAD_BLOCK_6S 被强杀,后续要改成 TaskPool 后台线程;Git 操作目前以"浏览"为主,提交、推送、分支管理还没做;本地缓存和离线能力也值得加强。

五、给想尝试的前端同行的建议

  1. 别被"新语言"吓住:ArkTS 是 TS 的严格子集,不是新语言。真正的新东西是 ArkUI 组件库和 Stage 模型,但都有官方文档和示例工程。
  2. 从 DevEco Studio 的模板工程开始:不要自己从零搭环境,模板会帮你搞定 hvigor/ohpm 的版本匹配,能省掉你半天到一天的踩坑时间。
  3. 性能思维是前端的优势:鸿蒙生态还年轻,很多"性能优化"的坑(OOM、主线程阻塞)还没有完整的社区答案,而前端工程师天生对渲染性能、内存泄漏敏感——这恰恰是我们的差异化优势。
  4. 先把一个功能做闭环:不要贪多,把一个核心功能从"能用"做到"好用",比堆功能列表有价值得多。

六、最后

如果你手边有鸿蒙设备,欢迎去华为应用市场搜索 MarkBook 试试——一个前端工程师从零做出来的、已上架的鸿蒙应用。如果你也正在观望鸿蒙开发,希望这篇文章能让你少一点犹豫。

前端转鸿蒙,难的不是语言,是迈出第一步的勇气。 而我们恰好不缺这个。

转载请注明来源:

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐