接下来判断元素特征,确定是否符合生成条件,对于符合条件的区域,”一视同仁”生成相应区域的颜色块。”一视同仁”即对于符合条件的区域不区分具体元素、不考虑结构层级、不考虑样式,统一根据该区域与视口的绝对距离值生成 div 的颜色块。之所以这样是因为生成的节点是扁平的,体积比较小,同时避免额外的读取样式表、通过抽离样式维持骨架屏的外观,这种统一生成的方式使得骨架屏的节点更可控。基于那上述“走捷径”的想法,该方法生成的骨架屏是由纯 DOM 颜色块拼成的。 . X( E5 q& m% p生成颜色块的方法:8 E& @9 x; E7 m6 |5 A' D2 x
五、结合 Puppeteer 自动生成骨架屏1 }8 x/ E9 A4 b/ t ?* l
虽然该方式已经可以生成骨架屏代码了,但是还是不够自动化,为了让生成的骨架屏代码自动加载进指定页面。于是,我们开发了一个配套的 CLI 工具。这个工具通过 Puppeteer 运行页面,并把 evalDOM.js 脚本注入页面自动执行,执行的结果是生成的骨架屏代码被插入到应用页面。 + _* a% @& X G; o我们的方案大概思路如下:$ ]& D3 u% {1 P$ ^1 Q' _ / o* V8 W4 B5 T8 W: l- R接下来看看如何使用 CLI 工具生成骨架屏,最多只需如下四步:; X+ d B& w; U m+ x6 s8 o& x
1. 全局安装,npm i draw-page-structure – g 9 m! c1 a, F& c 2. dps init 生成配置文件 dps.config.js7 T2 f* w5 ]; g1 P
3. 修改 dps.config.js 进行相关配置 , e7 c* w) C5 H4 b" X6 Q 4. dps start 开始生成骨架屏/ e* n8 G! O8 k& s
只需简单几步,然而并没有繁琐的配置:" o+ z. l/ M3 J. s$ a 6 K5 L! B$ [, N一般来说,你需要按自己的项目情况来配置 dps.config.js ,常见的配置项有: / N! f* K$ n$ p; `. @
url: 待生成骨架屏的页面地址
output.filepath: 生成的骨架屏节点写入的文件
output.injectSelector: 骨架屏节点插入的位置,默认 #app
background: 骨架屏主题色
animation: css3 动画属性
rootNode: 真对某个模块生成骨架屏
device: 设备类型,默认 mobile
extraHTTPHeaders: 添加请求头
init: 开始生成之前的操作
includeElement(node, draw): 定制某个节点如何生成
writePageStructure(html, filepath): 回调的骨架屏节点 0 e [ Q* f4 z" {/ O# K1 B
六、初步实现的效果: ' @9 f. a+ D4 \( H9 g* 京东 PLUS 会员正式中首页:3 n% p! Q# H+ Y5 e3 p
* i% c3 B/ S0 K
* 京东 PLUS 会员正式中首页,通过该方案生成的骨架屏效果: ( o& A, B6 ~, A% p$ n* n
4 ^! n( l1 F. G1 C) W, G 七、总结 1 p1 T3 c7 f7 A% l 以上就是基于 DOM 的骨架屏自动生成方案,其核心是 evalDOM 函数。这个方案在很多场景下的表现还是令人满意的。不过,网页布局和样式组合的可能性太多,想要在各种场景下都获得理想的效果,还有很长的路要走,但既然已经在路上,就勇敢的向前吧! " |4 X7 B$ e' ] & D7 x3 ]! R( }* F