相比于早些年先后端代码紧密耦合、后端工程师还得写前端代码的时代,现在已发展到先后端分离,这种开发方式大大提高了先后端项目的可维护性与开发效率,让先后端工程师关注于本身的主业。然而在带来便利的同时,也带来了一些弊端,好比首屏渲染时间(FCP)由于首屏须要请求更多内容,比原来多了更多HTTP的往返时间(RTT),这形成了白屏,若是白屏时间过长,用户体验会大打折扣,若是用户网速差,则FCP会更长。html
由此引伸出一系列的优化方法,骨架屏也所以被提出。前端
为了优化首屏渲染时间这个指标,减小白屏时间,前端仔们想了不少办法:vue
加速或减小HTTP请求损耗:使用CDN加载公用库,使用强缓存和协商缓存,使用域名收敛,小图片使用Base64代替,使用Get请求代替Post请求,设置 Access-Control-Max-Age 减小预检请求,页面内跳转其余域名或请求其余域名的资源时使用浏览器prefetch预解析等;
延迟加载:非重要的库、非首屏图片延迟加载,SPA的组件懒加载等;
减小请求内容的体积:开启服务器Gzip压缩,JS、CSS文件压缩合并,减小cookies大小,SSR直接输出渲染后的HTML等;
浏览器渲染原理:优化关键渲染路径,尽量减小阻塞渲染的JS、CSS;
优化用户等待体验:白屏使用加载进度条、菊花图、骨架屏代替等;
这里要介绍的就是优化用户等待体验的骨架屏,它能够被视为是原来加载菊花图的一种升级版,结合传统的首屏优化方法对应用进行优化能够达到不错的效果。webpack
能够看一下下面的示例图,第一个为骨架屏,第二个为菊花图,第三个为无优化,能够看到相比于传统的菊花图会在感官上以为内容出现的流畅而不突兀,体验更加优良。web
现在这项技术已经在Facebook、Google、支付宝、饿了么、简书、新浪微博、知乎、美团、领英等公司的产品中被普遍的使用。在论坛和社区也都有很多文章讨论骨架屏的实现和使用场景等。后端
手写HTML、CSS的方式为目标页定制骨架屏 作法能够参考
使用图片做为骨架屏; 简单暴力,让UI同窗花点功夫吧哈哈;小米商城的移动端页面采用的就是这个方法,它是使用了一个Base64的图片来做为骨架屏。
自动生成并自动插入静态骨架屏 这种方法跟第一种方法相似,不过是自动生成骨架屏,能够关注下饿了么开源的插件 page-skeleton-webpack-plugin ,它根据项目中不一样的路由页面生成相应的骨架屏页面,并将骨架屏页面经过 webpack 打包到对应的静态路由页面中,不过要注意的是这个插件目前只支持history方式的路由,不支持hash方式,且目前只支持首页的骨架屏,并无组件级的局部骨架屏实现,做者说之后会有计划实现(issue9)。
另外还有个插件 vue-skeleton-webpack-plugin,它将插入骨架屏的方式由手动改成自动,原理在构建时使用 Vue 预渲染功能,将骨架屏组件的渲染结果 HTML 片断插入 HTML 页面模版的挂载点中,将样式内联到 head 标签中。这个插件能够给单页面的不一样路由设置不一样的骨架屏,也能够给多页面设置,同时为了开发时调试方便,会将骨架屏做为路由写入router中,可谓是至关体贴了。
vue-skeleton-webpack-plugin的具体使用参考 vue-style-codebase,主要关注build目录的几个文件,线上Demo 在Chrome的DevTools中把network的网速调为Gast 3G / Slow 3G就能看到效果了~缓存
网上的帖子大多深浅不一,甚至有些先后矛盾,在下的文章都是学习过程当中的总结,若是发现错误,欢迎留言指出~服务器
做者:SHERlocked93
连接:http://www.javashuo.com/article/p-nubdozbz-dh.html
来源:掘金
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。cookie