第3章 CHAPTER 3 组件库 第3章 组件库 5min 在近三十年的前端发展过程中,前端和设计之间似乎总是有着千丝万缕的联系。诚然,前端工程师作为一个单独的职业被提及还要追溯到农业时代,而作为“初代目”前端工程师的各位先哲们则多全知全能。实际上,形成首批前端工程师的群体大都来自网页制作人员,而这些人群中又可以划分为两个方向,即网页设计人员和网页开发人员。在农业时代之前,彼时最为流行的Web架构方案是以JSP(Java Server Pages)、ASP(Active Server Pages)等为主的服务器端渲染技术,并且浏览器中的网页仅仅包括文字、图片等媒体的展示。在这样的时代背景下,通常会将Web页面的设计交由网页设计人员来完成,而将业务数据拼接到页面中进行展示的工作交给网页开发人员来完成,因而,在前后端分离大势的催化下,多元文化融合下诞生的前端程序员通常兼有美学意识和开发功底。 随着业务开发需求的增加,有着多元理念下的前端工程师也在不断追寻开发过程中的效率,考虑实用与美学兼具。于是,在大量工程实践的提炼下,前端业界抽象出了一套功能复用、界面美观、交互流畅的功能体系,即组件库体系。组件库体系是凝结了最初网页设计人员审美和网页开发人员技术的智慧结晶,其在颗粒度与复用度方面都对前端工程效能进行了提升。事实上,前端技术都是基于HTML、CSS、JavaScript三大基石进行拓展的,而其各自虽然都可以形成独立的架构与设计方案,但融合三大基础能力的组件库体系似乎才是高效工程的最优解,因而,所谓“组件库”,其本质是高度抽象的以HTML、CSS、JavaScript为基底能够复用的最细粒度单元的体系集成方案。 通常来讲,为了解决业务场景中的复用问题,前端工程师都会分别封装对应的组件,然而,这些组件的封装一般涉及两个问题,即颗粒度问题与开闭性问题。基于这两个维度来考量组件的封装性是非常好的评价指标,同时也是多个组件组合是否能形成内聚体系最关键的核心所在,因此,要想实现体系化的组件库就必须对业务抽象层次很好地进行划分,即范围决定层次。 前端工程业界通常可将组件库区分为通用型组件库和业务型组件库,本章则主要介绍通用型组件库,因而,本章以工业时代下前端业界中两个常见的通用型组件库体系进行阐述,分别是Element UI和Ant Design。不得不说,尽管前端业界中的组件库方案大都在框架体系的大背景下进行讨论,但实际上农业时代也有很多诸如以jQuery+Bootstrap为基础封装的十分优秀的组件方案,因而,组件库方案并不能只着眼于基于框架限制下的工程构建。对于前端工程而言,有效地对工程方案进行合理划分及核心单元抽离才是关键。最后,本章也会简单总结设计与开发组件库所考量维度的建设思考,以期能够给读者提供更多的设计方面的参照。“学而不思则罔”,Why有时要比How更重要,单纯地照搬照抄很难撼动现有组件库市场的固有格局,差异性才更能体现出价值。 16min 3.1Element UI 在中国互联网历史上曾发生过无数次经典战役,时至今日仍被人津津乐道的“千团大战”绝对称得上是这些经典战役中尤为浓墨重彩的一笔。时间拨回2016年,从“千团大战”中杀出一条血路来的饿了么,随着其商户端PC业务量激增而产生了大量的同公司内部高度类似的管理后台类项目,并且此时野蛮生长下的饿了么也急需有足够辨识度的品牌标识出现在公众视野之中。于是,适逢Vue的兴起且饿了么又以Vue作为其前端技术选型等多方综合因素考量下,由饿了么UED部门操刀设计、大前端部门落地实现的面向中后台的组件库诞生了。以今日之视角观昨日之事态,彼时Vue生态下也刚好缺少适合进行二次开发的中后台组件库。到目前为止,尽管后续Vue的组件库万物丛生,但在Vue领域下能与之争锋者亦如凤毛麟角。正是在这样的天时地利下,饿了么团队出品的Element UI成为Vue生态下PC端组件库的标配首选。 除了配合Vue框架外,Element UI也提供了满足React和Angular框架下的对应实现。相较于Vue体系下的统治地位,Element UI在其他框架下的表现却并不尽如人意,先声夺人往往才能掌控优势。除此之外,配合Element UI组件库的二次开源最佳实践也层出不穷,以后台管理系统为例,就有十分多的GitHub开源项目,例如Vue Element Admin及Vue Pure Admin等。 本节将通过指南、组件、主题、国际化、文档及资源等几部分来分别介绍Element UI的整个组件库体系,以期能够让读者从多个维度了解Element UI的构成与价值。 3.1.1指南 所谓“知止而后有定”,组件库的体系建构离不开设计理念的提炼与表达,谋定而动,知止方才有得,因此,本节将通过设计哲学、设计风格及设计样式3个方面来阐述Element UI的设计理念,以思考理念如何指导组件库体系的落地与实践。 1. 设计哲学 “思想决定意识,意识决定行为”,在设计体系中也不例外,每个设计体系语言都有其自身所需要遵循的原则。在Element UI中,可将这些原则总结为4个关键词,即一致、反馈、效率及可控,其中,一致性体现在界面与生活中的一致,反馈在于行为与界面的响应,而效率与可控则重点讲究的是快速与正确。设计哲学体现的是设计师及设计团队整体的思想与调性,其对整个组件库体系而言具有决定性作用,如图31所示。 图31Element UI设计哲学 2. 设计风格 在用户界面(User Interface)设计风格中,通常可以将其划分为拟物风格、扁平风格及轻拟物风格等。对Element UI而言,其遵循的是扁平化的设计理念。相较于拟物化风格对实际物体的模仿重现,扁平化风格则更强调抽象、极简和符号化,其通过去除冗余、厚重和繁杂的装饰效果来凸显信息本身的核心要义,如图32所示。 图32Element UI设计风格 3. 设计样式 三大构成是现代艺术设计基础的重要组成部分,其主要包括平面构成、色彩构成及立体构成。所谓“构成”,其含义是将不同形态的单元重新组成一个新的单元。同样地,UI设计中通常也会包括上述三大构成所需的要素,其具体表现为色彩、布局及字体的设计与呈现。 在Element UI中,其色彩体系主要通过“主色+功能色”的方式对色彩广度进行展现,而在深度方面则通过灰度对色彩层级进行递进,如图33所示。 图33Element UI色彩样式 对于布局体系而言,Element UI同样采用弹性(Flex)栅格布局进行自适应排布,其采用的是24分栏而非12栅格体系,如图34所示。 图34Element UI布局样式 对于字体而言,Element UI采用统一的字体规范,提供不同的字体家族、字重等设计方案,力求在各个操作系统下都有最佳的展示效果,如图35所示。 图35Element UI字体样式 3.1.2组件 随着时代的发展,以IT技术为基础利用网络平台提供服务的互联网企业逐步登上了历史舞台。一般而言,互联网企业提供服务的形式通常以终端层作为其业务流量的入口,其中,通过需求分析来对功能进行梳理,从而便可进行流程分解与设计,以形成不同形式的页面来串联起整个商务活动。因此,为了更好、快速、高效地提供业务开发能力,以功能层、页面层、组件层对业务形态进行析构分解便可将组件库体系按一定规则归纳收敛到提供所需不同组件类型的划分之中。在Element UI中,其可规划为六大类组件,分别为通用类组件(Basic)、表单类组件(Form)、数据类组件(Data)、通知类组件(Notice)、导航类组件(Navigation)及其他类组件(Others),如图36所示。 图36Element UI组件分类 毋庸置疑,对于组件库的构建也同样离不开工程模板。同时,基于不同框架的组件库构建需要符合其对应框架的语法规则,因而,本节以Element UI 2.x版本代码为例相应地进行实现及分析,其所依赖的框架为Vue 2.x。 在Vue 2.x中,Vue提供了component()的组件注册方法,同时也提供了use()方法进行插件接入,代码如下: //封装install方法,用于注册组件及指令 const install = function(Vue, opts = {}) {}; if (typeof window !== 'undefined' && window.Vue) { install(window.Vue); } 相应地,对于每个组件而言,需要提供一个install()方法,模板代码如下: //从src目录下引入组件,组件名称按照对应分类进行命名 import ComponentA from './src'; //提供install方法,用于注册 ComponentA.install = function(Vue) { Vue.component(ComponentA.name, ComponentA) }; //导出组件 export default ComponentA; 注意: 上述代码为抽象出来的组件收敛入口模板代码,对于具体的每个组件的实现思路可以查看源码进行学习,具体可见表31~36的备注中对应的源码网址。 1. 通用类组件 在通用类组件中,Element UI提供了布局组件(Layout)、布局容器组件(Container)、图标组件(Icon)、按钮组件(Button)及文字链接组件(Link)等,见表31。 表31Element UI通用类组件 组件名称 组 件 包 备注 Layout elrow elcol ElementUI仓库/packages/row ElementUI仓库/packages/col Container elcontainer elheader elmain elfooter ElementUI仓库/packages/container ElementUI仓库/packages/header ElementUI仓库/packages/main ElementUI仓库/packages/footer Icon elicon ElementUI仓库/packages/icon Button elbutton elbuttongroup ElementUI仓库/packages/button ElementUI仓库/packages/buttongroup Link ellink ElementUI仓库/packages/link 2. 表单类组件 在表单类组件中,Element UI提供了单选框组件(Radio)、复选框组件(Checkbox)、输入框组件(Input)、计数器组件(InputNumber)、选择器组件(Select)、级联选择器组件(Cascader)、开关组件(Switch)、滑块组件(Slider)、时间选择器组件(TimePicker)、日期选择器组件(DatePicker)、上传组件(Upload)、评分组件(Rate)、颜色选择器组件(ColorPicker)、穿梭框组件(Transfer)及表单组件(Form)等,见表32。 表32Element UI表单类组件 组件名称 组 件 包 备注 Radio elradio elradiogroup elradiobutton ElementUI仓库/packages/radio ElementUI仓库/packages/radiogroup ElementUI仓库/packages/radiobutton Checkbox elcheckbox elcheckboxgroup elcheckboxbutton ElementUI仓库/packages/checkbox ElementUI仓库/packages/checkboxgroup ElementUI仓库/packages/checkboxbutton Input elinput elautocomplete ElementUI仓库/packages/input ElementUI仓库/packages/autocomplete InputNumber elinputnumber ElementUI仓库/packages/inputnumber Select elselect eloption eloptiongroup ElementUI仓库/packages/select ElementUI仓库/packages/option ElementUI仓库/packages/optiongroup Cascader elcascader elcascaderpanel ElementUI仓库/packages/cascader ElementUI仓库/packages/cascaderpanel Switch elswitch ElementUI仓库/packages/switch Slider elslider ElementUI仓库/packages/slider TimePicker eltimeselect eltimepicker ElementUI仓库/packages/timeselect ElementUI仓库/packages/timepicker DatePicker eldatepicker ElementUI仓库/packages/datepicker Upload elupload ElementUI仓库/packages/upload Rate elrate ElementUI仓库/packages/rate ColorPicker elcolorpicker ElementUI仓库/packages/colorpicker Transfer eltransfer ElementUI仓库/packages/transfer Form elform elformitem ElementUI仓库/packages/form ElementUI仓库/packages/formitem 3. 数据类组件 在数据类组件中,Element UI提供了表格组件(Table)、标签组件(Tag)、进度条组件(Progress)、树形组件(Tree)、分页组件(Pagination)、标记组件(Badge)、头像组件(Avatar)、骨架屏组件(Skeleton)、空状态组件(Empty)、描述列表组件(Descriptions)、结果组件(Result)及统计数值组件(Statistic)等,见表33。 表33Element UI数据类组件 组件名称 组 件 包 备注 Table eltable eltablecolumn ElementUI仓库/packages/table ElementUI仓库/packages/tablecolumn Tag eltag ElementUI仓库/packages/tag Progress elprogress ElementUI仓库/packages/progress Tree eltree ElementUI仓库/packages/tree Pagination elpagination ElementUI仓库/packages/pagination Badge elbadge ElementUI仓库/packages/badge Avatar elavatar ElementUI仓库/packages/avatar Skeleton elskeleton elskeletonitem ElementUI仓库/packages/skeleton ElementUI仓库/packages/skeletonitem Empty elempty ElementUI仓库/packages/empty Descriptions eldescriptions eldescriptionsitem ElementUI仓库/packages/descriptions ElementUI仓库/packages/descriptionsitem Result elresult ElementUI仓库/packages/result Statistic elstatistic ElementUI仓库/packages/statistic 4. 通知类组件 在通知类组件中,Element UI提供了警告组件(Alert)、加载组件(Loading)、消息提示组件(Message)及通知组件(Notification)等,见表34。 表34Element UI通知类组件 组件名称 组 件 包 备注 Alert elalert ElementUI仓库/packages/alert Loading vloading ElementUI仓库/packages/loading Message message ElementUI仓库/packages/message Notification notify ElementUI仓库/packages/notification 5. 导航类组件 在导航类组件中,Element UI提供了导航菜单组件(NavMenu)、标签页组件(Tabs)、面包屑组件(Breadcrumb)、页头组件(PageHeader)、下拉菜单组件(Dropdown)及步骤条组件(Steps)等,见表35。 表35Element UI导航类组件 组件名称 组 件 包 备注 NavMenu elmenu elmenuitem elmenugroup elsubmenu ElementUI仓库/packages/menu ElementUI仓库/packages/menuitem ElementUI仓库/packages/menuitemgroup ElementUI仓库/packages/submenu Tabs eltabs eltabpane ElementUI仓库/packages/tabs ElementUI仓库/packages/tabpane Breadcrumb elbreadcrumb elbreadcrumbitem ElementUI仓库/packages/breadcrumb ElementUI仓库/packages/breadcrumbitem PageHeader elpageheader ElementUI仓库/packages/pageheader Dropdown eldropdown eldropdownmenu eldropdownitem ElementUI仓库/packages/dropdown ElementUI仓库/packages/dropdownmenu ElementUI仓库/packages/dropdownitem Steps elsteps elstep ElementUI仓库/packages/steps ElementUI仓库/packages/step 6. 其他类组件 对于上述未分类但开发中复用程度又很高的组件,Element UI将其划分到了其他类组件中,包括对话框组件(Dialog)、文字提示组件(Tooltip)、弹出窗组件(Popover)、气泡确认框组件(Popconfirm)、卡片组件(Card)、走马灯组件(Carousel)、折叠面板组件(Collapse)、时间线组件(Timeline)、分割线组件(Divider)、日历组件(Calendar)、图片组件(Image)、回到顶部组件(Backtop)、无限滚动组件(InfiniteScroll)及抽屉组件(Drawer),见表36。 表36Element UI其他类组件 组件名称 组 件 包 备注 Dialog eldialog ElementUI仓库/packages/dialog Tooltip eltooltip ElementUI仓库/packages/tooltip Popover elpopover ElementUI仓库/packages/popover Popconfirm elpopconfirm ElementUI仓库/packages/popconfirm Card elcard ElementUI仓库/packages/card Carousel elcarousel elcarouselitem ElementUI仓库/packages/carousel ElementUI仓库/packages/carouselitem Collapse elcollapse elcollapseitem ElementUI仓库/packages/collapse ElementUI仓库/packages/collapseitem Timeline eltimeline eltimelineitem ElementUI仓库/packages/timeline ElementUI仓库/packages/timelineitem Divider eldivider ElementUI仓库/packages/divider Calendar elcalendar ElementUI仓库/packages/calendar Image elimage ElementUI仓库/packages/image Backtop elbacktop ElementUI仓库/packages/backtop InfiniteScroll vinfinitescroll ElementUI仓库/packages/infinitescroll Drawer eldrawer ElementUI仓库/packages/drawer 3.1.3主题 对于通用型组件库而言,一套成熟的组件库体系并不应该仅服务于某一种或几种特定的场景,而是应该定位于可扩展且支持各种定制化复用的生态平台,因此,对于多业务领域场景的主题配置方案便是组件库体系中不可或缺的部分。在Element UI中,其是通过修改变量映射对应色值的方式来完成个性化主题的定制功能,如图37所示。 图37Element UI主题配置 在Element UI 2.x中,其实现主题变量的代码如下: //第3章/var.scss $--color-primary: #409EFF !default; $--color-white: #FFFFFF !default; $--color-black: #000000 !default; $--color-success: #67C23A !default; $--color-warning: #E6A23C !default; $--color-danger: #F56C6C !default; $--color-info: #909399 !default; $--color-text-primary: #303133 !default; $--color-text-regular: #606266 !default; $--color-text-secondary: #909399 !default; $--color-text-placeholder: #C0C4CC !default; 3.1.4国际化 正如前述的业务复杂化及拓展需求的不断深耕,商业化出海也成为各大国内互联网厂商竞相追逐获取更多新兴市场下的战略方向,因此,国际化方案不仅是前端工程领域的一项重要课题,就组件库体系而言也同样是一项不可忽视的重要内容。在Element UI中,其国际化方案主要提供了t()、use()及i18n()3个功能函数,如图38所示。 图38Element UI国际化方案 其中,对于i18n()及use()的实现方式,代码如下: //第3章/locale.js const format = Format(Vue); let i18nHandler = function() { const vuei18n = Object.getPrototypeOf(this || Vue).$t; if (typeof vuei18n === 'function' && !!Vue.locale) { if (!merged) { merged = true; Vue.locale( Vue.config.lang, deepmerge(lang, Vue.locale(Vue.config.lang) || {}, { clone: true }) ); } return vuei18n.apply(this, arguments); } }; export const t = function(path, options) { let value = i18nHandler.apply(this, arguments); if (value !== null && value !== undefined) return value; const array = path.split('.'); let current = lang; for (let i = 0, j = array.length; i < j; i++) { const property = array[i]; value = current[property]; if (i === j - 1) return format(value, options); if (!value) return ''; current = value; } return ''; }; export const use = function(l) { lang = l || lang; }; export const i18n = function(fn) { i18nHandler = fn || i18nHandler; } 对于t(),则需要用到format()的字符串模板转化,其代码如下: //第3章/format.js const RE_NARGS = /(%|)\{([0-9a-zA-Z_]+)\}/g; export default function(Vue) { function template(string, ...args) { if (args.length === 1 && typeof args[0] === 'object') { args = args[0]; } if (!args || !args.hasOwnProperty) { args = {}; } return string.replace(RE_NARGS, (match, prefix, i, index) =>{ let result; if (string[index - 1] === '{' && string[index + match.length] === '}') { return i; } else { result = hasOwn(args, i) ? args[i] : null; if (result === null || result === undefined) { return ''; } return result; } }); } return template; } 3.1.5文档 在成熟的组件库体系中,为了能让开发及设计等人员更好地使用和了解组件库功能及价值,通常来讲也会对应提供官方文档以展现组件样例及设计理念。在Element UI 2.x中,由于其本身基于Vue 2.x的框架建设,故而其文档构建也采用了基于Vue全家桶的工程化方案,然而,不同于以HTML为主的网页应用建设,开发人员通常会选用以MarkDown为主的轻量级标记语言对文档进行编写,因此,对于组件库文档而言,就需要能够对MarkDown语法与HTML语法进行相应转化,然而,由于Element UI 2.x是基于Vue全家桶文档进行构建的,故而只需对.md文件配合.vue文件进行相应处理,如图39所示。 图39Element UI文档建设 在Element UI 2.x中,其使用的是基于Webpack的打包构建,因而对于.md文件需要通过mdloader和vueloader进行处理,代码如下: //第3章/webpack.demo.js const webpackConfig = { module: { rules: [ { test: /\.md$/, use: [ //vue-loader { loader: 'vue-loader', options: { compilerOptions: { preserveWhitespace: false } } }, //md-loader { loader: path.resolve(__dirname, './md-loader/index.js') } ] } ] } } 在Element UI 2.x中,其通过markdownit及其相关插件实现了mdloader,代码如下: //第3章/md-loader.js module.exports = function(source) { //输出逻辑 return ` <template> <section class="content element-doc"> ${output.join('')} </section> </template> ${pageScript} `; } 注意: loader是Webpack中处理模块资源的一种转换器,其本质是一个函数且支持自定义,对于Webpack的具体分析会在后续章节中进行阐述。 其中,经过.md文件到.vue文件的转换后,配合自定义的demoblock显示组件便可实现组件及源码的同步展现,代码如下: <!-- 第3章/demo-block.vue --> <template> <div class="demo-block"> <div class="source"> <!-- 源码 --> <slot name="source"></slot> </div> <div class="meta" ref="meta"> <div class="description" v-if="$slots.default"> <slot></slot> </div> <div class="highlight"> <slot name="highlight"></slot> </div> </div> </div> </template> 3.1.6资源 为了更好地提供资产沉淀,组件库体系同样也需要提供相应的资源文件来支持业务方的自定义扩展。通常来讲,资源文件默认会提供设计规范说明书、设计组件包及设计工具插件等内容。在Element UI中,其提供了Axure及Sketch相关设计软件的设计组件包,如图310所示。 图310Element UI设计资源 22min 3.2Ant Design 如果说“千团大战”是中国互联网巨头在团购市场的一次“烧钱大赛”,则促使现象产生背后而颠覆用户商业行为的底层原始推动力完全源自支付方式的彻底变革。毋庸置疑,诞生于2004年的支付宝起初的作用仅仅是为了解决阿里巴巴旗下的淘宝平台交易当中的信任问题,然而,随着移动互联网的发展,由于其为用户提供了极大便利,支付宝逐渐渗入衣食住行的各个环节中,同时也极大地改变了人们的行为和生活方式。在2013年“All In 无线”之后,随着支付宝前线业务的开疆拓土,中后台需求与日俱增,而缺少与之相应的成熟体系方案却成为用户增长的瓶颈。再者,加之肯德基接入支付宝的不顺,终于成为压死受中后台羸弱弊病困扰下支付宝的最后一根稻草。面对如此量级的中后台产品,建立统一的UI设计/前端框架便成为支付宝时下的当务之急。于是,在2015年4月,为了未来能支撑起庞大的中后台业务,也为各自的专业发展,与支付宝母公司蚂蚁金服同名且同时寓意着“艺术与科技”(Art and Technology)的组件库体系——Ant Design终于呱呱坠地。 Ant Design从诞生以来,大致经历了6个时间发展节点。在2015年,Ant Design以0.6版本首次向世人掀开自己的神秘面纱; 仅隔一年之后,Ant Design 1.0版本正式发布。随着体系的不断沉淀,2.0版本的Ant Design同时提供了面向移动端的Ant Design Mobile及交互动效规范的Ant Motion及Ant Landing等。到了3.0时代,Ant Design则推出了提升设计工作效率的Sketch工具集——Kitchen。更进一步,Ant Design 4.0又对插画资产提出了自己的最佳解决方案,即海兔(HiTu)插画组件库。到目前为止,以5.0规范下的领域子模型的提出为例,Ant Design组件库体系一直都致力于通过科技与艺术来不断地提升用户体验,如图311所示。 图311Ant Design历史背景 正如Ant Design版本升级之路一样,相较于Element UI,Ant Design庞大的生态体系则包罗万象,其成熟的生态产品包括Ant Design Pro、HiTu、Tech UI、Ant Design Vue、Ant Landing、Ant Motion、Kitchen、Ant Design Mobile等。 同样地,本节仍将通过指南、组件、主题、国际化、文档及资源等几部分来分别展开介绍Ant Design的整个组件库体系,以期能够让读者更加全面地透析成熟组件库体系所必须涵盖的范围与层次。 3.2.1指南 所谓“内正其心,外正其容”,组件库体系的价值判断决定了组件库的价值选择,也为设计者提供评价设计好坏的内在标准,并且对组件库本身的使命与意义提供最本质的衡量基准,启示并激发了组件库体系中趋向发展的判定,进而为具体设计问题提供向导和一般解决方案,因此,本节仍将通过设计哲学、设计风格及设计样式3个方面来阐述Ant Design的设计理念,以对比不同价值体系下的组件库方案的具体呈现。 1. 设计哲学 “知性始于感性,理性行于知性”,在人机交互设计中,无意识与有意识常常造成了人与系统的力量融合和互相影响。不同于其他设计体系的理念坚持,Ant Design有4点与众不同,可将这些不同归纳为自然、确定、生长及意义,这也可看作其设计原则。其中,自然主要体现在感知自然和行为自然,其为解决数字世界的复杂化与注意力资源稀缺化的矛盾提供了追寻的方向; 确定主要表现为设计确定及用户确定,其决定了人机交互的高确定性与低合作熵的状态; 生长则重点包括价值连接和人机共生,其表达了设计者对产品功能价值的可发现性及创造性; 意义更多是承载用户的需求与产品的使命,其可分为结果的意义和过程的意义。设计哲学高度凝练地归纳总结了设计体系的价值体现与表达诉求,其能大幅度提升研发团队的确定性且保持系统一致性,如图312所示。 图312Ant Design设计哲学 2. 设计风格 同样地,对Ant Design而言,其遵循的也是扁平化的设计理念。不同于Element UI,Ant Design结合时下设计趋势及企业发展变化,在不同版本中对扁平化风格相应地进行了细节调整。以Ant Design 5.x为例,其设计风格变得更加轻量与简洁,如图313所示。 图313Ant Design设计风格 3. 设计样式 用户界面作为系统和用户之间进行交互和信息交换的媒介,其不仅包括界面美观的设计,也同时囊括人机交互和操作逻辑的设计,因此,对于色彩、布局及字体样式而言,也同样要追寻设计中的韵律感与动态感。 在Ant Design中,其色彩体系可解读成系统级色彩体系和产品级色彩体系两个层面。系统级色彩体系主要以色板的功能方式进行提供,将色彩通过一定的模型算法而延展出自然规律下的变化,平衡了可读性、美感及可得性,如图314所示。 图314Ant Design系统级色彩样式 类似地,与Element UI的色彩样式的分类方式相仿,产品级色彩体系则重点以“主色+功能色+中性色”的方式提供企业级的视觉传达,如图315所示。 图315Ant Design产品级色彩样式 空间布局是体系化视觉设计的起点,相较于传统平面设计,UI设计中的空间布局则更加动态且富有变化。受现代主义建筑大师勒·柯布西耶(Le Corbusier)的模度思想启发,Ant Design采用网格基数为8的偶数分隔粒度提供具备动态感和韵律感的布局决策。同样地,Ant Design也采用了24分栏的栅格体系,如图316所示。 图316Ant Design布局样式 字体是体系化界面设计中的重要构成之一,Ant Design基于动态秩序的有效原则,分别对字体家族、字体基准、字体颜色等相应地进行了约束,力求在视觉展现上满足路德维希·密斯·凡德罗(Ludwig Mies van der Rohe)所提出的“少即是多”(less is more)的现代主义风格设计理念,如图317所示。 图317Ant Design字体样式 3.2.2组件 在面向对象编程中,常常会用到设计模式的解决方案。同样地,在UI设计中,设计模式也被广泛地应用到组件库体系设计的方方面面,其可以显著地增加研发团队的确定性及系统一致性,节省不必要的开销,提高设计与开发的协作效率。作为企业级业务的最佳践行者,Ant Design中落地设计模式也同样遵循其设计哲学,并为企业产品中反复出现的设计问题提供通用的解决方案。设计者既可以直接使用设计模式来完成界面设计,也可以从设计模式出发,衍生更加贴合业务的解决方案,以满足个性化的设计需求,因此,为了更好快速高效地提供业务开发能力,Ant Design以功能层、页面层、模块层、组件层来对业务形态进行拆解,其可规划为六大类组件,分别为通用类组件(General)、布局类组件(Layout)、导航类组件(Navigation)、数据类组件(Data)、反馈类组件(Feedback)及其他类组件(Other),如图318所示。 图318Ant Design组件分类 注意: 在Ant Design中,数据类组件包括数据录入类组件和数据展示类组件。 回顾Ant Design 1.0到5.0的进化过程,开源社区的参与度也在逐步增加,广大社区开发者提供了许多功能组件,例如卡片组件(Card)、评分组件(Rate)、自动完成组件(AutoComplete)、分割线组件(Divider)、分段控制器组件(Segmented)、包裹组件(App)、二维码组件(QRCode)等,因而,本节以Ant Design 5.5.x版本代码为例相应地进行实现分析,其所依赖的框架为React 18.x,模板代码如下: //从当前组件目录下引入组件,组件名称按照对应分类进行命名 import ComponentA from './componentA'; import ComponentB from './componentB'; function Component() {} Component.ComponentA = ComponentA Component.ComponentB = ComponentB //导出组件 export default Component; 注意: 上述代码为抽象出来的组件模板代码,具体对应组件源码网址可见对应分类组件中的表格备注项。 1. 通用类组件 在通用类组件中,Ant Design提供了按钮组件(Button)、图标组件(Icon)及排版组件(Typography)等,见表37。 表37Ant Design通用类组件 组件名称 组 件 包 备注 Button Button ButtonGroup Ant Design仓库/components/button/button.tsx Ant Design仓库/components/button/buttongroup.tsx Icon Icon Ant Design仓库/components/icon/index.ts Typography Typography Text Title Paragraph Link Ant Design仓库/components/typography/Typography.tsx Ant Design仓库/components/typography/Text.tsx Ant Design仓库/components/typography/Title.tsx Ant Design仓库/components/typography/Paragraph.tsx Ant Design仓库/components/typography/Link.tsx 2. 布局类组件 在布局类组件中,Ant Design提供了分割线组件(Divider)、栅格组件(Grid)、布局组件(Layout)及间距组件(Space)等,见表38。 表38Ant Design布局类组件 组件名称 组 件 包 备注 Divider Divider Ant Design仓库/components/divider/index.tsx Grid Row Col Ant Design仓库/components/grid/row.tsx Ant Design仓库/components/grid/col.tsx Layout Layout Header Content Footer Sider Ant Design仓库/components/layout/layout.tsx Ant Design仓库/components/layout/Sider.tsx Space Space Compact Ant Design仓库/components/space/index.tsx Ant Design仓库/components/space/Compact.tsx 3. 导航类组件 在导航类组件中,Ant Design提供了锚点组件(Anchor)、面包屑组件(Breadcrumb)、下拉菜单组件(Dropdown)、导航菜单组件(Menu)、分页组件(Pagination)及步骤条组件(Steps)等,见表39。 表39Ant Design导航类组件 组件名称 组 件 包 备注 Anchor Anchor AnchorLink Ant Design仓库/components/anchor/Anchor.tsx Ant Design仓库/components/anchor/AnchorLink.tsx Breadcrumb Breadcrumb BreadcrumbItem BreadcrumbSeparator Ant Design仓库/components/breadcrumb/Breadcrumb.tsx Ant Design仓库/components/breadcrumb/BreadcrumbItem.tsx Ant Design仓库/components/breadcrumb/BreadcrumbSeparator.tsx Dropdown Dropdown DropdownButton Ant Design仓库/components/dropdown/dropdown.tsx Ant Design仓库/components/dropdown/dropdownbutton.tsx Menu Menu Item SubMenu MenuDivider ItemGroup Ant Design仓库/components/menu/index.tsx Ant Design仓库/components/menu/MenuItem.tsx Ant Design仓库/components/menu/SubMenu.tsx Ant Design仓库/components/menu/MenuDivider.tsx React Component仓库/src/MenuItemGroup.tsx Pagination Pagination Ant Design仓库/components/pagination/Pagination.tsx Steps Steps Step Ant Design仓库/components/steps/Steps.tsx React Component仓库/src/Step.tsx 4. 数据类组件 在Ant Design中,数据类组件可分为两种,分别是数据录入类组件及数据展示类组件。 在数据录入类组件中,Ant Design提供了自动完成组件(AutoComplete)、级联选择组件(Cascader)、复选框组件(Checkbox)、颜色选择器组件(ColorPicker)、日期选择器框组件(DatePicker)、表单组件(Form)、输入框组件(Input)、数字输入框组件(InputNumber)、提及组件(Mentions)、单选框组件(Radio)、评分组件(Rate)、选择器组件(Select)、滑动输入条组件(Slider)、开关组件(Switch)、时间选择框组件(TimePicker)、穿梭框组件(Transfer)、树选择组件(TreeSelect)及上传组件(Upload)等,见表310。 表310Ant Design数据录入类组件 组件名称 组 件 包 备注 AutoComplete AutoComplete Ant Design仓库/components/autocomplete/index.tsx Cascader Cascader Ant Design仓库/components/cascader/index.tsx Checkbox Checkbox CheckboxGroup Ant Design仓库/components/checkbox/Checkbox.tsx Ant Design仓库/components/checkbox/Group.tsx ColorPicker ColorPicker Ant Design仓库/components/colorpicker/ColorPicker.tsx DatePicker DatePicker RangePicker Ant Design仓库/components/datepicker/index.ts Ant Design仓库/components/datepicker/index.ts Form Form FormItem FormList ErrorList FormProvider Ant Design仓库/components/form/Form.tsx Ant Design仓库/components/form/FormItem/index.tsx Ant Design仓库/components/form/FormList.tsx Ant Design仓库/components/form/ErrorList.tsx Ant Design仓库/components/form/context.tsx Input Input Group Search TextArea Password Ant Design仓库/components/input/Input.tsx Ant Design仓库/components/input/Group.tsx Ant Design仓库/components/input/Search.tsx Ant Design仓库/components/input/TextArea.tsx Ant Design仓库/components/input/Password.tsx InputNumber InputNumber Ant Design仓库/components/inputnumber/index.tsx Mentions Mentions Option Ant Design仓库/components/mentions/index.tsx React Component仓库/src/Option.tsx Radio Radio RadioGroup RadioButton Ant Design仓库/components/radio/radio.tsx Ant Design仓库/components/radio/group.tsx Ant Design仓库/components/radio/radioButton.tsx Rate Rate Ant Design仓库/components/rate/index.tsx Select Select Option OptionGroup Ant Design仓库/components/select/index.tsx React Component仓库/src/Option.tsx React Component仓库/src/OptGroup.tsx Slider Slider Ant Design仓库/components/slider/index.tsx Switch Switch Ant Design仓库/components/switch/index.tsx TimePicker TimePicker RangePicker Ant Design仓库/components/timepicker/index.tsx Transfer Transfer TransferList Search Operation Ant Design仓库/components/transfer/index.tsx Ant Design仓库/components/transfer/list.tsx Ant Design仓库/components/transfer/search.tsx Ant Design仓库/components/transfer/operation.tsx TreeSelect TreeSelect TreeNode Ant Design仓库/components/treeselect/index.tsx React Component仓库/src/TreeNode.tsx Upload Upload Dragger Ant Design仓库/components/upload/Upload.tsx Ant Design仓库/components/upload/Dragger.tsx 在数据展示类组件中,Ant Design提供了头像组件(Avatar)、徽标组件(Badge)、日历组件(Calendar)、卡片组件(Card)、走马灯组件(Carousel)、折叠面板组件(Collapse)、描述列表组件(Descriptions)、空状态组件(Empty)、图片组件(Image)、列表组件(List)、气泡卡片组件(Popover)、二维码组件(QRCode)、分段控制器组件(Segmented)、统计数值组件(Statistic)、表格组件(Table)、标签页组件(Tabs)、标签组件(Tag)、时间轴组件(Timeline)、文字提示组件(Tooltip)、漫游式引导组件(Tour)及树形组件(Tree)等,见表311。 表311Ant Design数据展示类组件 组件名称 组 件 包 备注 Avatar Avatar Group Ant Design仓库/components/avatar/avatar.tsx Ant Design仓库/components/avatar/group.tsx Badge Badge Ribbon Ant Design仓库/components/badge/index.tsx Ant Design仓库/components/badge/Ribbon.tsx Calendar Calendar Ant Design仓库/components/calendar/index.tsx Card Card Grid Meta Ant Design仓库/components/card/Card.tsx Ant Design仓库/components/card/Grid.tsx Ant Design仓库/components/card/Meta.tsx Carousel Carousel Ant Design仓库/components/carousel/index.tsx Collapse Collapse Ant Design仓库/components/collapse/index.ts Descriptions Descriptions DescriptionsItem Ant Design仓库/components/descriptions/index.tsx Ant Design仓库/components/descriptions/Item.tsx Empty Empty Ant Design仓库/components/empty/index.tsx Image Image PreviewGroup Ant Design仓库/components/image/index.tsx Ant Design仓库/components/image/PreviewGroup.tsx List List Item Meta Ant Design仓库/components/list/index.tsx Ant Design仓库/components/list/Item.tsx Popover Popover Ant Design仓库/components/popover/index.tsx QRCode QRCode Ant Design仓库/components/qrcode/index.tsx Segmented Segmented Ant Design仓库/components/segmented/index.tsx Statistic Statistic Countdown Ant Design仓库/components/statistic/Statistic.tsx Ant Design仓库/components/statistic/Countdown.tsx Table Table Column ColumnGroup Summary Ant Design仓库/components/table/Table.tsx Ant Design仓库/components/table/Column.ts Ant Design仓库/components/table/ColumnGroup.ts React Component仓库/src/Footer/Summary.tsx Tabs Tabs TabPane Ant Design仓库/components/tabs/index.tsx Ant Design仓库/components/tabs/TabPane.ts Tag Tag Ant Design仓库/components/tag/index.tsx Timeline Timeline TimelineItem Ant Design仓库/components/timeline/Timeline.tsx Ant Design仓库/components/timeline/TimelineItem.tsx Tooltip Tooltip Ant Design仓库/components/tooltip/index.tsx Tour Tour Ant Design仓库/components/tour/index.tsx Tree Tree TreeNode DirectoryTree Ant Design仓库/components/tree/index.ts React Component仓库/src/TreeNode.tsx Ant Design仓库/components/tree/DirectoryTree.tsx 5. 反馈类组件 在反馈类组件中,Ant Design提供了警告提示组件(Alert)、抽屉组件(Drawer)、全局提示组件(Message)、对话框组件(Modal)、通知提醒组件(Notification)、气泡确认框组件(Popconfirm)、进度条组件(Progress)、结果组件(Result)、骨架屏组件(Skeleton)及加载中组件(Spin)等,见表312。 表312Ant Design反馈类组件 组件名称 组 件 包 备注 Alert Alert ErrorBoundary Ant Design仓库/components/alert/index.tsx Ant Design仓库/components/alert/ErrorBoundary.tsx Drawer Drawer Ant Design仓库/components/drawer/index.tsx Message message Ant Design仓库/components/message/index.tsx Modal Modal Ant Design仓库/components/modal/Modal.tsx Notification notification Ant Design仓库/components/notification/index.tsx Popconfirm Popconfirm Ant Design仓库/components/popconfirm/index.tsx Progress Progress Ant Design仓库/components/progress/index.tsx Result Result Ant Design仓库/components/result/index.tsx Skeleton Skeleton SkeletonButton SkeletonAvatar SkeletonInput SkeletonImage SkeletonNode Ant Design仓库/components/skeleton/Skeleton.tsx Ant Design仓库/components/skeleton/Button.tsx Ant Design仓库/components/skeleton/Avatar.tsx Ant Design仓库/components/skeleton/Input.tsx Ant Design仓库/components/skeleton/Image.tsx Ant Design仓库/components/skeleton/Node.tsx Spin Spin Ant Design仓库/components/spin/index.tsx 6. 其他类组件 对于没有具体类别的组件,Ant Design将其划分到其他类组件中,包括固钉组件(Affix)、包裹组件(App)、全局化配置组件(ConfigProvider)、悬浮按钮组件(FloatButton)及水印组件(Watermark)等,见表313。 表313Ant Design其他类组件 组件名称 组 件 包 备注 Affix Affix Ant Design仓库/components/affix/index.tsx App App Ant Design仓库/components/app/index.tsx ConfigProvider ConfigProvider ConfigContext SizeContext Ant Design仓库/components/configprovider/index.tsx Ant Design仓库/components/configprovider/context.tsx Ant Design仓库/components/configprovider/SizeContext.tsx FloatButton FloatButton FloatButtonGroup BackTop Ant Design仓库/components/floatbutton/FloatButton.tsx Ant Design仓库/components/floatbutton/FloatButtonGroup.tsx Ant Design仓库/components/floatbutton/BackTop.tsx Watermark Watermark Ant Design仓库/components/watermark/index.tsx 3.2.3主题 为满足业务和品牌多样化的视觉需求,组件库体系都会在设计规范和技术上支持灵活的样式定制,包括但不限于全局样式和指定组件的视觉呈现,例如主色、圆角、边框、阴影、层级及动效等。相较于前几个版本的主题定制方案,Ant Design 5.0提供了一套基于设计令牌(Design Token)思想而抽提出符合自身设计理念的全新体系化定制主题方案,如图319所示。 图319Ant Design主题配置 注意: Design Token是设计系统中的视觉原子,可翻译为设计指令或者设计令牌,是帮助设计师和开发工程师建立起表达决策的通用语言。 在Ant Design 5.0中,其提供了一套通用的Token生成算法,代码如下: //第3章/genCommonMapToken.ts export default function genCommonMapToken(token: SeedToken): CommonMapToken { const { motionUnit, motionBase, borderRadius, lineWidth } = token; return { //motion motionDurationFast: `${(motionBase + motionUnit).toFixed(1)}s`, motionDurationMid: `${(motionBase + motionUnit * 2).toFixed(1)}s`, motionDurationSlow: `${(motionBase + motionUnit * 3).toFixed(1)}s`, //line lineWidthBold: lineWidth + 1, //radius ...genRadius(borderRadius), }; } 以色彩生成方案为例,Ant Design将自定义颜色的色板生成算法抽离到一个通用的@antdesign/colors库中。值得一提的是,在Ant Design不同版本中对于色板生成的方案有着十分巨大的差异。 在Ant Design 1.x色板算法中,其主要使用的是基于RGB模型线性组合的黑白混合算法,然而,RGB色彩模型线性换算过程中间隔变化较大,对于人眼视觉效果及感性认知不友好。 在2.x色板算法中,Ant Design使用了基于HSL模型进行贝塞尔曲线(Bézier Curve)拟合后再通过对灰度的判断分别进行加深及减弱的分化粒度算法。相较于RGB色彩模型,HSL色彩模型则可以利用色相(Hue)的旋转对应地进行加深和减弱,更加符合人的视觉感知。 注意: 贝塞尔曲线是应用于二维图形应用程序的数学曲线,常用来进行数据拟合。 对于HSL色彩模型而言,HSV模型的变化梯度则更加柔和且易于控制,因而,在Ant Design 3.x中,Ant Design对于灰度判断的理论依据不再基于贝塞尔曲线拟合的HSL色彩模型而重新改为线性调整的HSV的色彩模型,简化算法的混合方案。 注意: 色彩模型指的是某个三维颜色空间中的一个可见光子集,包含某个色彩域的所有色彩,常见的色彩模型有RGB、CMYK、HSL、HSV等。 在Ant Design 5.0中,其仍沿袭了自3.0版本之后的基于HSV色彩模型的自定义色板算法,对应代码如下: //第3章/generate.ts export default function generate(color: string, opts: Opts = {}): string[] { const patterns: string[] = []; const pColor = inputToRGB(color); //light主题 for (let i = lightColorCount; i >0; i -= 1) {} //dark主题 for (let i = 1; i <= darkColorCount; i += 1) {} //暗黑主题 if (opts.theme === 'dark') { return darkColorMap.map(({ index, opacity }) =>{ const darkColorString: string = toHex( mix( inputToRGB(opts.backgroundColor || '#141414'), inputToRGB(patterns[index]), opacity * 100, ), ); return darkColorString; }); } return patterns; } 可以看出,对于Ant Design 5.0的分割粒度方案而言,色相(Hue)的判断区位为60~240,饱和度(Saturation)和明度(Value)的加深及减弱梯度则有明显区别,并且减弱的幅度更大。 注意: 学术界对色彩的研究十分复杂,包含色彩理论、色彩模型、色彩空间、色彩计算等,感兴趣的读者可查阅相关资料进行深入学习。 3.2.4国际化 相应地,作为面向服务全球金融市场的引领者,蚂蚁金服前端的国际化之路同样早已深耕入局。在Ant Design中,其国际化方案主要提供了ConfigProvider的组件,用于全局地进行国际化配置,如图320所示。 图320Ant Design国际化方案 其中,ConfigProvider配置提供组件的实现,代码如下: //第3章/config-provider.tsx const ConfigProvider: React.FC<ConfigProviderProps>& { ConfigContext: typeof ConfigContext; SizeContext: typeof SizeContext; config: typeof setGlobalConfig; useConfig: typeof useConfig; } = (props) =>{ const context = React.useContext<ConfigConsumerProps>(ConfigContext); const antLocale = React.useContext<LocaleContextProps | undefined>(LocaleContext); return <ProviderChildren parentContext={context} legacyLocale={antLocale!} {...props} />; } 除此之外,对于现代化的React开发体系,Ant Design 5.0也提供了配置方案的hooks函数useConfig(),其对应代码如下: //第3章/useConfig.ts function useConfig() { const componentDisabled = useContext(DisabledContext); const componentSize = useContext(SizeContext); return { componentDisabled, componentSize, }; } 3.2.5文档 在软件工程领域,开发文档是软件开发使用和维护过程中的必备资料。诚然,文档在组件库体系中也同样重要,其不仅有指导、帮助、解惑的作用,更关键的是它也是树立组件库体系品牌、提升团队影响力的平台媒介。 在Ant Design文档化构建的方案中,除了5.0版本外,其他构建方案都是通过内部自研的MarkDown转化工具bisheng实现的,其是通过marktwain的前端工具包进行的MarkDown语法解析,代码如下: //第3章/markdown.js module.exports = function (filename, fileContent) { const markdown = markTwain(fileContent); markdown.meta.filename = toUriPath(filename); return markdown; } 从Ant Design 5.0开始,其官方文档采用基于蚂蚁金服自研乌米(umi)框架而衍生出来的嘟米(dumi)文档工具进行组件库官网构建及部署。与业界常见的文档构建相比,嘟米是一款为组件开发场景而生的静态站点框架,如图321所示。 图321Ant Design文档建设 在Ant Design 5.0官网构建中,Ant Design团队采用的是dumi 2.x版本。对dumi 2.x而言,其整个构建的核心是对demo、markdown、page及preraw提供相应的loader,以markdown为例,代码如下: function emit() { //模板语法 return Mustache.render() } //loader export default function mdLoader() {} 其中,对MarkDown文档的转化则是通过unified内容转化工具集的自定义实现的,包括rehype、remark及recma等,代码如下: //第3章/transformer.ts export default async (raw: string, opts: IMdTransformerOptions) =>{ //加载额外的remark插件 opts.extraRemarkPlugins?.forEach((plugin) => applyUnifiedPlugin({ plugin, processor, cwd: opts.cwd, }), ); //加载额外的rehype插件 opts.extraRehypePlugins?.forEach((plugin) => applyUnifiedPlugin({ plugin, processor, cwd: opts.cwd, }), ); const result = await processor.use().process(); return { content: String(result.value), meta: result.data, }; } 3.2.6资源 庞大的组件库生态通常会包含多种多样的资源与模板。除此之外,组件库体系如果能够提供独有的资产套件,并且推广相应的软件应用,则能够提升业界的影响力并且也能发现更多的机会。对Ant Design而言,其提供了官方与社区两种资源物料,其中,官方资产包括设计资源和设计工具,例如Sketch组件包、Mobile Components、Ant Design Pro、Kitchen、Ant Design Landing及Chart组件包等; 相应地,社区贡献了对应平台或者通用设计软件的套包,例如xiaopiu原型资源、Figma组件包资源、墨刀原型资源、即时设计资源、MasterGo组件包资源及Raycast拓展资源等,如图322所示。 图322Ant Design设计资源 2min 3.3本章小结 本章以工业时代下依托框架的两大组件库入手,分别介绍了Element UI和Ant Design组件库体系中的指南、组件、主题、国际化、文档及资源等内容,也简要地介绍了每个组件库所产生的背景与发展。为了更好地观察组件库体系从设计到落地的全貌,本节将通过对比分析不同的设计系统及前端发展历史阶段的典型组件库方案,以此来对本章做一个总结。 设计系统[1](Design System),也称作设计体系,是指服务于客体的一系列具有关联性、有序性、标准性的设计集合整体。一般来讲,设计系统通常包含核心准则(Core Guidelines)、设计准则(Design Guidelines)、设计资产(Design Assets)、组件库(Component Libraries)、元系统(Meta Systems)、编码工具及其他资产(Code Tooling & other assets)等,其有着清晰的标准引导、机制化的组织流程及具象的指南和工具,用来帮助开发者、设计师及产品经理等高效地沟通协作,动态地确保用户体验的一致性。 注意: 设计系统建设是一项十分庞大的工程,不仅包含前端工程师,同时也涵盖设计师、产品经理、运营人员等多个团队成员角色,有兴趣的读者可以在工作中不断地探索与实践。 由此看出,组件库体系不仅是设计系统的一部分,而且也拓展出了具有特定领域场景的新形态,因此,除了本章所介绍的设计体系之外,对已成熟商业化落地的设计系统例举如下,感兴趣的读者可参考相关资料进行进一步学习,如图323所示。 图323常见设计系统 以农业时代为起点,前端领域中出现了各种各样的组件库体系,对于业界常见的组件库体系进行如下总结,见表314。 表314常见组件库体系对比 组件库名称 设计系统 团队 诞生时期 工程 YUI YUI 雅虎 农业时代 PC端 Bootstrap Bootstrap UI Twitter 农业时代 PC端 移动端 Angular Material Material Design 谷歌 工业时代 PC端 移动端 Element Element UI 饿了么 工业时代 PC端 Ant Design Ant Design 蚂蚁金服 工业时代 PC端 移动端 Iceworks Ice Design 淘宝 信息时代 PC端 移动端 Vant Vant UI 有赞 信息时代 移动端 小程序 IView View Design 视图更新科技 信息时代 PC端 WeUI We UI 微信 信息时代 小程序 Nut Nut UI 京东 信息时代 PC端 Chameleon Chameleon UI 滴滴 信息时代 PC端 移动端 小程序 DevUI Dev UI 华为 信息时代 PC端 Arco Arco Design 今日头条 云边端时代 PC端 Semi Semi Design 抖音 云边端时代 PC端 最后,前端组件库仅仅是组件库体系中的一个方向,对于多端体系下的组件库方案,希望各位读者能够通过组件库篇章的学习,从而构建出符合自己团队或公司特性的组件库体系。 从第4章开始,本书将会对前端工程中的包管理方案进行阐述。所有的工程方案都有各自的包管理系统,前端工程方案同样离不开系统级别的工具组合,希望各位读者能通过包管理的学习,制定出符合自己团队的包管理方案。