前端代码是怎样智能生成的-语义化篇

简介: 作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了2019双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块79.34%的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次《前端代码是怎样智能生成的》系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。

作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了2019双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块79.34%的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次《前端代码是怎样智能生成的》系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。

概述

imgcook 是以各种设计稿图像(Sketch/PSD/ 静态图片)为原材料烹饪的匠心大厨,通过智能化手段将各种原始设计稿一键生成可维护的 UI 试图代码和逻辑代码。

语义化是什么?

语义主要研究符号标记,以及他们所代表的事物之间的关系,语言学中主要研究符号所表达的意思,而在web前端开发领域中,语义化指编写HTML的过程中“用最恰当语义的html标签和class类名等内容,让页面具有良好的结构与含义,从而让人和机器都能快速理解网页内容”。语义化的web页面一方面可以让机器(搜索引擎、爬虫、屏幕阅读器)在更少的人类干预下收集并研究网页的信息,从而可以读懂网页内容,收集汇总信息进行分析;另一方面它可以让开发人员读懂结构,快速理解页面各区块功能,便于二次维护。简单来说就是利于SEO,便于阅读维护理解。

传统语义化包含了 html 标签的语义和 class 类名的语义。

先说 html 标签语义,在 HTML5 出现之前,我们只能用没有语义的 div 来表示页 面章 节。 现 在, 通 过 使用 HTML5 语 义 元 素 标 签, 如 body、article、nav、aside、section、header、footer、hgroup 等,我们可以通过读取 html 结构就了解页面的布局结构。在 react-native、rax 等跨端 UI 体系下,标签通常被各种组件替代,标签语义化也就转换成了“组件语义化”,在合适的场景下使用合适的组件名即可实现结构可读。

class 类名语义化指用易于理解的名称对 html 标签附加的 class 或 id 命名。class属性本意用来描述元素样式内容的,经过前端领域多年的演变,已经不仅局限于做HTML 和 CSS 的衔接,而是一个集样式定义、函数钩子、组件类型等多层意义的复杂属性。本文将专注于 class 类名语义化这个问题,尝试运用 D2C 的能力彻底解决。

所在分层

在整体架构中,语义化层负责对布局算法生成的视图进行语义推测,用较为人性化的类名替换初始值,从而达到接近前端自己命名的效果。

image.png
(D2C 技术能力分层 )

制定 class 类名命名原则

业界规范

BEM(Block,Element,Modifier)

BEM 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex团队提出的一种前端 CSS 命名方法论。用中划线、双下划线、单下划线来做单词间的链接记号,通过将页面分解为一个个小小的可重复使用组件来解决复杂项目的命名问题。 比如:.block{}、.block__element{}、.block--modifier{}, 都是典型的BEM 命名模式,他们的命名规范、可读性高,通过组件的修饰符就可以了解组件的形态。

NEC(niceeasycss)

国内的网易团队指定的前端样式规范。通过指定的单字母前端来做功能划分,大体 上 有 以 下 功 能: 重 置 和 默 认(reset+base)、 布 局(g-)、 模 块(m-)、 元 件(u-)、功能(f-)、皮肤(s-)、状态(z-)、js 钩子(j-)等。基于上述单字母命名,再使用简约而不失语义的后代选择器名称追加其后。典型的 NEC 命名如 m-list、u-btn-hover 等。

AliceUi

用扁平化的方式划分为不同层级。基于 - 符号做命名空间隔离,第一个前缀通常是通用业务标识,各业务线选取自己的前缀,后面依次用组件名、组件状态等填充。组件名必选,且要求表意,模块内部类名需继承上层名称。ui-name-status、uipage-item-info 都是典型的 AliceUi 命名方式。

业界的 class 类名规范的目的都是解决大规模项目下的样式命名问题,且因为遵循了各种层级结构关系和私有约定,编写出的类名普遍较长、在不了解规范的人眼中需要有一定的适应过程。不是特别适合 D2C 主打的移动端轻量级的模块开发场景。

从实际场景推导

为了寻求适合的场景,我们分析了内部的前端工程师在导购开发业务下真实代码的样式命名。下图是我们对淘系导购页面的真实词频统计结果,左图是样式全名词频,右图是拆分之后的原子结果:

image.png
( 前端样式词频分析 )

图中样式命名有如下特点:

  • 和 BEM、NEC 等规范的风格不同,实际开发场景中的命名相对简洁
  • 准确表达语义,且和节点业务特征强关联
  • 单词为主,复合词采用驼峰命名,长度通常不超过 3
  • 辅助性的修饰词如:wrap、ctn、empty、desc 等高频出现
  • 可使用通俗易懂的简写单词

制定命名原则

D2C 希望优先解决淘系移动业务的问题,总体上以实际场景为主,业界规范为辅,最终确定了以表意为主要原则的样式命名策略:

  • 表意:样式名需准确表达节点意义,选择上优先从移动端业务真实类名中获取
  • 简洁:以单个词为主,所有词都使用不超过三个原子词组合
  • 规范:以驼峰为主,同时在代码转化层面保留了转化为连字符的能力
  • 工整:从模块根节点开始,采用布局信息 + 区块语义 + 语义辅助的整体命名策略

类名策略树

命名原则确定后,我们相当于定义了一个树的最终叶子节点形态,接下来需要构建从枝干一点点按图索骥到这些最终节点的过程,最终构建出我们的类名策略树。

判别维度

在实际对节点类名命名的过程中,我们要考虑的规则往往是多个维度的:

image.png
( 样式判别维度 )

imgcook 对淘系多达几百的模块进行规则提取,根据真实书写习惯,将上述规则做了权重,一般来说我们希望功能类别优先于样式特征,即一个按钮播放器按钮命名为 playBtn 而不是 circleIcon。其他的规则作为辅助决策,在整个树中左右走向。

基于节点样式、内容、层级、特征、权重、布局、全局计数对组件节点做了多方位多种类型的鉴别。同时借助阿里内部 sqi 平台和 D2C 自身的智能化能力,实现对一些经验规则解决不了的节点类名的鉴别。

image.png
(D2C 样式命名选型 )

策略定型

在建设完成阿里内部业务专属的类名专家系统后,结合智能化算法,我们升级了策略判别的流程,并整合出了下面这个最终的策略树。从根节点出发,大部分节点都可以通过此策略树归纳到一个具体语义结果上。

image.png
(D2C 样式策略树 )

类名识别服务

核心实现

在实现上述样式命名策略树的过程中,我们产出了一个专用于推测 imgcook 模块布局类名的服务:

image.png
( 语义化 SemanticService 结构图 )

semantic-core 提供整体的节点树遍历流程控制,分为前置和后置两个处理过程。

预处理过程会向组件节点追加检索索引,同时会检索组件树中符合条件、需要调用 iconFont 识别服务的图片统一聚合发送请求。后置处理中会对各个语义项处理的结果标记进行排序、应用前缀类名、执行组件索引清理等。

semnatic-text、semantic-pic、semantic-view、semantic-layout 是imgcook 内置的语义算法。分别分析文字、图片、容器和布局相关的信息。

每个语义项执行过程如下:

  • 判断是否命中语义策略,未命中则结束此语义执行(语义策略下面会有详解)
  • 判断是否会影响父元素,是则检索父元素,追加当前语义项的标记
  • 判断是否会影响兄弟元素,是则检索兄弟元素,追加当前语义项的标记
  • 判断当前命中的语义策略置信度是否可靠,是则为当前节点追加数据推荐标记
  • 最终,一个节点会得到很多不同置信度的语义项标记结果。通过统一筛选,得到此节点最后生效的类名

image.png
( 语义项执行流程 )

细节实现

在向各个策略叶子节点的推导过程中,我们会使用最适合的能力实现需求,比如为了解决“鉴别小图标”这个语义判别过程中我们部署了 IconFont 服务来实现,具体流程如下:

  1. 从 iconfont 网站上获取 iconfont 的图标文件,并转成 png 格式,如下图
  2. 使用一个自编码器把图片编码到特征空间
  3. 使用 t-SNE 映射到二维平面上看看效果
  4. 在特征空间上使用聚类算法将类似的 icon 聚到一起
  5. 手工剔除质量较差的版本,然后将一个类簇中的命名根据已有名称进行选举

image.png
(IconFont 识别服务执行流程 )

iconFont 服务用于解决小图标命名问题,至今仍然在持续优化中。

展望未来

典型应用

imgcook 语义化能力自从方案上线以来已支持了一年多的线上业务。以下是2019 年双 11 的模块仓库中找到的,可验收语义化成果的一个模块:

image.png
( 语义识别结果 )

从该模块的还原效果中可见,依次命中了布局逻辑、图片分类、IconFont 分类、翻译、店铺名、样式特征、价格判断等内置策略。大部分节点都有语义项命中,其中识别较为准确且贴近语义的节点占比 60%+。

衍生方向

语义化本质是推测节点特征的过程,在识别准确度没有要求时可以作为 class名使用。对于识别准确度极高的预测结果,我们认为节点和数据也有映射成功的可能性。

因为我们希望 D2C 能推测出节点绑定字段并实现在业务中落地,所以基于语义化的思路,D2C 孵化出了目的性更强、对准确度要求更高的节点数据字段推测服务。

感兴趣的同学可以移步本系列的“字段绑定”文章继续深入了解。

相关文章
|
1天前
|
前端开发 小程序 JavaScript
信前端里的循环显示如何编写代码?
信前端里的循环显示如何编写代码?
10 5
|
14天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
7天前
|
前端开发 搜索推荐 开发者
前端基础(三)_路径(绝对路径、相对路径)、语义化、特殊字符
本文介绍了前端开发中的路径概念(包括绝对路径和相对路径)、HTML的语义化以及特殊字符的使用。文章解释了绝对路径和相对路径的区别和应用场景,阐述了HTML语义化的意义和好处,并通过示例代码展示了如何在HTML中使用特殊字符。
11 0
|
2月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
33 1
|
2月前
|
缓存 前端开发 数据格式
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
|
2月前
|
JavaScript 前端开发 小程序
【技巧】JS代码这么写,前端小姐姐都会爱上你
本文介绍了JavaScript编程中的实用技巧,包括解构赋值的多种妙用、数组操作技巧及常用JS功能片段。解构赋值部分涵盖短路语法防错、深度解构及默认值赋值;数组技巧包括按条件添加数据、获取最后一个元素及使用`includes`优化`if`语句;常用功能片段则涉及URL参数解析、页面滚动回顶部及获取滚动距离等。通过这些技巧,提升代码质量和效率。
22 0
【技巧】JS代码这么写,前端小姐姐都会爱上你
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
58 0
|
2月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
78 0
|
2月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
57 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
76 0
下一篇
无影云桌面