鸿蒙游戏如何避免“巨型页面文件”?

张开发
2026/4/15 18:17:31 15 分钟阅读

分享文章

鸿蒙游戏如何避免“巨型页面文件”?
子玥酱掘金 / 知乎 / CSDN / 简书 同名大家好我是子玥酱一名长期深耕在一线的前端程序媛 ‍。曾就职于多家知名互联网大厂目前在某国企负责前端软件研发相关工作主要聚焦于业务型系统的工程化建设与长期维护。我持续输出和沉淀前端领域的实战经验日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。技术方向前端 / 跨端 / 小程序 / 移动端工程化内容平台掘金、知乎、CSDN、简书创作特点实战导向、源码拆解、少空谈多落地文章状态长期稳定更新大量原创输出我的内容主要围绕前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读展开。文章不会停留在“API 怎么用”而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍希望能帮你在实际工作中少走弯路。子玥酱 · 前端成长记录官 ✨ 如果你正在做前端或准备长期走前端这条路 关注我第一时间获取前端行业趋势与实践总结 可领取11 类前端进阶学习资源工程化 / 框架 / 跨端 / 面试 / 架构 一起把技术学“明白”也用“到位”持续写作持续进阶。愿我们都能在代码和生活里走得更稳一点 文章目录引言一、为什么会出现“巨型页面”核心原因职责没有拆分二、正确拆分思路一句话原则正确结构三、第一步拆 Service页面写逻辑提取到 Service页面变成四、第二步拆 Store页面管理状态统一 Store页面只读五、第三步拆组件页面 UI 堆积拆组件页面使用六、第四步拆网络页面直接 fetchService 调用七、第五步引入模块化推荐结构八、最终页面应该长什么样理想页面九、判断标准出现这些正确状态十、为什么这很重要1、可维护性2、可扩展性3、团队协作4、避免“技术债”总结引言如果你写过一段时间鸿蒙游戏很可能已经遇到这个问题一个页面文件越来越大。最开始200 行后来变成800 行再后来2000 行 而且你会发现UI 写在一起逻辑写在一起网络写在一起状态也写在一起最后变成一个典型的“巨型页面文件God Component”在 HarmonyOS 的 ArkUI 体系下这个问题尤其常见。一、为什么会出现“巨型页面”核心原因职责没有拆分一个典型错误页面EntryComponentstruct GamePage{Statescore:number0Statelist:any[][]aboutToAppear(){this.loadData()}asyncloadData(){constresawaitfetch(/api/list)this.listawaitres.json()}movePlayer(){this.score1}build(){Column(){Text(Score:${this.score})Button(移动).onClick(()this.movePlayer())ForEach(this.list,item{Text(item.name)})}}}看起来没问题但其实混在一起了UI 状态 网络 逻辑一旦变复杂你会完全失控二、正确拆分思路一句话原则页面只负责 UI其它全部拆出去正确结构PageUI ↓ Service逻辑 ↓ Store状态 ↓ Network数据再加ComponentUI拆分 AgentAI三、第一步拆 Service页面写逻辑movePlayer(){this.score1}提取到 Service// services/GameService.etsimport{gameStore}from../store/GameStoreexportclassGameService{movePlayer(){gameStore.dispatch({type:ADD_SCORE,payload:1})}}exportconstgameServicenewGameService()页面变成Button(移动).onClick(()gameService.movePlayer())页面瞬间变干净。四、第二步拆 Store页面管理状态Statescore:number0统一 Store// store/GameStore.etsexportclassGameStore{state{score:0}dispatch(action){if(action.typeADD_SCORE){this.state.scoreaction.payload}}}exportconstgameStorenewGameStore()页面只读StatestategameStore.state页面不再“拥有状态”。五、第三步拆组件页面 UI 堆积Column(){Text(玩家)Image(avatar.png)Text(分数)}拆组件// components/PlayerInfo.etsComponentexportstruct PlayerInfo{Propscore:numberbuild(){Column(){Text(玩家)Text(分数${this.score})}}}页面使用PlayerInfo({score:this.state.score})页面只负责“拼装 UI”。六、第四步拆网络页面直接 fetchawaitfetch(/api/list)Service 调用awaitdataService.fetchList()页面完全不关心数据来源。七、第五步引入模块化当游戏变大推荐结构modules ├─ player │ ├─ PlayerService │ ├─ PlayerStore │ └─ PlayerComponent │ ├─ task ├─ battle原则按业务拆而不是按技术层拆八、最终页面应该长什么样理想页面EntryComponentstruct GamePage{StatestategameStore.statebuild(){Column(){PlayerInfo({score:this.state.score})Button(移动).onClick(()gameService.movePlayer())}}}页面只剩UI 事件绑定这才是正确形态。九、判断标准如果你的页面出现这些有 fetch有复杂逻辑有多层 if有状态计算说明已经“变胖了”。正确状态页面应该简单到可以一眼看懂十、为什么这很重要1、可维护性逻辑在 Service 状态在 Store修改不会影响 UI。2、可扩展性你可以轻松加AI多端网络3、团队协作UI开发 逻辑开发 AI开发可以分开做。4、避免“技术债”巨型页面的本质是技术债爆炸前兆总结避免“巨型页面文件”的核心方法1、逻辑进 Service 2、状态进 Store 3、UI 拆 Component 4、网络独立 5、按模块拆分在 HarmonyOS 的 ArkUI 架构中这不是“优化建议”而是必须遵守的架构规则

更多文章