接下来判断元素特征,确定是否符合生成条件,对于符合条件的区域,”一视同仁”生成相应区域的颜色块。”一视同仁”即对于符合条件的区域不区分具体元素、不考虑结构层级、不考虑样式,统一根据该区域与视口的绝对距离值生成 div 的颜色块。之所以这样是因为生成的节点是扁平的,体积比较小,同时避免额外的读取样式表、通过抽离样式维持骨架屏的外观,这种统一生成的方式使得骨架屏的节点更可控。基于那上述“走捷径”的想法,该方法生成的骨架屏是由纯 DOM 颜色块拼成的。1 j0 @: q, U9 Q0 N3 x
生成颜色块的方法:/ O9 Y) G e! h3 Q
五、结合 Puppeteer 自动生成骨架屏! b& p! c' D: c" a/ I% z+ L. l! ~: [
虽然该方式已经可以生成骨架屏代码了,但是还是不够自动化,为了让生成的骨架屏代码自动加载进指定页面。于是,我们开发了一个配套的 CLI 工具。这个工具通过 Puppeteer 运行页面,并把 evalDOM.js 脚本注入页面自动执行,执行的结果是生成的骨架屏代码被插入到应用页面。6 ^0 h* z5 [' b1 C9 s
我们的方案大概思路如下:+ @2 S9 b& A+ [; h . V0 T+ h& g# D接下来看看如何使用 CLI 工具生成骨架屏,最多只需如下四步: " z, v3 @5 i- W; ? 1. 全局安装,npm i draw-page-structure – g . m0 }8 T/ H$ j3 Q0 S6 G 2. dps init 生成配置文件 dps.config.js. g4 _5 }5 v2 L* l. a
3. 修改 dps.config.js 进行相关配置1 n B/ R, t2 }; x s% w3 L: Z
4. dps start 开始生成骨架屏 " T4 |% m0 v7 Q; `3 y& ?只需简单几步,然而并没有繁琐的配置:. `2 U4 j0 ~6 @/ j) C
: _0 C3 p6 m" H' d y9 E
一般来说,你需要按自己的项目情况来配置 dps.config.js ,常见的配置项有:% Q! N# {+ t4 |$ [2 ]
url: 待生成骨架屏的页面地址
output.filepath: 生成的骨架屏节点写入的文件
output.injectSelector: 骨架屏节点插入的位置,默认 #app
background: 骨架屏主题色
animation: css3 动画属性
rootNode: 真对某个模块生成骨架屏
device: 设备类型,默认 mobile
extraHTTPHeaders: 添加请求头
init: 开始生成之前的操作
includeElement(node, draw): 定制某个节点如何生成
writePageStructure(html, filepath): 回调的骨架屏节点 " }# Z& j( z# b
六、初步实现的效果: ! H3 j3 C0 M6 q& F$ l* 京东 PLUS 会员正式中首页: " o4 J V3 e S4 ~: ~( C 5 \0 m) X. Q) f1 C l7 @* 京东 PLUS 会员正式中首页,通过该方案生成的骨架屏效果:5 V4 g/ `7 @% y* @# H) S
! Y3 r0 O$ O, R& ]4 S$ Z# E: d 七、总结 8 R" {2 s9 X+ }9 Y/ p8 D% e, ^# ~ {% T 以上就是基于 DOM 的骨架屏自动生成方案,其核心是 evalDOM 函数。这个方案在很多场景下的表现还是令人满意的。不过,网页布局和样式组合的可能性太多,想要在各种场景下都获得理想的效果,还有很长的路要走,但既然已经在路上,就勇敢的向前吧!; p* t3 B9 B0 c+ t. R3 r