详解VUE单页应用骨架屏方案

什么是骨架屏?
简单的说 , 骨架屏就是在页面未渲染完成的时候 , 先用一些简单的图形大致勾勒出页面的基本轮廓 , 给用户造成页面正在加载的错觉 , 待页面渲染完成之后再用页面替换掉骨架屏 , 从而减少页面白屏的时间 , 给用户带来更好的体验 。

详解VUE单页应用骨架屏方案


分析VUE渲染过程
使用vue-cli3.0创建项目: vue create project
详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


详解VUE单页应用骨架屏方案


在生成的项目文件夹下的public文件夹下的index.html文件代码如下:
详解VUE单页应用骨架屏方案


可以看到 , DOM里面有一个div#app , 当js被执行完成之后 , 此div#app会被整个替换掉 , 因此 , 如何在Vue页面实现骨架屏 , 已经有了一个很清晰的思路——在div#app内直接插入骨架屏相关内容即可 。
实现方案
手动在div#app里面写入骨架屏内容是不科学的 , 因此需要一个扩展性强且自动化的易维护方案 。既然是在Vue项目里 , 所以所谓的骨架屏也是一个.vue文件 , 它能够在构建时由工具自动注入到div#app里面 。首先 , 我们在/src目录下新建一个Skeleton.vue文件 , 其内容如下:
【详解VUE单页应用骨架屏方案】
详解VUE单页应用骨架屏方案


接下来 , 在/src目录再新建一个skeleton.entry.js入口文件:
详解VUE单页应用骨架屏方案


在完成了骨架屏的准备之后 , 我们需要一个关键插件vue-server-renderer 。该插件本用于服务端渲染 , 但是在这里 , 我们主要利用它能够把.vue文件处理成html和css字符串的功能 , 来完成骨架屏的注入 。
骨架屏注入
首先在public文件夹下新建一个template.html文件 , 并且其代码和index.html文件代码相同 , 但是需要在div#app中添加 占位符:
详解VUE单页应用骨架屏方案


然后 , 我们还需要在根目录新建一个webpack.skeleton.conf.js文件 , 以专门用来进行骨架屏的构建 。
详解VUE单页应用骨架屏方案


可以看到 , 该配置文件和普通的配置文件基本完全一致 , 主要的区别在于其target: 'node' , 配置了externals , 以及在plugins里面加入了VueSSRServerPlugin 。在VueSSRServerPlugin中 , 指定了其输出的json文件名 。然后通过运行下列指令 , 在/dist目录下生成一个skeleton.json文件: webpack --config ./webpack.skeleton.conf.js 接下来 , 在根目录下新建一个skeleton.js , 该文件即将被用于往index.html内插入骨架屏:
详解VUE单页应用骨架屏方案


接下来 , 只要运行 node skeleton.js , 就可以完成骨架屏的注入 。为了在 npm run serve 的时候自动完成骨架屏的注入 , 避免运行多次命令 , 需要在 package.json 中增加一条命令 "preserve": "webpack --config ./webpack.skeleton.conf.js && node skeleton.js" ,放在 "serve" 命令之前 。

推荐阅读