当前位置: 首页 > news >正文

鸿蒙 App 的代码结构应该怎么拆分

子玥酱(掘金 / 知乎 / CSDN / 简书 同名)

大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。

我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案
在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。

技术方向:前端 / 跨端 / 小程序 / 移动端工程化
内容平台:
掘金、知乎、CSDN、简书
创作特点:
实战导向、源码拆解、少空谈多落地
文章状态:
长期稳定更新,大量原创输出

我的内容主要围绕前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。

子玥酱 · 前端成长记录官 ✨
👋 如果你正在做前端,或准备长期走前端这条路
📚 关注我,第一时间获取前端行业趋势与实践总结
🎁 可领取11 类前端进阶学习资源(工程化 / 框架 / 跨端 / 面试 / 架构)
💡 一起把技术学“明白”,也用“到位”

持续写作,持续进阶。
愿我们都能在代码和生活里,走得更稳一点 🌱

文章目录

    • 引言
    • 一、最常见的错误结构
      • 1、UI 和业务逻辑混在一起
    • 二、推荐的基础结构
    • 三、业务逻辑放到 Service 层
    • 四、页面只负责 UI
    • 五、数据模型单独管理
    • 六、组件拆分
    • 七、大型项目结构
    • 八、AI 应用的结构变化
    • 九、代码结构设计的核心原则
      • 1、UI 和业务分离
      • 2、数据模型统一
      • 3、组件复用
      • 4、模块化拆分
    • 总结

引言

很多人刚开始写鸿蒙应用时,项目结构往往很简单:

entry ├─ pages ├─ components └─ utils

一开始写 Demo 或小项目,这样完全没问题。但只要项目稍微复杂一点,很快就会遇到几个问题:

  • 页面代码越来越长
  • 业务逻辑和 UI 混在一起
  • 网络请求到处都是
  • 很难维护

很多人最后会发现:

项目不是功能难,而是代码结构乱。

所以问题就来了:鸿蒙 App 的代码结构到底应该怎么拆?

一、最常见的错误结构

很多初学项目会长这样:

entry ├─ pages │ ├─ Home.ets │ ├─ Login.ets │ └─ Profile.ets │ ├─ components │ └─ utils

问题在哪?

1、UI 和业务逻辑混在一起

例如一个页面:

@Entry@Componentstruct HomePage{@Statelist:string[]=[]aboutToAppear(){this.loadData()}asyncloadData(){constresult=awaitfetch("https://api.example.com/list")constdata=awaitresult.json()this.list=data}build(){Column(){ForEach(this.list,(item:string)=>{Text(item)})}}}

这里的问题是:

  • UI
  • 网络请求
  • 数据解析

全部在一个文件,当页面越来越复杂时,就会变得难以维护。

二、推荐的基础结构

比较推荐的结构是分层设计

entry ├─ pages ├─ components ├─ services ├─ models └─ utils

含义分别是:

pages 页面 components UI组件 services 业务服务 models 数据模型 utils 工具函数

三、业务逻辑放到 Service 层

网络请求、业务逻辑不应该写在页面里,而是放到Service 层,例如:

services └─ UserService.ets

代码:

importhttpfrom'@ohos.net.http'exportclassUserService{asyncgetUserList(){constrequest=http.createHttp()constresponse=awaitrequest.request("https://api.example.com/users",{method:http.RequestMethod.GET})returnJSON.parse(response.result)}}

四、页面只负责 UI

页面只负责展示数据,例如:

import{UserService}from'../services/UserService'@Entry@Componentstruct UserPage{@Stateusers:any[]=[]userService:UserService=newUserService()aboutToAppear(){this.loadUsers()}asyncloadUsers(){this.users=awaitthis.userService.getUserList()}build(){Column(){ForEach(this.users,(user)=>{Text(user.name)})}}}

这样代码职责就清晰了:

Page → UI Service → 业务逻辑

五、数据模型单独管理

如果项目稍微大一点,建议把数据结构单独管理,例如:

models └─ UserModel.ets

代码:

exportinterfaceUser{id:numbername:stringavatar:string}

Service 中使用:

import{User}from'../models/UserModel'asyncgetUserList():Promise<User[]>{...}

这样有几个好处:

  • 类型清晰
  • 数据结构统一
  • 方便维护

六、组件拆分

页面里的 UI 组件也应该拆分,例如:

components └─ UserItem.ets

代码:

@Componentexportstruct UserItem{@Propuser:anybuild(){Row(){Image(this.user.avatar).width(40).height(40)Text(this.user.name)}}}

页面使用:

ForEach(this.users,(user)=>{UserItem({user:user})})

这样页面会非常干净。

七、大型项目结构

如果是大型项目,结构通常会进一步细化,例如:

entry ├─ pages │ ├─ home │ ├─ profile │ └─ login │ ├─ components │ ├─ services │ ├─ user │ ├─ order │ └─ payment │ ├─ models │ ├─ store │ └─ utils

含义:

services 按业务拆分 pages 按模块拆分 store 状态管理

八、AI 应用的结构变化

如果是AI 应用,结构通常还会增加 AI 层,例如:

entry ├─ pages ├─ components ├─ services ├─ ai │ ├─ ai_service │ ├─ ai_router │ └─ prompt_manager │ ├─ models └─ utils

例如,AI Service:

exportclassAIService{asyncchat(message:string){returnawaitthis.requestModel(message)}asyncrequestModel(message:string){// 调用 AI API}}

这样 AI 能力也变成独立模块。

九、代码结构设计的核心原则

总结一下,一个好的鸿蒙 App 代码结构通常遵循几个原则:

1、UI 和业务分离

Page → UI Service → 业务

2、数据模型统一

Model → 数据结构

3、组件复用

Component → UI复用

4、模块化拆分

按业务模块拆分

总结

鸿蒙 App 的代码结构,本质上和很多现代应用架构类似。推荐结构:

entry ├─ pages ├─ components ├─ services ├─ models └─ utils

如果项目变大,可以进一步拆分:

modules services ai store

核心原则其实只有一句话:

UI、业务、数据三者一定要分离。

这样项目才会:

  • 好维护
  • 好扩展
  • 不容易变成“巨型页面文件”。
http://www.jsqmd.com/news/460948/

相关文章:

  • 用工风险规避公司有哪些?杭州人力资源公司哪家好?2026杭州专业人力资源公司+杭州人力资源公司前八:杭州卡费诺企业服务领 - 栗子测评
  • 2026年高端按摩椅选购指南:四大品牌深度横评 - 2026年企业推荐榜
  • 2026年比较好的环保板材品牌推荐:环保板材优质供应商推荐 - 品牌宣传支持者
  • 2026年云南双曲铝板服务商综合实力盘点与联系指南 - 2026年企业推荐榜
  • JVM学习笔记:第九章——StringTable字符串常量池
  • Java SpringBoot+Vue3+MyBatis 高校竞赛管理系统系统源码|前后端分离+MySQL数据库
  • 企业级高校科研信息管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 想部署“龙虾”,云服务器选择是非常重要的
  • Flutter 三方库 adb_dart 的鸿蒙化适配指南 - 实现纯 Dart 的 ADB 协议通信、远程控制手机与自动化调试脚本开发
  • 2026年靠谱的PVC塑料破碎机工厂推荐:PVC塑料破碎机可靠供应商推荐 - 品牌宣传支持者
  • 2026年知名的绍兴配眼镜平价工厂推荐:绍兴配眼镜平价口碑好的厂家推荐 - 品牌宣传支持者
  • 如何避免线上问题
  • Flutter 三方库 sentry_dart_frog 的鸿蒙化适配指南 - 实现 Dart Frog 后端的全栈错误监控、支持鸿蒙端侧请求链路追踪与异常告警
  • AI换脸带货算侵权吗?全国首部AI生成内容合规标准来了,欢迎参与起草
  • 测试同学质量不达标怎么识别及处理
  • DP线和HDMI线有什么区别?选错可能影响显示效果
  • 警惕!网络战,已成为现代战争的 “先手棋”
  • 测试过程中如何保障团队质量
  • Flutter 三方库 color_model 的鸿蒙化适配指南 - 实现全色域(RGB/CMYK/HSL/XYZ)的高精度转换与色彩动力学解析、支持端侧专业级视觉调色实战
  • NAND Flash 完整识别注册配置流程
  • 电源测试系统编程软件选择:LabVIEW与ATECLOUD对比
  • 电车企业销量连连暴跌,技术神话正在破灭,燃油车优势凸显
  • 美国智驾激进转向,吓坏乘客,智驾安全靠其他人类驾驶员避让
  • 洁净车间专用的人数统计摄像机能当监控摄像头吗
  • <C++学习>C++ 静态函数
  • 在vue3中实现动态加载组件
  • 美格智能港股上市:募资11亿港元 市值88亿港元 第三季净利降50%
  • 2026年Q1吉林优秀路边石直销厂家综合评测与推荐 - 2026年企业推荐榜
  • 03 别再用 CGLIB 了!深度解析 Byte Buddy:为什么它是现代 Java 框架的首选?
  • 2026年知名的破碎磨粉机品牌推荐:破碎磨粉机公司选择指南 - 品牌宣传支持者