news 2026/4/23 15:50:59

HarmonyOS 项目中如何拆分共用层与形态模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 项目中如何拆分共用层与形态模型


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

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

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

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

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

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

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

文章目录

    • 引言
      • HarmonyOS 项目中,为什么要拆「共用层」和「形态模型」
    • 一、什么是真正的「共用能力层」
      • 典型可以下沉为共用层的内容
      • 共用层的一个重要原则
    • 二、什么是「形态专属模型层」
      • 不同形态,模型关注点完全不同
        • 手机 App 模型关心什么?
        • PC 模型关心什么?
        • 游戏 / 强交互形态关心什么?
    • 三、一个推荐的拆分结构(真实可用)
    • 四、PC 形态下,一个“必须独立”的模型例子
      • PC 文档模型的核心,不是内容,而是「状态」
    • 五、一个判断标准:这段逻辑该放哪?
    • 六、总结

引言

HarmonyOS 项目中,为什么要拆「共用层」和「形态模型」

在 HarmonyOS 项目里,真正能复用的东西,其实非常有限

如果你把一个项目跑在:

  • 手机
  • 平板
  • PC
  • 甚至游戏窗口 / 多实例

你会发现一个很残酷的现实:

逻辑看起来一样,但模型几乎一定不一样。

所以在 HarmonyOS 中,正确的拆法不是:

「这段代码能不能复用?」

而是先想清楚:

哪些东西“不该知道设备形态”?
哪些东西“必须知道自己跑在哪”?

这就是共用层和形态模型的边界。

一、什么是真正的「共用能力层」

共用能力层只有一个标准:

它不应该关心:

  • 屏幕大小
  • 窗口是否可缩放
  • 是否支持多文档
  • 是否存在鼠标 / 键盘
  • 是否允许后台常驻

典型可以下沉为共用层的内容

这几类,在 HarmonyOS 上几乎永远成立

  • 网络请求(API / GraphQL / WebSocket)
  • 数据持久化(KV / RDB / 文件 IO)
  • 业务计算规则
  • 状态派生逻辑(非 UI)
  • 跨设备同步协议
  • 权限与能力判断封装

共用层的一个重要原则

共用层只输出“能力”,不输出“行为”。

举个例子

错误的共用层设计:

// 不该出现在共用层exportfunctionopenDocument(id:string){Router.pushUrl({url:'pages/editor',params:{id}})}

正确的共用层设计:

// common/document/DocumentRepository.tsexportclassDocumentRepository{asyncload(id:string):Promise<Document>{// 只负责数据}asyncsave(doc:Document){// 只负责持久化}}

“怎么打开、在哪打开、能不能多开”——一律不在共用层出现。

二、什么是「形态专属模型层」

这是很多 HarmonyOS 项目最容易偷懒、但后期最痛的地方

形态模型层解决的不是 UI,而是:

“这个形态下,业务是怎么运转的”

不同形态,模型关注点完全不同

手机 App 模型关心什么?
  • 单页面 / 栈式导航
  • 页面切换即上下文切换
  • 生命周期频繁
  • 强依赖前后台状态
PC 模型关心什么?
  • 多窗口 / 多文档并行
  • 文档是否脏(dirty)
  • 是否允许并排视图
  • 窗口最小化 ≠ 生命周期结束
游戏 / 强交互形态关心什么?
  • 帧循环
  • 输入源多样化
  • 状态常驻
  • UI 与逻辑高度解耦

你可以共用数据层,但你不可能共用模型层。

三、一个推荐的拆分结构(真实可用)

下面是我在 HarmonyOS PC 项目里比较稳定的一套结构

src/ ├── common/ │ ├── network/ │ ├── storage/ │ ├── domain/ │ │ ├── Document.ts │ │ └── User.ts │ └── service/ │ ├── app/ │ ├── model/ │ │ └── AppSessionModel.ts │ └── ui/ │ ├── pc/ │ ├── model/ │ │ ├── WorkspaceModel.ts │ │ └── DocumentWindowModel.ts │ └── ui/ │ └── game/ ├── model/ └── runtime/

关键点在于:

  • common永远不 import app / pc
  • pc/model可以组合common
  • 模型之间允许策略不同,不强求一致

四、PC 形态下,一个“必须独立”的模型例子

PC 文档模型的核心,不是内容,而是「状态」

// pc/model/DocumentWindowModel.tsexportclassDocumentWindowModel{constructor(privaterepo:DocumentRepository){}document:Document|null=nullisDirty:boolean=falseisActive:boolean=falseasyncopen(id:string){this.document=awaitthis.repo.load(id)this.isDirty=false}updateContent(content:string){if(!this.document)returnthis.document.content=contentthis.isDirty=true}asyncsaveIfNeeded(){if(this.document&&this.isDirty){awaitthis.repo.save(this.document)this.isDirty=false}}}

如果你把这个模型强行塞进手机 App:

  • 页面切换时你会丢状态
  • 多文档会变成噩梦
  • 后台恢复逻辑会失控

不是代码写得不好,是模型选错了形态。

五、一个判断标准:这段逻辑该放哪?

我给你一个非常好用的判断表:

问题
是否依赖窗口 / 页面数量形态模型共用层
是否依赖输入方式(鼠标 / 触控)形态模型共用层
是否只关心数据正确性共用层形态模型
是否涉及生命周期策略形态模型共用层
是否希望跨形态完全复用共用层形态模型

六、总结

HarmonyOS 的“统一”,是能力层的统一,不是模型的统一。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:18:20

深入探讨Clang 16的Niebloid编译问题

在C++编程中,我们经常会遇到一些编译器之间的兼容性问题,尤其是在使用一些高级模板技术或特定模式时。今天,我们来探讨一个有趣的例子:在Clang 16编译器中遇到的问题,这个问题与Niebloid(一种C++模板编程技巧)有关。 问题背景 假设我们有一个简单的C++代码,它定义了一…

作者头像 李华
网站建设 2026/4/23 14:50:59

深入探讨 .ConfigureAwait() 的实际用途

在现代的异步编程中,ConfigureAwait 方法常常被开发者提及和使用,但它的实际用途和使用场景却常常被误解。本文将通过一个具体的例子,深入探讨 ConfigureAwait 的用法和其背后的逻辑。 什么是 ConfigureAwait? 在 C# 中,await 关键字用于异步方法,它允许代码异步等待某…

作者头像 李华
网站建设 2026/4/20 1:23:24

巴菲特-芒格的氢能源投资:清洁能源的下一个前沿

巴菲特 - 芒格的氢能源投资:清洁能源的下一个前沿 关键词:巴菲特、芒格、氢能源投资、清洁能源、能源转型、投资策略、氢能源应用 摘要:本文聚焦于巴菲特和芒格的氢能源投资决策,深入剖析氢能源作为清洁能源前沿领域的发展潜力。通过对氢能源核心概念、算法原理、数学模型的…

作者头像 李华
网站建设 2026/4/18 7:36:41

内存高效的嵌入

原文&#xff1a;towardsdatascience.com/memory-efficient-embeddings-d637cba7f006 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ecd39944686ee1c2c55a328878b1592c.png 照片由 Kostiantyn Vierkieiev 在 Unsplash 上提供 在处理分…

作者头像 李华
网站建设 2026/4/23 14:48:34

AutoGen Studio镜像免配置:Qwen3-4B预置Prometheus指标暴露与Grafana看板

AutoGen Studio镜像免配置&#xff1a;Qwen3-4B预置Prometheus指标暴露与Grafana看板 1. 什么是AutoGen Studio AutoGen Studio不是一个需要你从零敲命令、配环境、调参数的开发工具&#xff0c;而是一个真正开箱即用的低代码AI代理构建平台。它把原本分散在代码、配置文件和…

作者头像 李华
网站建设 2026/4/22 21:14:58

Lychee多模态重排序模型在电商搜索中的惊艳效果展示

Lychee多模态重排序模型在电商搜索中的惊艳效果展示 1. 电商搜索的“最后一公里”难题&#xff0c;它真的能解决吗&#xff1f; 你有没有遇到过这样的情况&#xff1a;在电商平台搜“夏季薄款纯棉T恤”&#xff0c;结果前几页全是厚实的长袖衬衫&#xff0c;或者图片模糊、描…

作者头像 李华