You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Check the element pseudo-class to return the corresponding element and widthexportconstcheckHasPseudoEle=(ele)=>{if(!ele)returnfalse;constbeforeComputedStyle=getComputedStyle(ele,'::before');constbeforeContent=beforeComputedStyle.getPropertyValue('content');constbeforeWidth=parseFloat(beforeComputedStyle.getPropertyValue('width'),10)||0;consthasBefore=beforeContent&&beforeContent!=='none';constafterComputedStyle=getComputedStyle(ele,'::after');constafterContent=afterComputedStyle.getPropertyValue('content');constafterWidth=parseFloat(afterComputedStyle.getPropertyValue('width'),10)||0;consthasAfter=afterContent&&afterContent!=='none';constwidth=Math.max(beforeWidth,afterWidth);if(hasBefore||hasAfter){return{ hasBefore, hasAfter, ele, width };}returnfalse;};
import{checkHasPseudoEle,addClass}from'../util';import{PSEUDO_CLASS}from'../constants';functionpseudoHandler(node){if(!node.tagName)return;constpseudo=checkHasPseudoEle(node);if(!pseudo||!pseudo.ele)return;const{ ele }=pseudo;addClass(ele,PSEUDO_CLASS);}exportdefaultpseudoHandler;
背景
性能优化,减少页面加载等待时间一直是前端领域永恒的话题。如今大部分业务合作模式都是前后端分离方案,便利性的同时也带来了非常多的弊端,比如 FCP 时间显著增加(多了更多的 HTTP 请求往返的时间消耗),这也就造成了我们所说的白屏时间较长,用户体验较差的情况。
当然,对此我们可以有很多种优化手段,即便是此文介绍的骨架屏也只是用户体验的优化而已,对性能优化的数据没有任何提升,但是其必要性,依然是不言而喻的。
本文主要介绍应用在拍卖源码工作台BeeMa 架构中的骨架屏自动生成方案。有一定的定制型,但是基本原理是相通的。
骨架屏 Skeleton
骨架屏其实就是在页面加载内容之前,先给用户展示出页面的大致结构,再等拿到接口数据后在将内容替换,较传统的菊花
loading
效果会给用户一种“已经渲染一部分出来了”的错觉,在效果上可以一定程度的提升用户体验。本质上就是视觉过渡的一个效果,以此来降低用户在等待时候的焦灼情绪。方案调研
骨架屏技术方案上从实现上来说大致可以三类:
HTML
、css or vue
、React
)对于前两种方案有一定的维护成本比较费人力,这里主要介绍下自动生成骨架屏的方案。
目前市面上主要使用的是饿了么开源的
webpack
插件:page-skeleton-webpack-plugin
。它根据项目中不同的路由页面生成相应的骨架屏页面,并将骨架屏页面通过webpack
打包到对应的静态路由页面中。这种方式将骨架屏代码与业务代码隔离,通过webpack
注入的方式骨架屏代码(图片)注入到项目中。优势非常明显但是缺点也显而易见:webpack
配置成本(还依赖html-webpack-plugin
)。技术方案
综合如上的技术调研,我们还是决定采用最低侵入业务代码且降低配置成本的骨架屏自动生成的方案。参考饿了么的设计思路,基于
BeeMa
架构和vscode
插件来实现一个新的骨架屏生成方案。设计原则
参考目前使用骨架屏的业务团队,我们首先要明确下我们的骨架屏需要具有的一些原则:
BeeMa
架构基于如上原则和 beema 架构vscode 插件的特性,如下使我们最终的技术方案设计:
BeeMa
架构的页面,支持 SkeletonScreen height、ignoreHeight/width
、通用头和背景色保留等Puppeteer
获取预发页面(支持登陆)HTML
结构,样式基于用户自动以的CSSInModel
的样式global.scss
中,避免行内样式重复体积增大流程图
技术细节
校验 Puppeteer、
webView 打开后,立即校验本地 Puppeteer
puppeteer
webView & vscode 通信(配置)
详见基于 monorepo 的 vscode 插件及其相关 packages 开发架构实践总结
vscode
connectSeervice
Webview 中调用 callService
launchJs
本地 js 通过 rollup 打包
rollupConfig
文本处理
SKELETON_TEXT_CLASS
的样式作为 beema 架构中的 global.scss 中。如果
global.scss
中没有相应骨架屏的样式 class,则自动注入进去这是因为如果作为行内元素的话,生成的骨架屏代码会比较大,重复代码多,这里是为了提及优化做的事情
图片处理
超链接处理
伪元素处理
通用处理
使用
基本使用
约束
需全局安装 [email protected] : tnpm i [email protected] --g
全局安装后,插件会自动查找本地的
puppeteer
路径,如果找到插件,则进行 copy 到插件内的过程,否则需要用户自己手动填写路径puppeteer
地址。(一旦查找成功后,后续则无需填写地址,全局puppeteer
包也可删除)目前仅支持 beema 架构源码开发
注意⚠️
如果生成出来的代码片段较大,如下两种优化方案
1、减少骨架屏的高度(配置界面中最大高度)
2、在源码开发中,对于首屏代码但是非首屏展示的元素添加
beema-skeleton-ignore
的类名(例如轮播图的后面几张图甚至视频)效果演示
普通效果
生成的代码大小:
带有通用头和渐变背景色
效果如下:
复杂元素的页面效果展示
默认全屏骨架屏
生成代码大小
另一种优化手段是减小生成骨架屏的高度!
半屏骨架屏
生成代码大小
后续优化
参考资料
page-skeleton-webpack-plugin
awesome-skeleton
Building Skeleton Screens with CSS Custom Properties
Vue页面骨架屏注入实践
The text was updated successfully, but these errors were encountered: