刚刚,优酷的模版引擎,竟然开源了!
共 3603字,需浏览 8分钟
·
2022-05-29 07:11
什么是模板
架构设计
动态模板引擎在优酷内部代号为GaiaX,按照分层设计理念共分为4层。基础依赖层坚持最小依赖原则,要重点说明的是,为了保证模板布局计算的高性能,我们引入了由RUST编写的StretchKit高性能布局计算引擎[https://github.com/vislyhq/stretch],其具备跨端、较小的包体积(170K)、计算性能卓越等特点;核心渲染层构成模板引擎的渲染内核,解决模板文件解析、虚拟节点树构建、布局计算、表达式构建解析等核心逻辑;模板中心及模板服务层则更面向业务,与优酷业务架构进行结合实现对现有能力的复用,避免重复造轮子,并向上层业务提供标准化模板渲染及接入服务。
总线设计
对于动态模板引擎来说,输入结构化的模板文件,经过文件IO、数据解析、虚拟节点树构建、布局计算、表达式运算、渲染树构建到真实视图树组成了完整的总线链路。
Node作为基础的虚拟节点,负责CSS中Style信息生成客户端样式属性,以及CSS布局信息通过StretchKit生成的frame布局信息,同时获取父node,以及和子node数组的对应关系。 Node和View的关系是一一对应的,Node通过creatView的方式创建不同的view视图,以及renderView的方式将样式和frame一次性赋值给view,减少重复的赋值操作。 在此基础上根据模板中的视图type衍生出rootNode,viewNode,imageNode,以及textNode。
性能保障
StretchKit库的优势
选中Stretch看中的就是其有着极好的性能表现和较高的内存使用率,而这些都是Rust语言特性所带来的。Rust速度惊人且内存利用率极高,标准Rust性能与标准C++性能不相上下,某些场景下效率甚至高于C++。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的场景。
AST层级极简
线程减负
通过对虚拟节点树进行DIFF运算,当真实存在数据改变时才提交更新处理 减少线程池线程数,避免不必要的并发线程间的资源开销及抢夺 对数据遍历、JSON解析赋值、布局计算等处理进行异步化,保证对于主线程非必要不提交
关键数据,技术方案横向对比
技术方案 | DSL | 最佳实践 | 胶水层 | 渲染方案 | 研发团队 |
Weex | Vue/Rax | 页面动态化 | JSBridge | Native渲染 | 阿里巴巴手淘技术团队 |
ReactNative | React | 页面动态化 / App整体架构方案 | JSBridge | Native渲染 | |
MTFlexbox | XML | 组件级接入 | 无 | Native组件半异步渲染 | 美团终端业务研发团队 |
GaiaX动态模板引擎 | JSON | 组件级接入 | 无 | Native组件半异步渲染 | 优酷应用技术团队 |
性能表现
iOS | Android | ||||
低端机 | 中端机 | 高端机 | 低端机 | 中端机 | 高端机 |
54.0 | 57.0 | 58.0 | 38.99 | 57.5 | 58.81 |
55.0 | 58.0 | 57.0 | 38.9 | 58.09 | 58.91 |
55.0 | 58.0 | 57.0 | 40.6 | 57.77 | 58.86 |
线上效果
优酷动态模板引擎业务赋能
目前在优酷15+业务团队中,均接入使用了动态模板引擎作为跨端提效技术方案;经过自2020年起一整年业务应用,从实际效果来看,对于多端组件开发整体研发效率提升可达30%左右,单组件研发人力投入可由0.5-1人日下降至0.25-0.5人日。
项目空间
项目地址:https://github.com/alibaba/GaiaX
开源协议:项目遵循Apache2.0协议
项目文档地址:https://www.yuque.com/biezhihua/gaiax
直达项目,点亮star!