广州总部电话:020-85564311
广州总部电话:020-85564311
20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

页面搭建方案(TurboUIBuilder)在穿搭星球的实践

发布日期:2025-11-15 07:33:32 浏览次数: 813 来源:大淘宝技术
推荐语
手淘穿搭星球业务如何通过TurboUIBuilder实现高效页面搭建与极致用户体验?

核心内容:
1. 从Weex到Native技术栈的演进背景与挑战
2. TurboUIBuilder的三层架构与核心功能设计
3. 实际落地效果与业务收益量化分析
小优 网站建设顾问
专业来源于二十年的积累,用心让我们做到更好!
图片



文介绍了手淘穿搭星球业务在面对快速迭代和极致用户体验需求时,从初期Weex方案转向Native技术栈,并基于微服务架构设计了TurboUIBuilder这一可视化页面搭建平台。该方案通过Template-Container-Component三层结构实现页面布局的结构化与动态化,结合DX动态组件、keypath数据绑定协议和内置核心服务(如布局、数据、埋点等),提升了开发效率30%-50%,实现了双端一致性、体验优化开箱即用(如无极缩放转场、多媒体浏览)以及页面的远程动态更新。同时,依托Skyline模板发布平台,支持高效、安全的模板管理与AB测试,最终形成了一套可复用、易扩展、高稳定性的Native页面底层构建引擎,已在穿搭星球等多个场景落地并持续演进。

图片


今年初为了更好的服务服饰⾏业,App推出了穿搭星球作为⼀个重⽤户体验的新盖了穿搭Tab//详情⻚/趋势落/⻚等多⻚⾯度和⽤户体验提出了极⾼要求前期为了⽀持务快线我们采⽤了Weex的技术⽅MVP版本的快实现但是随着务的快速迭体量快产品对交互体验的极要求Weex⽅案⾸开体验(如⾸屏加⻚⾯转场体验),  精细化交互(/视频等多媒体)离我们的⽬标以及竞品定差距

Native

Native开发模式开发效率双端,业务框架体验优化等问题上,到了诸多挑战项⽬初期我们调研了App现有的Native框架⽅案发现些⽅案领域有其优势因过于依赖服务端/特定景定制/乏双端性等因素完全满⾜穿搭星球务的需求

A
套多端协作的解决⽅案在通过协议化的⽅式实现前端 客户端服务端的⾼效协作逻辑后移到服务端前端染和从⽽实现轻量化的前端开发
1.组
2.重()
B
Native DXFeeds
1.微
2.DX
3.特

为什么需要⻚⾯搭建


,   使搭建的搭建/模版的

Native,  Android块:
Activity/Fragment
RecyclerView/
Mtop
(UI, )
Mtop

以往我们沉淀了很多各种各样的/UtilSDK⼯具库和优化但是新建⻚⾯时我们依需要从零开始⼯具库和逻辑等整合到花费量精性能调优列表刷新等⽼⽣常的问题上,效率我们可以借⻚⾯搭建的思变的⻚⾯和多变的逻辑(组件)通过结构化协议解耦从⽽提⾼提⾼发效

我们TurboUIBuilder⽅案设计的程中借的思希望构建⾯向Native开发的以体验优先以效率为核⼼的可视化⻚⾯搭建平台/⽤端侧SDK成为Native⻚⾯开发的底层构建引擎开发同学务功开发实现新⻚⾯的多端快交付。

TurboUIBuilder设计



穿TurboUIBuilder

  底层架构选

前⾯提到构建⼀个Native⻚⾯及各种各样的功能些功能相互依,且未来随着代复杂度⼀个好的架构需要做到功能⾼内聚低耦合,且具备好的扩展性我们会化的架构思想将整体功能拆分成各个业或者基础间有明确的能⼒能够⾏单独从⽽做到⾼内聚低耦合但需要设计好的块通/管理⽅案

通信, 务相来解决。


TurboUIBuilder的微服务架构本我们将⻚⾯搭建程中及到的核⼼块进⾏微服务化拆分,形成稳定的底层架构开发同学只需要理解3,  TurboEngine, TurboEngineContextService 接⼝⾮常

1. TurboEngine
⻚⾯引擎实例,⼀个⻚⾯对应⼀个实例通过ServiceRegister册当前⻚⾯所需要的服务列表。
2. TurboEngineContext
(fun<T:IService> getService(serviceClass: Class<T>): T)节。
/** * 引擎上下文 * * 用于获取引擎的配置和微服务 * * */interface TurboEngineContext {    /**     * 获取服务     * @param serviceClass 服务类     * @return 服务     * */    fun<T:IService> getService(serviceClass: Class<T>): T    /**     * 获取Context的上下文     * @return 上下文     * */    fun getContext(): Context    /**     * 获取引擎配置     * @return 引擎配置     * */    fun getTurboEngineConfig(): TurboEngineConfig    /**     * 获取引擎的唯一实例id     * @return 实例id     * */    fun getInstanceId(): String}

3. Service

合。

/** * 微服务接口 * * */interface IService {    /**     * 服务创建     * */    fun onCreateService(context: TurboEngineContext)    /**     * 服务销毁     * */    fun onDestroyService(context: TurboEngineContext)}


Native⽤的Native:

核心服务

职责
PageService
⽀持完整的⻚⾯⽣命周期管理包括前后台切换回退事件器系统配置更新等部组件再也⽤和Activity实例
LayoutService
UI
DataService
Mtop
MessageCenterService
DXService
DXEventHandler, 式以DX
TrackService
/

  何设计布局服务

TurboUIBuilderLayoutService, 

我们从最常⻅的列表景开始 下,⼤多数产品的诉是希望能新增某种卡或者对已有卡样式功能⾏调整这类管是客户端是前端都沉淀了很多为成的动态件化⽅案很好的解决了这类问题Native会设计套卡+定协议端侧列表件对接数据协议DX或者Weex端⽅案利⽤双端致性和动态性来实现该功能


具有退


TabFeeds 异()Template-Container- Component)。

Template:Template。框defaultTemplate(), defaultMultiTabTemplate( Tab)DefaultListTemplate(Feeds), 展。
class TemplateFactory {    companion object {            const val LAYOUT_TYPE_DEFAULT_TEMPLATE = "defaultTemplate"        const val LAYOUT_TYPE_LIST = "defaultListTemplate"        const val LAYOUT_TYPE_TAB = "multiTabTemplate"    }    private val layoutServiceMap:MutableMap<String, KClass<out TemplateComponent>> = mutableMapOf()    init {        registerTemplateType(LAYOUT_TYPE_DEFAULT_TEMPLATE, DefaultTemplateComponent::class)        registerTemplateType(LAYOUT_TYPE_TAB, MultiTabTemplateComponent::class)        registerTemplateType(LAYOUT_TYPE_LIST, DefaultListLayoutComponent::class)    }    fun createTemplateComponent(type: String, context: TurboEngineContext): TemplateComponent? {        return layoutServiceMap[type]?.java?.getConstructor(TurboEngineContext::class.java)?.newInstance(context)              }    fun registerTemplateType(type:String, layoutComponent: KClass<out TemplateComponent>) {        layoutServiceMap[type] = layoutComponent    }}

Container

Contaienr则对应Template中的某个区块(对应户型中的某个区块,如阳台, 主卧等),每个Container由一个Component列表组成,比如上下布局页面,整个页面会包含topBar, body, bottom, pop 4个区块;而一个多tab的布局则包括header, segments, tabs等区块, 业务可以随意配置各个区块长什么样。


Component

Component是页面搭建系统中最小的组成单元,表示了独立的业务模块,可以是一个卡片或者导航条。一个Component负责渲染该模块的UI,并根据数据模型的更新进行UI刷新。

/** * 组件基类 */abstract class BaseComponent<MODEL, VIEW : View> : IComponentLifecycle<MODEL> {    protected abstract val context: Context    var view: VIEW? = null        private set    var data: MODEL? = null        private set    var state: State = State.NOT_CREATE        protected set    override fun onCreate(dataMODEL?, triggerType: TriggerType) {        checkAndHandleStateError(State.CREATE)        this.data = data        state = State.CREATE    }    /**     * 创建组件视图     * @return 创建的视图     */    open fun createView(): VIEW {               val view = createViewImpl()        view.setTag(R.id.turbo_component_tag, this)        this.view = view        return view    }    protected abstract fun createViewImpl(): VIEW    override fun onStart(triggerType: TriggerType) {              checkAndHandleStateError(State.START)        state = State.START    }    override fun onResume(triggerType: TriggerType) {               checkAndHandleStateError(State.RESUME)        state = State.RESUME    }    override fun onPause(triggerType: TriggerType) {               checkAndHandleStateError(State.PAUSE)        state = State.PAUSE    }    override fun onStop(triggerType: TriggerType) {                checkAndHandleStateError(State.STOP)        state = State.STOP    }    /**     * 更新组件数据     * @param data 更新的数据     */    fun updateData(dataMODEL) {        this.data = data        updateDataImpl(data)    }    protected open fun updateDataImpl(dataMODEL) {}    override fun onDestroy(triggerType: TriggerType) {              checkAndHandleStateError(State.DESTROY)        state = State.DESTROY    }  }


为了⽀持动态性和双端,⼀般会是⼀个dx模板 当然根据具体景也可以是 Native定义完全取决于鉴于DXNative和动态化我们⼤多数采⽤dx实现此引擎内DXComponent⾏了很多优化(如模板管理⽣命周期管理⽤的EventHandler式封装等)。

3(Feeds),式⼀TemplateContainer(TuboUIBuilder)由Component()


  • 业务

:
Template
  1. 最外层是⼀个上下布局的defaultTemplate,  有顶topBarbody内容区bottom以及poplayer弹窗区4Container,  ⻚只需要topBarbody两个 Container其中topBarContainer只有⼀个DX Component body由另外⼀个Template
  2. bodyTemplatedefaultMultiTabTemplate, header, segmentstabs 3 Container, defaultMultiTabTemplateTabtab/


  ⻚⾯数据管理

有了布局服务之后有了染⻚⾯的但是具体些内容依赖数据处理DataService⻚⾯初始化时载缓存数据/请求⻚⾯主接⼝并将务的原始数据root Template⾏数据刷新

⾥需要解决⼀个数据定问题Component如何知应该定服务端原始数据的些字段呢?⼀般会做服务端换或客户端有如⽅案些局限

(GraphQL
)

穿端⽅()

DXDX取VM,  keypath到对Component

我们采⽤了基于keypath的数据定协议通过{{keypath}}够获取原始数据该字段的数务可以针对每Component来动态定对应的务数据
tab系:
"segment": [    {      "type""dress_tab_layout"//dx模板名称      "data""{{$.tab}}"         //绑定原始数据上的tab字段    }  ],  "tabs": [    {      "type""infoflowListComponent"//native组件名称      "data""{{$.tab.tabs}}",        //绑定原始数据上的tab.tabs字段      "isRepeat"true    }  ]


  设计⻚⾯板协议


LayoutService决定了⻚⾯的布局DataService决定了⻚⾯件的数据逻辑合⻚⾯搭建的思想然的想到将些动态的配置信息构化套标准的⻚⾯模板协议驱动⻚⾯模板和件的拼装

我们参其他搭建⽅案的模板协议合我们⻚⾯搭建的⽬标和定义出如⻚⾯模板协议在这过程中我们主要两个因素准化

:
  1. JSON Schema本;
  2. template  root  page/components/layout 了;
    root: 
    page: 
    components: (dx url)
    layout:containercomponents
  3. 范。

:
layout便customConfig便义。

:
{  "data":{}, //业务数据,与模板数据完全隔离,对服务端无侵入  "template": { //页面模板数据    "bizId""bizId",           // 业务标识,用于区分不同的业务场景,如穿搭频道,穿搭详情    "version""1",                  // 模板版本,版本控制字段,ab/版本隔离    "root": { // 根模板定义,页面加载入口        "page": { // 页面配置            "type""defaultTemplate",   // 模板类型,描述页面渲染结构            "config": { ... }, // 页面配置,页面样式,缓存配置            "utParams": { ... } // 埋点参数            "customConfig": { ... }, // 自定义配置        },        "components": [ ... ], // 组件定义,包括组件版本信息        "layout": { // 布局结构            "topBar": [ 组件 ], // 顶部栏            "body": [ 组件 ], // 主体内容            "bottom": [ 组件 ] // 底部栏            "pop": [ 组件 ] // 浮层区        }    },    "subTemplates": [ ... ] // 子模板定义,用于模板嵌套/复用    }}

:
{  "template": {    "bizId""dressUpFeed",    "version""2",    "root": {      "page": {        "type""defaultTemplate",        "config": {          "enablePageCache"true        },        "utParams": {                 }              },      "components": [        {          "type""dress_home_navbar",          "renderMode""dx",          "dx": {            "name""dress_home_navbar",            "version"15,            "url""cdn url",            "columnType""one"          }        }      ],      "layout": {        "body": [          {            "data""{{*}}",            "isTemplate"true,            "refId""dressup_multitab"          }        ],        "topBar": [          {            "type""dress_home_navbar",            "data""{{*}}"          }        ]      }    },    "subTemplates": [      {        "name""dressup_multitab",        "page": {          "type""multiTabTemplate",          "config": {                       "initTabIndex""{{$.tab.selectedTabIndex}}"          }                 },        "components": [          {            "type""dress_tab_layout",            "renderMode""dx",            "dx": {              "name""dress_tab_layout",              "version"14,              "url""cdn url",              "columnType""one"            }          },          {            "type""infoflowListComponent",            "renderMode""native"          }        ],        "layout": {          "segment": [            {              "type""dress_tab_layout",              "data""{{$.tab}}"            }          ],          "tabs": [            {              "type""infoflowListComponent",              "data""{{$.tab.tabs}}",              "isRepeat"true            }          ]        }      }    ]  }}

  板发布平台

确性,⽣
(JSON⼿)等。
 配。
: 效。
: 的。

Orange分离天然就会导的问题会带来潜的⻛险同时Orange平台是字符串修改护成本极⾼

是需要⼀个可视化平台⾏⽇常模板的开发/发布等管理为了减少服务端的接⼊成本我们调研了兄弟队提供的⼀个可视化配置平台上,服务端只需要接⼊该平台然后发模板配置即可对原有逻辑⽆侵⼊(新增template字段)

能⼒AB

TurboUIBuilder

Container:

  优化开

务开发程中我们会碰到各种体验优化问题视频多媒体转场体验等等些问题常常需要花很多的⾏优化我们希望提供站式的服务些优化也内到框架中通过简单的配置拥有很好的⽤户体验减少重复的⼯作量。


为了详情⻚览最好的⽤户体验接⼊⽤的转场sdk, ⽀持⽆极放的转场和⼿势整体技术链路如:


//LivePhoto化。
(q99, ), 
, HDR
LivePhoto
LivePhoto

  最终体架构

TurboUIBuilder:

:
/
Native/
 DX

  

TurboUIBuilderVCViewDX

穿(/)DX(穿的DXEventHandler)Component等。



Native,  TurboUIBuilder(统Native30%-50%)提升代码质量。

穿Tab2AITurboUIBuilder
Native
 2 * 1⽉ 开发

双端从零构造新页面,页面框架、数据加载、UI渲染逻辑混合在一起,在稳定性/复用和双端一致性难以保证

/UI
TurboUIBuilder⽅
 2 * 2⻚⾯线
(DX)

可复用的页面搭建框架, 开发规范,稳定性,持续优化和演进

双端一致,AI Coding更提效


思考和后续规划


我们摒弃以前从零构建⻚⾯各种技术⽅案/底层库临时拼凑的开发⽅式TurboUIBuilder使得以前沉淀的各种⼯具/SDK能够找到⾃⼰的位整合成套完整的技术⽅案形成合⼒

TurboUIBuilder化:
1. 标/
  1. 展。
  2. 端侧模板/⼒标准化建⽴件设计规范构建丰富的件库确保件接⼝双端务解提⾼复⽤性和可护性
  3. 模板/件⽣态⽀持更多样化的⻚⾯布局模板和⼒扩展建⽴更丰富的件和模板库。
2. 接
  1. ⻚⾯搭建平台提升易⽤性包括配置参数的可读性/错误检验步提升发布监控⼒等等。
  2. ⼒。
  3. /题。
3. 三:  鸿

团队介绍


本文作者水军,来自淘天集团-推荐客户端团队。 本团队负责手淘推荐域、Tab2等亿级流量核心场域,直面高复杂度业务挑战,打造千万用户每日体验的内容生态与沉浸式交互!同时突破端智能应用前沿技术,主导推荐场景端智能落地(智能重排、AI探索实践)、架构演进,用技术驱动业务创新!


招聘:

🔥 【淘天集团·Android/IOS客户端急招!推荐 & 端智能应用,主导手淘亿级核心场域!】 🔥

✅ 成长双引擎驱动

业务深度:参与手淘核心链路技术建设,深度优化性能、稳定性及用户体验;

技术高度:探索客户端与AI融合场景(端侧智能、实时推荐),打造技术竞争力!

✅ 团队轻松有爱

🏃 周三C区健康日:全员跑步打卡,半马选手领跑(程序员的第一公里)

🍻 生活充电站:每月盲盒主题聚餐(露营烧烤/杭帮菜探店)+ 户外徒步(西溪湿地/梦想小镇)

🧠 硬核分享会:每周五技术技术开放麦(端侧推理实战/AI业务落地/跨端前沿实践)


📍 Base地:杭州

⏳ HC有限,招满即止!流程闪电推进:简历→面试→Offer,全程高效!


如果你渴望在业务架构设计领域继续精进,共同探索AI时代技术演变路径,欢迎联系我们junqing.wjq@taobao.com或shuijun.wsj@taobao.com。




¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术
服务端技术 | 技术质量 | 数据算法




优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询