鸿蒙初体验

最近两天简单看了一下 HarmonyOS 应用开发文档,其实对于我这样的 "大龄程序员",已经很久没有对一款 UI 编程框架有这样的学习热情了,忍不住叨叨两句。

官方文档

一门全新技术的官方文档是中文,好感动。点一下隔壁 Android,中文文档一定是滞后的,每次得手动切回 English 确认一下。

目前 HarmonyOS 官网文档 是基于 API 9,Hormony Next 版本的文档需要华为授权账号才可以查看。

OpenHarmony 开发文档 是基于 API 10

就我观察到的,@Prop 在 API 9 的文档中不支持 Class,但我代码测试是支持的,在 API 10 中明确说明了支持 Class。另外,ArkTS 在 API 10 也有一定 "增强" 和 "限制" 。

这里建议优先学习 API 10 , 反正学了 API 9,回头还是要升级的嘛。

另外,官网下载的 DevEco 是无法调整编译版本到 API 10 的。你需要到 OpenHarmony 网站去下载 4.0 Release 版本的 IDE,目前最新 Build Verision 4.0.0.600。

如果你司是华为合作伙伴,应该没有这些问题,还有 VIP 版本 IDE,表示羡慕。

JS/TS/ArkTs ?

背景:我是零前端开发经验,并且一直厌恶 JavaScript 这种动态语言。

TypeScript 是在 JavaScript 的基础上通过添加类型定义扩展而来,ArkTS 在 TypeScript 的基础上进一步扩展,主要是限制了动态类型。动态类型一定会造成更多的运行时错误,浪费更多的运行时性能,对程序员的稳定性和性能完全没有好处。

从 API 10 开始,ArkTS 进一步强化了静态检查,包括强制使用静态类型,禁止运行时改变对象布局,限制运算符语义等等。从 TypeScript 到 ArkTS 的适配规则 这份文档里大概列举了几十条 ArkTS 对 TS 的限制。

肉眼可见,ArkTS 越来越像的是 Java,而不是 TS。所以不妨把 ArkTS 当做一门全新的语言来学习。

社区里也看到一些 Kotlin/Js 的曲线救国方案,qdsfdhvh/test-kmp-in-ohosbennyhuo/ktor-for-ohos ,还有传言华为自研的仓颉,可能 JS/TS 的学习优先级并没有那么高。

以上纯属尚无完整鸿蒙项目开发背景下的个人意见。

状态管理

状态管理,或者说 数据驱动 是声明式 UI 的核中核,这两天也是先上手学习了 ArkUI 的状态管理。

由于之前断断续续的看过一些 SwiftUI,他两状态管理的思路出奇的一致。

less 复制代码
struct FoodListScreen: View {
    @State private var editMode: EditMode = .inactive
    @AppStorage(.foodList) private var foodList = Food.examples
    @State var selectedFoodId = Set<Food.ID>()
    @State private var sheet: Sheet?
    
    var isEditMode: Bool { editMode.isEditing }
    
    var body: some View {
        VStack(alignment: .leading) {
            titleBar
            
            List($foodList, editActions: .all, selection: $selectedFoodId, rowContent: buildFoodRow)
                .listStyle(.plain)
                .background {
                    RoundedRectangle(cornerRadius: 10)
                        .fill(.groupBg2)
                        .ignoresSafeArea(.container, edges: .bottom)
                }
                .padding(.horizontal)
        }
        .background(.groupBg)
        .environment(.editMode, $editMode)
        .sheet(item: $sheet)
    }
}
scss 复制代码
@Component
struct ArticleList {
  @State simpleList: Array<number> = [1, 2, 3, 4, 5]

  build() {
    Column() {
      ForEach(this.simpleList, (item: string) => {
        ArticleSkeletonView()
          .margin({top: 20})
      })
    }
    .padding(20)
    .width('100%')
    .height('100%')
  }
}

ArkUI 也是标准的 MVVM 架构

可以先把 状态管理 捋一捋。在对状态管理有了基本认知之后,再去深入学习 ArkUI 的细枝末节。

吐槽环节

IDE 的智能提示不够完善,constructor() 目前只能手搓。

刚刚装上了 Copilot,这也不是问题了。

用了半天,Copilot 可能还不认识 ArkTs,时而提示出 JS 语法,时而提示出 SwitUI 语法,时而提示出 Compose,甚至还提示过 XML View 。

误把 string() 写成了 string,编译运行无问题,只是 UI 表现有问题,不知道 API 10 是否会增强这类的编译期检查。

API 10 中 ArkTS 对于语法特性的限制过于严格,例如运算符只能用于数值,取消对于数组的 for in 语法,不支持 with 语句等,其实还是可以通过编译期语法糖来实现的,这也是 Kotlin 大受欢迎的原因。

还没有实战写项目,暂时没有可以吐槽的了。

小意外

发现了一个目前为止还没在其他 UI 框架中看到过的小特性,ArkUI 支持 单复数的字符串匹配

plural.json 中配置:

perl 复制代码
{
    "plural":[
        {
            "name":"eat_apple",
            "value":[
                {
                    "quantity":"one",
                    "value":"%d apple"
                },
                {
                    "quantity":"other",
                    "value":"%d apples"
                }
            ]
        }
    ]
}

Text($r('app.plural.eat_apple', 5, 5))  => 5 apples

结束

暂时想不到什么可以分享的了,后续学习过程中,想叨叨的时候再写了。

相关推荐
乘风gg34 分钟前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员1 小时前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
爱读源码的大都督2 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝2 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员2 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端
东风破_2 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript
ITOM运维行者2 小时前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端
monologues2 小时前
深入 Vue 3 源码:响应式系统的精妙设计与编译优化
前端
hunterandroid2 小时前
Paging 3 分页:从手动分页到声明式加载
前端
用户4099322502122 小时前
Vue状态管理入门第四章:组合式store和SSR风险
前端·vue.js·后端