Omi架构实战用贪吃蛇游戏理解两层架构与三层架构的选择【免费下载链接】omiWeb Components Framework - Web组件框架项目地址: https://gitcode.com/gh_mirrors/om/omiOmi是一个轻量 Web Components 框架内置 Signal 响应式信号。Omi 官方用同一款贪吃蛇游戏实现了两种架构基于Signal类的两层架构和基于响应式函数的三层架构。本文带你用 5 分钟看懂它们的差异并给出明确的选择建议——帮你快速判断自己的项目该用哪种 Omi 架构。为什么贪吃蛇是理解 Omi 架构的最佳样本贪吃蛇麻雀虽小五脏俱全它有游戏状态地图、蛇身、暂停标记、业务逻辑移动、吃食物、变长和用户交互转向、调速、重开。这三种角色恰好对应了前端架构中最核心的分层问题。Omi 仓库里并排放着两个几乎一样的贪吃蛇游戏区别只有一句话snake-game-2tier —— 基于 OmiSignalclass 的两层架构snake-game-3tier —— 基于 Omi 响应式函数的三层架构先来看看 Omi 框架整体长什么样下面这张图是 Omi 响应式信号的数据流示意两层架构Model 即状态目录结构与角色分工两层架构非常直接整个项目只有两层Model数据 逻辑和View视图。snake-game-2tier/src ├── index.tsx # 入口创建 Game 并注入全局 ├── models/ │ ├── game.ts # GameModel继承 Signal状态与逻辑都在这里 │ └── snake.ts # SnakeModel纯蛇的移动逻辑 └── views/ ├── game/index.tsx # 控制区视图按钮 └── screen/index.tsx # 游戏画面视图16x16 网格核心设计在 game.ts 里——Game直接继承 Omi 的Signal类class Game extends SignalSignalValueType { // 状态放在 this.value 里{ map, paused } bind pauseOrPlay() { this.value.paused !this.value.paused this.update() // 改完值手动通知视图刷新 } }模式很简单改this.value→ 调this.update()→ 视图自动重渲染。视图如何消费 Model入口 index.tsx 创建唯一的 Game 实例用 Omi 的mixin注入到所有组件视图组件 views/game/index.tsx 直接调用 Model 上的方法div classbtn onClick{game.snake.turnUp}Up/div div classbtn onClick{game.reset}Reset/div span{game.value.paused ? Play : Pause}/span没有中间层视图和 Model 是直连的。三层架构插入一个 Store多出来的那个目录对比两个项目的目录差异一目了然——三层架构多了一个stores/目录snake-game-3tier/src ├── models/ # 和两层版几乎相同但 Game 不再继承 Signal ├── stores/ │ └── index.ts # ⭐ 新增的 Store 层持有状态转接一切操作 └── views/ # 视图不再 import Model只 import Store在 stores/index.ts 中Store做了三件事创建 Modelnew Game({ onTick })并把每帧回调指向自己的state.update()持有状态用 Omi 的响应式函数signal()创建state暴露操作turnUp、reset等bind方法全部转发给 Model。export class Store { bind turnUp() { this.snake.turnUp() // 视图永远只调用 Store 的方法 } }Model 变成了纯业务类这是两种架构最本质的区别。三层版里的 game.ts 是一个普通 class不继承 Signal、不 import Omi、不认识视图——它通过构造函数接收onTick回调来通知外部我这一帧跑完了class Game { constructor(options) { this.onTick options.onTick // 由 Store 注入 } tick() { // ... 移动、吃食物、标记格子 this.onTick() // 我不直接更新 UI只发信号 } }于是依赖关系变成单向的View → Store → ModelModel 对上层完全无感知。两种架构差异速览维度两层架构snake-game-2tier三层架构snake-game-3tier状态载体Model 继承Signal类Store 使用signal()函数状态位置Model 内部this.valueStore 中与 Model 分离视图依赖对象直接持有 Model只持有 StoreModel 是否感知 Omi是import 自 omi否纯业务逻辑手动刷新点Model 里调用this.update()Store 里调用state.update()适合规模小工具、单组件应用多组件共享状态、需要测试的业务我该选哪种架构一份决策清单选两层架构如果项目就是一个单页面小工具计数器、小游戏、表单状态只有一个组件在读不存在跨组件共享希望代码路径最短Signal类把状态和操作收在同一个对象里写起来最省。选三层架构如果多个组件都要读同一份状态比如游戏画面和控制区希望 Model 变成可独立单测的纯逻辑——它不依赖任何框架 API未来可能换视图层Store 这一层让状态管理与渲染解耦。 一句话总结两层是 Signal 类的内聚式用法三层是响应式函数的解耦式用法。状态共享范围决定分层深度——不共享就两层共享了就三层。本地运行两步跑起来克隆 Omi 仓库git clone https://gitcode.com/gh_mirrors/om/omi进入任一模板启动开发服务器cd omi/packages/snake-game-2tier npm install npm start把路径换成snake-game-3tier即可体验三层版。两个游戏功能完全一致边玩边对照源码架构差异会非常直观。延伸阅读想继续深入 Omi 的响应式体系可以参考仓库内这些资料框架主包与示例packages/omi/含 signal.tsx、signal-object.tsx独立响应式信号库packages/reactive-signal/中文入门文档getting-started.md、reactivity.md从贪吃蛇到真实业务Omi 的两层与三层架构给出的不是二选一的难题而是一个随项目复杂度自然生长的答案。【免费下载链接】omiWeb Components Framework - Web组件框架项目地址: https://gitcode.com/gh_mirrors/om/omi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
如何用一个界面管好四种品牌的摄像头:免费GB28181开源监控平台五步接入指南 如何用一个界面管好四种品牌的摄像头:免费GB28181开源监控平台五步接入指南 【免费下载链接】wvp-GB28181-pro 基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌… · 2026/9/22 22:09:20
珠穆朗玛峰海拔一文搞懂:从定义到测量原理全解析 珠穆朗玛峰海拔一文搞懂:从定义到测量原理全解析 官方文档太长抓不住重点,很多人想搞清珠穆朗玛峰海拔到底怎么算出来的,翻遍资料还是云里雾里。今天咱们就用大白话,一文搞懂这个看似简单实则复杂的测量难题。别被那些晦涩的术语吓退,咱们一步步拆解,保… · 2026/9/22 22:09:14
SD.Next API 批量出图:3 条命令跑完 100 张 SD.Next API 批量出图:3 条命令跑完 100 张 【免费下载链接】automatic SD.Next: All-in-one WebUI for AI generative image and video creation, captioning and processing 项目地址: https://gitcode.com/GitHub_Trending/au/automatic
板块一 定位与场… · 2026/9/22 22:09:02
3个五彩球性能优化坑点,90%的人第一步就写错 3个五彩球性能优化坑点,90%的人第一步就写错 官方文档翻了三遍,核心逻辑还是像雾里看花?别慌,这是常态。很多开发者对着五彩球(Wucai… · 2026/9/22 22:46:59
2026最新qq大赢家原理图解:解决代码跑不通的调优实战 2026最新qq大赢家原理图解:解决代码跑不通的调优实战 复制来的代码直接运行报错,堆栈信息满屏飘,新手最容易卡在“不知道为什么错”。2026最新的开发环境对依赖版本和内存管理更敏感,旧教程里的代码往往因底层机制变化而失效。别再盲目修改参数… · 2026/9/22 22:46:59
shockwave flash已经崩溃源码深度剖析 Shockwave Flash已崩溃:从入门到精通的排错指南 你刚把语法敲完,项目一跑就报“Shockwave Flash已经崩溃”,是不是觉得脑子嗡嗡的?这种“学会语法却不知怎么搭项目”的断崖式体验,是无数开发者从新手迈向高手的必经之路。… · 2026/9/22 22:46:59
5年老兵揭秘:企业管理培训心得体会结合实战项目避坑指南 5年老兵揭秘:企业管理培训心得体会结合实战项目避坑指南 刚拿到那份复制来的代码,是不是心里慌得一批?跑起来全是红字报错,看文档像看天书,脑子里全是问号。别慌,这种“复制即崩”的尴尬,在每一个试图用后端视角理解企业管理培训心得体会的应届生身上… · 2026/9/22 22:46:32
roxio最佳实践:3个坑点让公路前端开发效率翻倍 roxio最佳实践:3个坑点让公路前端开发效率翻倍 刚接公路项目时,我盯着roxio文档发了两小时呆。官方文档动辄几十页,全是参数说明,新手根本抓不住重点。… · 2026/9/22 22:46:19
qq令牌下载实战:新手避坑指南与底层解析 qq令牌下载实战:新手避坑指南与底层解析 看了一堆教程还是不会写项目?别急,这其实是大多数开发者的通病。很多新人把“跑通代码”当成终点,却忽略了 新手避坑 才是落地的关键。今天我们要聊的 qq令牌下载… · 2026/9/22 22:45:39
5个电影海报图片处理坑,新手避坑指南 5个电影海报图片处理坑,新手避坑指南 刚写完代码,一运行屏幕直接炸了。满屏红色的 StackTrace 滚得比弹幕还快,什么 NullPointerException 、 ImageIO.read() returned null 、… · 2026/9/22 0:00:07
注册微信公众账号:一文搞懂从0到1全流程 注册微信公众账号:一文搞懂从0到1全流程 复制来的代码跑不通,报错信息满屏飞,到底卡在哪?别急,咱们先停下手里的调试。很多开发者觉得注册微信公众账号只是填个表单、传个身份证那么简单,真上手才发现坑深不见底。今天这篇 一文搞懂… · 2026/9/22 0:00:07