建信小程序组件库介绍

2020 年 12 月 24 日

建信小程序组件库介绍

小程序组件库简介


通过之前文章的介绍我们了解到,建信小程序是一种新的连接用户与服务的开发方式,可以在应用内被便捷的获取和传播,并且提供了一套供开发者使用的开发工具链。同时,建信小程序还提供了一套完整而又优美的组件库,里面包含了丰富的组件,并且可以进行多端的兼容,无论是在小程序端还是 H5 端都可以使用它进行组件的开发。本文将会对小程序组件库进行详细的介绍。


小程序组件库由来


传统开发方式效率低、维护成本高,而且往往随着业务的增长或者变更,系统的复杂度会呈现指数级的增长,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。


同时,不同的开发人员有各自的开发习惯和风格,导致代码的交互方法和页面的风格各不相同,这样就导致不同的开发人员没有统一的规范,代码变得冗余,复用率低等各种问题越来越明显。


为了实现提高代码复用率,统一视觉和交互,并且规范开发,小程序组件库应运而生。


多端兼容


起初设计时,为了使小程序组件库能够满足能在小程序和 H5 两个平台上使用,我们搭建了两套组件库,采用多仓库设计,一套适用于 H5 开发,一套适用于 App 小程序开发,如图所示:



这种模式在组件库内容较少的时候工作得还不错,但是随着后续支持的组件越来越多,两套代码所带来的问题也愈发突出:即使一个简单的需求也需要在两套代码库分别修改,造成额外的工作量,效率低下。因此,我们开始考虑,是否有更好的方式能够只写一份代码,又同时支持小程序和 H5 呢?


要合并代码,我们必须分析出两条代码的相同点和不同点,把相同点提取为公共的代码,同时对不同点想办法针对小程序和 H5 的要求分别处理。


我们组件库都是基于 Vue(针对 H5)/类 Vue(针对小程序)的方式实现,因此一个组件的代码,都是由模板(template)、样式(style)、逻辑(script)三个部分组成。从外观上说,H5 和小程序的组件是保持高度一致的,因此,模板和样式部分完全可以复用,只要保证基础构成和属性一即可。


唯一的区别聚焦在逻辑上:对于 H5 组件,逻辑处理相对比较简单,基本只有交互逻辑;而对于小程序组件库而言,还需要处理跟小程序框架相关的控制逻辑,例如:通过 jsbridge 与原生层完成生命周期协同控制,又或者在部分逻辑实现上需要使用原生层的 API 完成。如图所示:


通过对目前市场上成熟的多端输出组件库进行调研后,得出了两个初步的方案:


  1. 运行时抹平差异方案:它是先以 JavaScript 作为基础选定一个 DSL 框架,以这个 DSL 框架为标准在各端分别编译为不同的代码,各端分别有一个运行时框架或兼容组件库保证代码正确运行。

  2. 条件编译型方案:通过对代码的不兼容逻辑部分进行条件判断,通过在打包时添加全局变量的方式,在不同的条件下执行对应的逻辑部分,从而实现不同端打包编译不同代码库。


根据目前的需求多端只需要输出小程序组件库和 H5 两个组件库,而且运行时抹平差异方案比较复杂,首先需要基于同样的 DSL 设计一套统一的 API,然后需要分别针对 H5 和小程序实现两套 runtime 来屏蔽底层差异,投入成本比较高。


综合对比下来,我们采用了条件编译型方案来实现多端的需求。


采用条件编译这个方案,我们可以复用代码的模板部分和样式部分,只需要在所有不可复用的逻辑交互部分加上条件判断。条件判断的添加方式如下图所示:



接下来,我们需要在打包时添加环境变量,实现通过不同的打包命令得到不同的组件库。因此 cross-env 这个模块是一个很好的选择,它可以在打包命令处设置全局环境变量。打包命令的设置如下图所示:



然后执行打包命令时就会将特定的环境变量打包到代码,在使用组件库时通过不同的条件去执行不同的逻辑部分,从而实现组件库的多端兼容,流程图如下所示:


未来展望


随着小程序库的使用越来越广泛,我们可能会不仅仅只兼容小程序和 H5 这两端,还会对支付宝小程序端,微信小程序端等进行兼容,就像 uni-app 组件库一样支持各种各样的端。


到时候,目前条件编译的兼容方案可能无法支持我们小程序的发展,我们可能会选择采用运行时抹平差异方案,自己搭建一套框架去管理各个端的组件库,这样就可以让每个端的小程序代码很干净,各自都只有自己的逻辑交互,我们只需要通过外部框架去管理消除每个端的小程序库的差异即可。通过这种方案就可以更加优雅和完美的去实现组件库多端兼容的问题。


文章转载自:金科优源汇(ID:jkyyh2020)

原文链接:建信小程序组件库介绍


2020 年 12 月 24 日 08:00467

评论

发布
暂无评论
发现更多内容

第 02 周 开发编程框架 命题作业

Jaye

架构师训练营-week2-作业

sljoai

作业 week

架构师实现自己架构的主要手段

_MISSYOURLOVE

极客大学架构师训练营

架构师训练营 - 第二周作业

zcj

极客大学架构师训练营

架构师训练营第二周学习总结

子豪sirius

第 2 周 - 课后作业

大海

架构师训练营-week2-作业

晓-Michelle

极客大学架构师训练营

架构师训练营 Week 02 作业

Wancho

第 2 周 - 学习总结

大海

极客大学架构师训练营

分布式唯一ID解析

Chank

第二周学习总结

赵龙

区块链在农业领域能有什么用武之地?

CECBC区块链专委会

区块链技术 上链 农业链 三农

软件设计原则

jason

架构师训练营第二周作业

子豪sirius

软件设计原理

carol

专栏

架构师训练营第0期第二周作业

无名氏

依赖倒置原则 DIP 依赖反转原则

架构师训练营第2周总结

Glowry

极客大学架构师训练营

依赖倒置原则

Halley

week02 小结

Geek_196d0f

训练营第二周总结

Mr冰凉

设计原则之依赖倒置和接口隔离

林昱榕

极客大学架构师训练营 依赖倒置 设计原则 接口隔离

Flink on Zeppelin (3) - Streaming篇

章剑锋_Jeff

大数据 flink 流计算 Zeppelin

训练营第二周作业

Mr冰凉

架构师训练营--第二周作业

_MISSYOURLOVE

极客大学架构师训练营 第二周作业

OOD设计原则之DIP

无心水

极客大学架构师训练营 面向对象设计原则 OOD SOLID

架构师训练营第二周作业 (3)

hiqian

架构师训练营第二周 - 总结

无心水

极客时间 架构师 极客大学架构师训练营 23种设计模式 面向对象设计原则

架构师训练营 -week2-总结

sljoai

极客大学架构师训练营 编程的本质与未来 第三课 听课总结

John(易筋)

极客时间 极客大学 架构师 极客大学架构师训练营 编程的未来

Week 02- 作业:设计原则

dean

极客大学架构师训练营

使用接口隔离原则优化 Cache 类的设计

李广富

建信小程序组件库介绍-InfoQ