基于 vue-skeleton-webpack-plugin 的骨架屏实战


Posted in Javascript onAugust 05, 2019

前言

目前正在做的项目,登录是需要跳转到别人的页面的,导致重定向很多,需要优化一下白屏时间,所以就用到了骨架屏,但是这次用的骨架屏不是自动生成的,还是自己敲的样式,一步步来吧,先从简单的用起 。

先上效果图:

基于 vue-skeleton-webpack-plugin 的骨架屏实战 

什么是骨架屏

骨架屏,英文 Skeleton screen ,是指在页面开始渲染之前的白屏时间内,先让用户看到即将要展现页面的“骨架”,页面渲染完成之后再将它替换掉,起到一个从 白屏 → 渲染完成 过程中的过渡作用,它可以有效减少用户的感知时间,让用户“感觉上”认为打开页面比较快(相比较于完整的白屏时间)。

实现

本文主要围绕一个开源的 Webpack 插件 vue-skeleton-webpack-plugin ,来实现在 Vue 项目中加入骨架屏。

由于项目对骨架屏的需求不同,相应的代码也会不一样。 本文所实现的骨架屏是 基于 Vue-cli 3.x 搭建的项目 ,根据的不同路由,显示不同的骨架屏,如需其他用法详见开源插件。

让我们开始吧:surfer:。

首先是安装插件:

npm install vue-skeleton-webpack-plugin

vue.config.js

安装完成后在 vue.config.js 中做如下配置:

const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin')
module.exports = {
 configureWebpack: (config) => {
  config.plugins.push(new SkeletonWebpackPlugin({
   webpackConfig: {
    entry: {
     app: path.join(__dirname, './src/skeleton/skeleton.js')
    }
   },
   // SPA 下是压缩注入 HTML 的 JS 代码
   minimize: true,
   // 服务端渲染时是否需要输出信息到控制台
   quiet: true,
   // 根据路由显示骨架屏
   router: {
     mode: 'history',
     routes: [
      {
       path: '/',
       skeletonId: 'skeleton-home'
      },
      {
       path: '/message',
       skeletonId: 'skeleton-message'
      }
     ]
   }
  }
 },
 css: {
  // 使用 css 分离插件 mini-css-extract-plugin,不然骨架屏组件里的 <style> 不起作用,
  extract: true,
 }
}

其中 skeleton.js 是我们骨架屏的入口,我们过会再创建。先看来一下其中 router 这个配置项。

router的配置决定了我们各个路由路径所对应的骨架屏。

  • router.mode 填路由模式,两个值可选 history | hash.
  • router.routes 填路由数组,其中 path 对应着页面在 vue-router 中的 pathskeletonId 是骨架屏的 id ,后面马上会说明。

 skeleton.js

配置完成后,新建一个骨架屏的入口 skeleton.js。

// src/skeleton/skeleton.js
import Vue from 'vue'

// 引入的骨架屏组件
import skeletonHome from './skeleton/skeletonHome.vue'
import skeletonMessage from './skeleton/skeletonMessage.vue'

export default new Vue({
 components: {
  skeletonHome,
  skeletonMessage,
 },
 template: `
  <div>
   <skeletonHome id="skeleton-home" style="display:none"/>
   <skeletonMessage id="skeleton-message" style="display:none"/>
  </div>
 `
})

上面的代码中,引入的两个组件分别对应 首页(Home)消息页(Message) 的骨架屏,其中组件的 id 对应之前在 vue.config.jsskeletonId

贴上其中一个骨架屏组件的代码:

// skeletonMessage.vue
<template>
 <div class="skeleton-block">
  <div class="sk-loanList-header-bg"></div>
  <s-messageItem/>
  <s-messageItem/>
  <s-messageItem/>
  <s-messageItem/>
 </div>
</template>

<script>
import messageItem from './components/s-messageListItem'
export default {
 name: 'skeletonMessage',
 components: {
  's-messageItem': messageItem
 }
}
</script>

<style scoped>
.skeleton-block {
 width:100%;
 height: 100vh;
}
.sk-loanList-header-bg {
 height:88px;
 background:#2954D0;
}
</style>

其实就是很普通的一个 Vue 组件,在组件里写自己想要的骨架屏的样式即可,可复用的地方还可以再分成组件。 在路由里加上 skeletonMessage ,看一下效果:

基于 vue-skeleton-webpack-plugin 的骨架屏实战

至此,现在骨架屏已经准备就绪了,是不是很简单 。

效果展示

这边模拟一下移动端访问环境,先进入 Chrome DevTools 中的 Performance 进行设置。

基于 vue-skeleton-webpack-plugin 的骨架屏实战

运行 Performance:

基于 vue-skeleton-webpack-plugin 的骨架屏实战

效果:

基于 vue-skeleton-webpack-plugin 的骨架屏实战

从骨架屏替换成页面的过程中还是有闪一下的,目前还不知道这个是否可以优化,尝试中。

查看一下 Performance 中不同页面展现的时间:

基于 vue-skeleton-webpack-plugin 的骨架屏实战 

基于 vue-skeleton-webpack-plugin 的骨架屏实战

(ps:解释一下,我也不知道什么情况,运行完之后就是尼:horse:这么糊...)

可以看到在通过本地运行访问的情况下(本地访问较快),在进入页面后 221ms 页面先展示骨架屏,随后在 738ms 时完成页面的渲染。

这里如果不加骨架屏的话就是 738ms 的白屏时间,我们已经通过骨架屏优化了一些白屏时间:surfer:。

最后

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 Javascript
浅析webapp框架AngularUI的demo
Dec 21 Javascript
javascript事件冒泡和事件捕获详解
May 26 Javascript
JavaScript中Window对象的属性及事件
Dec 25 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 Javascript
jquery购物车结算功能实现方法
Oct 29 Javascript
angularjs实现上拉加载和下拉刷新数据功能
Jun 12 Javascript
JS匿名函数内部this指向问题详析
May 10 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
Sep 26 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 Javascript
JS 自执行函数原理及用法
Aug 05 #Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 #jQuery
Nuxt.js实战和配置详解
Aug 05 #Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 #Javascript
前后端常见的几种鉴权方式(小结)
Aug 04 #Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
Aug 04 #Javascript
vue v-for 使用问题整理小结
Aug 04 #Javascript
You might like
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
php array_map()函数实例用法
2021/03/03 PHP
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
javascript实现拼图游戏
2021/01/29 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python可变参数函数用法实例
2015/07/07 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python 阶乘累加和的实例
2019/02/01 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
2016年端午节校园广播稿
2015/12/18 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python