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

从小项目到大型鸿蒙 App 的架构变化

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

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

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

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

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

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

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

文章目录

    • 引言
    • 阶段一:小项目结构
    • 阶段二:业务模块化
    • 阶段三:状态管理层出现
    • 阶段四:分层架构
    • 阶段五:组件系统化
    • 总结

引言

很多开发者刚开始做HarmonyOS 应用时,项目规模通常不大:

  • 几个页面
  • 几个组件
  • 一个简单的数据结构

代码结构可能是这样的:

pages components utils

一开始看起来完全没问题。

但当项目逐渐变大:

  • 页面数量增加
  • 业务逻辑复杂
  • 团队成员变多

原来的结构很快就会出现问题:

  • 代码越来越难维护
  • 状态管理混乱
  • 页面之间耦合严重

我在做一个鸿蒙项目时,从小型项目结构一路演进到大型应用架构,中间经历了几次比较典型的架构变化。

阶段一:小项目结构

很多鸿蒙项目一开始都是这种结构:

pages ├─ HomePage ├─ DetailPage ├─ ProfilePage components ├─ Banner ├─ Card utils ├─ request ├─ storage

例如一个页面:

@Entry@Componentstruct HomePage{@Statelist:string[]=[]aboutToAppear(){this.loadData()}asyncloadData(){this.list=awaitrequest('/api/list')}build(){List(){LazyForEach(this.list,(item)=>{ListItem(){Text(item)}})}}}

这种结构适合:

  • Demo
  • 小项目
  • 个人练手项目

但随着页面越来越多,会出现几个问题:

  • 页面逻辑越来越重
  • 网络请求散落在各个页面
  • 状态难以复用

阶段二:业务模块化

当页面超过20 个以上,很多团队会开始进行第一次架构调整。

页面驱动变成业务模块驱动

结构变成这样:

features ├─ home │ ├─ HomePage │ ├─ HomeService │ └─ components │ ├─ user │ ├─ ProfilePage │ ├─ UserService │ └─ components │ ├─ order │ ├─ OrderPage │ ├─ OrderService │ └─ components common ├─ components ├─ utils └─ request

这种结构有一个明显好处:

业务逻辑聚合在一起。

例如:

home ├─ 页面 ├─ 组件 ├─ API

Home 模块相关代码全部在同一目录。

例如:

classHomeService{asyncfetchFeed(){returnrequest('/api/feed')}}

页面调用:

aboutToAppear(){newHomeService().fetchFeed().then(res=>{this.list=res})}

这样结构会清晰很多。

阶段三:状态管理层出现

当项目继续变大,你会发现新的问题:

  • 页面之间需要共享数据
  • 用户信息到处传
  • 状态同步困难

例如:

用户信息 登录状态 购物车数据

如果全部用@Prop@Link传递,会非常混乱。这时候通常会引入全局状态层

鸿蒙中常见方式:

@Provide / @Consume

例如在根组件:

@ProvideuserInfo:User={name:"Tom"}

子组件:

@ConsumeuserInfo:User

这样可以避免:

层层传参

很多大型应用还会做Store 层

store ├─ userStore ├─ cartStore └─ appStore

例如:

classUserStore{@StateuserInfo:User|null=nulllogin(user:User){this.userInfo=user}}

这样状态管理就会更清晰。

阶段四:分层架构

当应用规模继续扩大时,仅仅模块化还不够。很多团队会引入分层架构

典型结构是:

presentation service repository model

例如:

features └─ order ├─ pages ├─ components ├─ service ├─ repository └─ model

各层职责:

presentation(UI层)

页面 组件

service(业务逻辑层)

订单逻辑 状态处理

repository(数据层)

网络请求 本地缓存 数据库

例如:

classOrderRepository{asyncfetchOrders(){returnrequest('/api/orders')}}

Service:

classOrderService{repository=newOrderRepository()asyncgetOrders(){returnthis.repository.fetchOrders()}}

Page:

aboutToAppear(){newOrderService().getOrders().then(res=>{this.list=res})}

这样 UI 就不会直接依赖 API。

阶段五:组件系统化

当项目规模到几十个页面时,组件数量会暴涨。很多团队会建立组件系统

例如:

design-system ├─ Button ├─ Card ├─ Modal ├─ Form └─ Table

统一设计:

  • UI 风格
  • 交互逻辑
  • 主题

例如:

@Componentstruct AppButton{@Proptext:stringbuild(){Button(this.text).width(200).height(44)}}

所有页面统一使用:

AppButton

而不是:

Button

这样:

  • UI 一致
  • 维护更容易

总结

从小项目到大型鸿蒙应用,架构通常会经历这样一个演进过程:

页面驱动 ↓ 业务模块化 ↓ 状态管理层 ↓ 分层架构 ↓ 组件系统

很多项目的问题其实不是技术选型错误,而是:

架构没有随着项目规模演进。

小项目结构用在大项目上,迟早会失控。如果你准备做一个长期维护的鸿蒙应用,建议尽早规划三件事:

1、业务模块划分
2、状态管理方案
3、组件系统设计

把这三件事做好,项目规模变大时,架构会稳定很多。

http://www.jsqmd.com/news/456191/

相关文章:

  • MiniCPM-V-2_6性能对比展示:与YOLOv8在开放世界理解上的差异与互补
  • WarcraftHelper:经典魔兽现代化增强工具,适配多场景设备需求
  • 【星火计划】基于HK32F030MF4P6的低成本舵机测试仪设计与实现
  • 小白也能学会:WAN2.2镜像部署与视频生成全流程
  • 开源工具WeMod-Patcher功能增强实施指南
  • Youtu-Parsing金融监管科技:监管文件解析+合规要点提取+风险公式LaTeX化建模
  • 基于Git的CasRel模型版本管理与协作开发实践
  • 碳化硅IGBT的‘尴尬’现状:为什么10kV以上高压领域才是它的主场?
  • DeOldify图像上色服务赋能内容创作:为黑白漫画与插画自动上色
  • LongCat-Image-Editn实战教程:构建企业内部图像编辑API服务(FastAPI封装)
  • DAMO-YOLO在医疗影像分析中的应用:病变检测实战
  • UDOP-large开箱即用:无需conda/pip安装,镜像内置Tesseract OCR实测
  • Cosmos-Reason1-7B多场景:AI竞赛备赛助手(ICPC/NOI/IOI题目解析)
  • 北斗高精度监测系统实战:如何用4G+光纤双通道保障基坑安全数据不丢失
  • translategemma-27b-it入门:无需代码,用Ollama轻松玩转图文翻译
  • Alibaba DASD-4B Thinking 对话工具 C 语言教学助手:从基础到项目实战
  • 深度学习入门:PyTorch 2.9镜像部署,实测三大国内源速度
  • 3大痛点终结!专业级无损音乐下载工具如何重塑你的听觉体验?
  • PasteMD效果展示:看AI如何将混乱粘贴内容变成专业级Markdown
  • GLM-OCR数据结构设计:高效管理海量识别结果与原始图片关联
  • lingbot-depth-pretrain-vitl-14开源部署:支持多实例并发推理的FastAPI异步优化配置
  • ComfyUI视频合成高效工作流:VHS_VideoCombine节点完全掌握指南
  • 游戏控制器跨平台兼容全攻略:从冲突排查到性能优化
  • 原神帧率解锁完全指南:从卡顿到流畅的技术优化之路
  • Qwen3-0.6B-FP8精彩案例:同一输入在不同温度下的10种回答多样性展示
  • 拼多多数据采集实战全流程:从技术原理到行业落地指南
  • 使用GitHub Actions实现Qwen-Image-Edit-F2P工作流与模型的自动化更新
  • GTE-Chinese-Large入门必看:中文繁体/简体混合文本向量化兼容性验证
  • translategemma-4b-it案例集:技术文档截图→中文技术术语精准映射翻译效果
  • 罗技鼠标宏压枪系统配置指南:从问题诊断到实战验证