小程序跨端组件库 Mpx-cube-ui 开源:助力高效业务开发与主题定制
Mpx-cube-ui 是一款基于 Mpx 小程序框架的移动端基础组件库,一份源码可以跨端输出所有小程序平台及 Web,同时具备良好的拓展能力和可定制化的能力来帮助你快速构建 Mpx 应用项目。
Mpx-cube-ui 提供了灵活配置的主题定制能力,在组件设计开发阶段对表现层的结构和样式进行抽离,利用预编译器和 CSS 变量的能力,提供细粒度(颜色、字体、圆角、阴影等)的样式定制能力,你的项目可以按需使用主题的编译方案还是运行时方案来满足不同样式风格的业务场景开发。
Mpx-cube-ui 提供了开箱即用的跨端输出能力,源码基于 Mpx 小程序框架进行开发,依托于 Mpx 提供的跨平台能力即基于微信小程序跨平台编译输出为支付宝、百度、QQ、头条等目标平台的小程序代码,同时还可以输出到 Web。
接下来会通过这篇文章去分享一下 Mpx-cube-ui 是如何诞生的。
如需深入了解滴滴开源项目Mpx,请参阅相关文章:
滴滴开源小程序框架Mpx,致力于提高小程序开发体验
滴滴出行小程序体积优化实践
滴滴小程序框架Mpx发布2.0:可直接转换已有微信小程序
小程序框架Mpx的下一代脚手架升级之路|滴滴开源
滴滴小程序开发标准 Mpx 推出新版本,聚焦性能与包体积优化
滴滴开源小程序框架 Mpx 新特性:局部运行时能力增强
背景
随着越来越多的业务产品通过小程序这一渠道进行推广和使用,各个技术团队也开始根据各自业务产品的需求进行定制化开发。在滴滴的所有小程序产品中,滴滴出行小程序作为最大的C端流量入口,负责将不同业务的流量进行有效分发。在具体的小程序产品研发过程中,这些不同业务的小程序被集成到滴滴出行小程序中,统一打包上线和发布。
在这种跨业务和技术部门的产品研发环境下,各技术团队都注重构建自身的基础能力。以小程序的组件库为例,每个独立业务产品都会根据自身的交互设计规范,构建一套符合业务需求的基础组件,以提高日常业务开发的效率。这些基础组件可能包括按钮、半浮层弹窗、Toast、Dialog、表单等。
除了在跨业务产品研发场景中,同一技术团队内部也可能需要应对来自不同业务产品方向的需求。这些不同业务产品同样具有独立发展和迭代的需求。由于业务场景的限制,团队内部也需要考虑如何积累和复用基础能力,以便在节约研发资源的同时提高业务项目交付的质量和效率。
在不同业务产品的发展初期,为了快速交付产品功能并确保上线时间,研发团队会尽可能地利用已有基础能力来快速构建产品功能。以小程序组件库的复用为例,常见的做法包括:
直接在原有组件代码中进行硬编码(Hard Code),使不同业务产品依赖于同一份组件代码。通过使用if/else或条件编译等手段,使原有组件既能满足最新业务需求,又不会影响原有业务的使用。
Fork 一份原有组件库的代码,并在其基础上进行单独迭代和维护,从而实现与原有组件的完全隔离,避免产生污染。
然而,这两种方案都存在一定的问题。对于第一种方案,由于组件本身需要满足差异化的增量需求,导致组件的维护成本增加。同时,在处理差异化代码时,可能会在编译打包环节出现代码冗余问题,即原本不属于当前业务产品的代码实现也会被一同打包。对于第二种方案,组件库维护的数量增多,使得后续的组件迭代和更新需要在多处进行修改。
此外,在小程序场景下,还需要面对平台规范对包体积的硬性约束。尤其是对于像滴滴出行小程序这样的大型小程序,众多小程序业务产品被集成到同一个小程序中,包体积成为日常研发过程中重点关注的一个指标。良好的模块或组件复用性和可扩展性意味着无需重复开发相同功能代码,从而避免因重复实现相同功能而导致代码包体积过快增长。
Mpx 技术生态
在 Mpx 的技术生态中,目前的组件体系尚不完善。
目前使用 Mpx 去开发实际的业务产品的过程中,我们基于小程序平台的基础组件去搭建了特定业务场景的基础业务组件,因为业务场景、功能和代码实现等各方面的原因,这些业务场景的基础组件是没法开放给社区的 Mpx 开发者来使用的。因此,社区开发者要么只能基于平台的基础组件开发上层基础组件,要么使用第三方原生小程序组件库。无论哪种方式,社区开发者都需要付出一定的学习和开发成本。
此外,社区中也有不少用户希望 Mpx 能够提供更基础、更通用的组件,以更好地支持上层业务开发。
无论是我们内部维护的业务组件库,还是之前开源的基于 Vue 的 Web 组件库 Cube-ui,组件的文档和示例都是组件库迭代过程中的重要组成部分,需要花费大量时间和精力。在示例和文档方面,通常需要编写多份文案,并确保它们之间的同步更新。因此,如何降低组件库本身的维护成本,也是我们亟待解决的问题之一。
以上这些问题促使我们重新审视整个 Mpx 组件体系的构建和发展。
Mpx 组件体系
经过长期的业务迭代和验证,我们将 Mpx-cube-ui 做为 Mpx 技术生态中组件体系的基础设施:一个从业务当中沉淀的基础组件库,同时又具备良好的拓展能力和可定制化的能力来更好的支持上层业务。
在组件体系的构建过程中,我们将组件划分为以下类型:
业务组件:通常源于某个具体的产品功能,用于解决特定问题领域,强调关注点分离和代码维护成本。
基础业务组件:通常源于某一类业务产品,在特定业务背景下较为通用,较少融合业务逻辑,介于基础组件和业务组件之间,强调解决效率、可复用性和可维护性。
基础组件:通常源于我们的设计交互元语言,用于定义业务产品和用户的交互、反馈,强调一致性、效率和可复用性。
底层的基础组件(具有可组合性、可扩展性和稳定性)旨在更好地服务于上层的(基础)业务组件。从底层的基础组件到业务组件(自下而上),组件的业务属性逐渐增强,解决的问题领域更加聚焦,更贴近具体问题和场景,但其可复用性相应降低。
Mpx-cube-ui 组件设计和开发思考
我们以乘客交易和司机运营这两个不同业务方向的组件为例。在这两个业务场景中,虽然都有Modal半浮层组件,但由于司乘业务的不同设计规范约束,组件间的差异仍然较大。
为了解决组件库在跨业务产品的可复用性和可扩展性问题,我们遵循以下原则:弱化不同业务场景的设计规范(去业务),回归组件本身的行为(逻辑)、结构和样式(表现)。
行为:组件特有的行为方法,如展示(show)、隐藏(hide)和关闭(close)。
结构:便于组件间的重新组合,如头部区、标题区、内容区和底部操作区。
样式:便于业务场景的主题定制,如颜色、字号、圆角和边距等。
Mpx-cube-ui组件的主题定制有一个简单的逻辑关系:
全局基础样式变量:提供基本色值、字号等,影响所有组件的展示。
组件样式变量:继承全局基础变量的基本色值、字号等,涉及组件自身的结构、样式变量会单独定义。
组件渲染样式:直接依赖组件样式变量。
通过定制全局基础样式变量和组件样式变量,可以实现主题定制。关于主题定制的功能,请参见相关文档。
Mpx-cube-ui 实现的定制主题方案利用预编译器和 CSS Variables 的能力,提供细粒度的样式定制能力:
利用预编译器的可编程能力,在编译阶段即可完成主题能力的定制。当业务项目作为独立应用迭代时,可以仅利用预编译器的能力,以减小 CSS 代码体积。
利用 CSS Variables 的能力,可以解决更复杂的场景,例如同一个组件在巨型应用中,在不同业务场景页面需要有不同的主题样式。
在官网示例中,用户可以直接体验主题切换功能。
未来规划
开源更多内部沉淀的基础组件,以满足多样化的业务场景开发需求。
将文档示例一体化的能力独立打包开源,以便快速建立组件库网站,降低文档和示例代码的维护成本。
最后,诚邀大家加入 Mpx 用户群,共同参与和交流。
点阅读原文,跳转项目官网
相关文章:

小程序跨端组件库 Mpx-cube-ui 开源:助力高效业务开发与主题定制
Mpx-cube-ui 是一款基于 Mpx 小程序框架的移动端基础组件库,一份源码可以跨端输出所有小程序平台及 Web,同时具备良好的拓展能力和可定制化的能力来帮助你快速构建 Mpx 应用项目。 Mpx-cube-ui 提供了灵活配置的主题定制能力,在组件设计开发阶…...

GDC期间LayaAir启动全球化战略
3 月 18 日至 3 月 22 日,一年一度的游戏开发者大会(GDC)在美国旧金山举行。在此期间,Layabox宣布LayaAir引擎启动全球扩张战略,这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术,将…...

人工智能之Tensorflow批标准化
批标准化(Batch Normalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的。 随着神经网络的深度加深,训练会越来越困难,收敛速度会很慢,常常会导致梯度消失问题。梯度消失问题是在神经网络中,当前…...

自动化的免下车服务——银行、餐厅、快餐店、杂货店
如果您在20世纪70年代和2020年分别驾车经过免下车服务餐厅(汽车穿梭餐厅),您会发现,唯一的不同是排队的车型。50多年来,免下车技术一直为我们提供着良好的服务,但现在也该对它进行现代化改造了。 乘着AI和自…...
Git常用指令总结
Git常用指令总结 下载git,这个不需要交的!!! 1、初始化自己的git仓库 git config --global user.name “Your name” 配置自己的用户名 git config --global user.email “mailexample.com” 配置邮箱 git config --global c…...

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装
音乐是人类最美好的语言,它能够跨越国界、文化和语言,将人们紧密地联系在一起。在当今数字化时代,音乐创作已经不再是专业人士的专利,越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…...

【保姆级】前端使用node.js基础教程
文章目录 安装和版本管理:npm 命令(Node 包管理器):运行 Node.js 脚本:调试和开发工具:其他常用命令:模块管理:包管理:调试工具:异步编程和包管理:…...

xilinx的高速接口构成原理和连接结构
本文来源: V3学院 尤老师的培训班笔记【高速收发器】xilinx高速收发器学习记录Xilinx-7Series-FPGA高速收发器使用学习—概述与参考时钟GT Transceiver的总体架构梳理 文章目录 一、概述:二、高速收发器结构:2.1 QUAD2.1.1 时钟2.1.2 CHANNEL…...

git 上传文件夹至远端仓库的方法
上传的远端git可以是gitlab、github、gitee、gitblit或者gitCode等等 以下以GitHub为例说明: 1、登录GitHub网站(账户/密码) 2、创建一个新的空白项目(或者已有的项目)hello-world 分支是master ,这里默认即…...

【鸿蒙系统】 ---OpenHarmony加快本地编译(二)
💌 所属专栏:【鸿蒙系统】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢…...
centos配置natapp 自动配置
下载配置文件 centos 这里 我用的 natapp_autostart-master\natapp_autostart-master\systemd 文件夹下的 natapp.service 上传natapp 运行natapp客户端 在 https://natapp.cn 官网 下载客户端. 放在目录 /usr/natapp/ 运行 sudo chmod ax /usr/natapp/natapp给予可执行权…...
sell脚本多行合成一行
awk {ORS",\n"}{print $2} 120w-3-ws | awk {if(NR%10!0)ORS"";else ORS"\n"}{print $1 >> "newRefundIds.txt"}RS是awk读取文件时的行分隔符 ORS则是awk输出时的行结束符 FS是awk读入记录时的列分隔符 OFS则是awk输出时的列…...

部署prometheus 监控k8s集群
目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP:31940 部署k8集群…...
两个基本功不足导致的bug
作为程序员,基本功不好,可能会在工作中经常碰到一些看起来很隐蔽的 bug,乍看没毛病,自己半天还找不到问题所在。 但是,如果基本功扎实的同学可能一眼就能看出来。 一、HashMap 取不到值 Map<Integer, Integer>…...

【算法每日一练]-图论(保姆级教程篇16 树的重心 树的直径)#树的直径 #会议 #医院设置
目录 树的直径 题目:树的直径 (两种解法) 做法一: 做法二: 树的重心: 题目: 会议 思路: 题目:医院设置 思路: 树的直径 定义:树中距离最…...

Qt播放音乐代码示例
主界面 点击play按钮播放或暂停音乐,拖动进度条,音乐对应播放。 QWidget window;QPushButton* playButton new QPushButton("Play");// Qt 播放音乐// 创建 QMediaPlayer 对象QMediaPlayer* player new QMediaPlayer;// 指定音频文件的路径…...
多线程应用中的性能优化:创建合适的线程数
多线程应用中的性能优化:创建合适的线程数 在多线程应用中,为了降低延迟和提高吞吐量,我们可以采取两种主要策略:优化算法或者充分利用硬件性能。要发挥硬件的极致性能,就需要使用多线程来提高CPU或I/O的利用率。 由于…...

本地运行环境工具UPUPWANK(win)和Navicat数据库管理工具
UPUPWANK安装地址:https://www.upupw.net 1.进入UPUPWANK后点击一键开启 2.新增项目 这里请千万注意80端口,如果80端口被占用了,请记住去任务管理器关闭占用80端口的进程。不然就不会成功显示。(笔者含泪警告,一晚上的…...
LeetCode 每日一题 2024/3/18-2024/3/24
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/18 303. 区域和检索 - 数组不可变3/19 1793. 好子数组的最大分数3/20 1969. 数组元素的最小非零乘积3/21 2671. 频率跟踪器3/22 2617. 网格图中最少访问的格子数3/23 254…...
Unity 鼠标拖拽3D物体跟随移动的方法
之前我们研究过UI拖拽跟随鼠标移动的方法:https://blog.csdn.net/mr_five55/article/details/135562325 但是该方法不适合3D场景。 假如我们要通过鼠标拖拽3D物体移动,那么可以使用以下控制方法: using System.Collections; using System.…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...