前端转鸿蒙 ArkUI 开发到底有多香?我花 3 天跑通了一个多端 Demo,给你一份实在的适配指南

前端转鸿蒙 ArkUI 开发到底有多香?我花 3 天跑通了一个多端 Demo,给你一份实在的适配指南

导语

鸿蒙 NEXT 正式发布快一年了,搭载 HarmonyOS 的设备已经超过 9 亿台,国内手机份额稳坐第二。但很多前端团队还在观望:「ArkTS 到底好不好上手?」「老项目怎么迁?」「真的能一套代码跑多端吗?」我把这三个问题当项目做了一遍——用 3 天时间,从零学 ArkTS + ArkUI,做了一个电商首页 Demo,然后通过 ArkUI-X 跨端跑到了 Android 模拟器上。这篇不灌水,把环境搭建、语法映射、组件实战、跨端适配的完整过程拆给你看。

ArkTS 到底长什么样?做完这个 Demo 我就清楚了

问题:前端开发者学 ArkTS 要多久?

坦白说,如果会 React + TypeScript,上手 ArkTS 只需要理解 3 个核心概念:装饰器、链式调用、状态管理。

方案:一个电商首页 Demo 全流程

先看一个完整的页面长什么样。下面这个例子是一个电商首页,包含轮播图和商品网格:

@Entry
@Component
struct HomePage {
  @State banners: string[] = [
    'common/images/banner1.jpg',
    'common/images/banner2.jpg'
  ]
  @State products: Product[] = [
    { name: '无线耳机', price: '¥299', sales: 12500 },
    { name: '智能手表', price: '¥899', sales: 8300 },
    { name: '蓝牙音箱', price: '¥199', sales: 5600 },
  ]

  build() {
    Column() {
      // 1. 轮播图
      Swiper() {
        ForEach(this.banners, (item: string) => {
          Image(item)
            .objectFit(ImageFit.Cover)
            .width('100%')
            .height(200)
        })
      }
      .indicator(true)
      .autoPlay(true)
      .interval(3000)
      .width('100%')

      // 2. 商品网格
      Grid() {
        ForEach(this.products, (item: Product) => {
          GridItem() {
            Column() {
              Text(item.name)
                .fontSize(16)
                .fontWeight(FontWeight.Bold)
              Text(item.price)
                .fontSize(18)
                .fontColor(Color.Red)
              Text(`已售 ${item.sales}`)
                .fontSize(12)
                .fontColor('#999')
            }
            .padding(10)
            .backgroundColor(Color.White)
            .borderRadius(8)
          }
        })
      }
      .columnsTemplate('1fr 1fr 1fr')
      .rowsTemplate('1fr')
      .width('100%')
    }
    .padding(10)
    .height('100%')
  }
}

关键映射:React/Vue → ArkTS

把这段代码拆开看,你会发现每个概念都能在前面框架里找到对应:

React Vue ArkTS 说明
useState() ref() @State 响应式状态,变了就重渲染
useEffect() watch() @Monitor 监听状态变化
props props @Prop 父组件传值
useContext() provide/inject @Provide / @Consume 跨层级传递
JSX 标签 build() 组件树 都在描述 UI
Tailwind 类名 内联 style 链式调用 .width().height() 声明式样式

最爽的是,ArkTS 的响应式更新是自动的——你改 @State 变量,UI 自动刷新,不需要手动操作 DOM。这和 React 的重新渲染机制本质一样。

从 React 到 ArkUI:三个最容易踩的坑

坑 1:布局容器用 Column/Row,不是 div

这是新手最容易犯的错——上来就写 div,但 ArkUI 用的是 Column(纵向)和 Row(横向)。类比 React Native 的 View,只不过做了方向区分。

// ❌ 错误写法:没有 div
build() {
  div() { ... }  // 编译报错
}

// ✅ 正确写法
build() {
  Column() {
    Row() {
      Text('左')
      Text('右')
    }
    .justifyContent(FlexAlign.SpaceBetween)
  }
}

坑 2:样式不写 CSS,用链式调用

ArkUI 没有 CSS 文件。所有样式属性都通过链式方法调用来设置:

Text('Hello ArkUI')
  .fontSize(24)
  .fontWeight(FontWeight.Bold)
  .fontColor(Color.Blue)
  .textAlign(TextAlign.Center)
  .width('100%')
  .padding({ top: 10, bottom: 10 })

如果想复用样式,可以用 @Styles 装饰器:

@Styles
function cardStyle() {
  .width('100%')
  .padding(16)
  .backgroundColor(Color.White)
  .borderRadius(12)
  .shadow({ radius: 4, color: 'rgba(0,0,0,0.1)' })
}

// 使用
Column() { ... }
  .cardStyle()

坑 3:资源文件要放在特定目录

Web 开发时图片路径随便写。鸿蒙的资源管理严格按目录走:

AppScope/
├── resources/
│   ├── base/
│   │   ├── element/    // 颜色、字体等常量
│   │   ├── media/      // 图片资源
│   │   └── profile/    // 配置
│   ├── en_US/          // 英文资源
│   └── zh_CN/          // 中文资源

引用方式也不是写路径,而是用 $r 语法:

Image($r('app.media.banner1'))
  .width('100%')
  .height(200)

这其实是一个好处——配合资源限定词,可以实现「一次编码、多端适配」。比如平板端和手机端用不同的图片尺寸,只需要放同名文件到不同限定词目录下就行。

ArkUI-X:真正让一套代码跑三端

问题:我只写鸿蒙版,Android/iOS 用户怎么办?

这是大部分团队的核心顾虑。纯血鸿蒙虽然增长快,但你不可能放弃现有用户。

方案:ArkUI-X 跨端框架

ArkUI-X 是 OpenHarmony 社区孵化的官方跨平台方案,由华为、阿里、美的等共建。核心思路是:你在鸿蒙上怎么写,跨平台到 Android/iOS 就用什么写法

┌─────────────────────┐
│   ArkTS 声明式 UI    │  ← 开发者写一套代码
├─────────────────────┤
│   框架层(IR 组件树)   │  ← 编译为中间表示
├─────────┬───────────┤
│ Android  │   iOS     │  ← 渲染成原生组件
│ Canvas   │ CoreAnim  │
└─────────┴───────────┘

项目结构上,ArkUI-X 会在常规鸿蒙项目外生成 iosandroid 两个目录,里面是对应的原生工程骨架:

MyApp/
├── entry/            # HarmonyOS 主模块
│   └── src/main/ets/ # ArkTS 代码
├── android/          # Android 工程(自动生成)
├── ios/              # iOS 工程(自动生成)
└── oh-package.json5  # 依赖配置

之前写的那个电商 Demo,我在 DevEco Studio 里点了一下「Build → Build ArkUI-X App」,它就自动生成了 Android 和 iOS 工程项目。拉到 Android Studio 里编译运行,界面跟鸿蒙端几乎一致。

实测数据(在同款手机对比):

场景 纯 ArkUI 端 ArkUI-X Android 端 差异
首屏渲染 680ms 720ms ~6%
列表滚动 60fps 58fps 基本一致
包体积 8.2MB 9.6MB 17%
代码复用率 100% ~95% 少数平台差异

代价很小,收益很大——你不用为了覆盖 Android/iOS 用户而重写三套 UI。

跨端平台差异化处理

有些能力是鸿蒙独有的(比如分布式流转),在其他端要么降级要么不实现。ArkUI-X 提供了条件编译:

if (canIUse('system.capability.distributed')) {
  // 鸿蒙端:完整的分布式流转
  TransferButton()
} else {
  // Android/iOS:提示「暂不支持」
  Text('跨设备流转仅支持鸿蒙设备')
    .fontColor(Color.Gray)
}

这个 canIUse() API 类似于前端的特性检测,不存在就要优雅降级,而不是硬上。

前端团队怎么做鸿蒙开发选型?

根据我这次实战的经验,给 3 个明确的判断标准:

情况 1:团队从零起步,主要面向国内用户

→ 直接学 ArkTS + ArkUI。入门成本低(3 天能上手),生态正在爆发,招聘市场上鸿蒙开发者的薪资涨幅已经超 30%。

情况 2:已有 React Native / Flutter 跨端项目

→ 可以用 ArkUI-X 做增量适配。先跑通鸿蒙版,再逐步把核心功能迁移到 ArkTS。uni-app 和 Taro 也已经支持鸿蒙 NEXT,如果项目本身用 Vue/React,迁移成本更低。

情况 3:大厂 / 全场景覆盖(手机+平板+车机+手表)

→ 鸿蒙的「一多开发」是核心竞争力。一套 ArkTS 代码 + 资源限定词 + 响应式布局,就能覆盖所有设备形态。这是 Flutter/RN 目前做不到的。

下一步怎么走

如果你团队打算入局鸿蒙开发,建议按这个节奏来:

  1. 第 1 周:装 DevEco Studio,跟着官方 Codelab 写一个 Todo App
  2. 第 2 周:选一个线上轻量页面(比如登录页、设置页),用 ArkTS 重写
  3. 第 3 周:接入 ArkUI-X,跑通 Android 端
  4. 第 4 周:评估接入鸿蒙分布式能力,对比 Flutter/RN 方案

鸿蒙 NEXT 不是将来时,是进行时。我之前觉得它至少还要两年才成熟,但这次实践下来,ArkTS 对前端开发者的友好程度超出预期。早在 2023 年就有前端开发者 3 天吃透 ArkTS 框架,现在文档和工具链更成熟了,入局时机正好。

评论区

0 条评论

登录后可评论。

查看完整榜单
查看完整榜单
查看完整榜单