您好,欢迎访问一九零五行业门户网

怎样实现Vue页面骨架屏

这次给大家带来怎样实现vue页面骨架屏,实现vue页面骨架屏的注意事项有哪些,下面就是实战案例,一起来看一下。
在开发webapp的时候总是会受到首屏加载时间过长的影响,主流的解决方法是在载入完成之前显示loading图效果,而一些大公司会配置一套服务端渲染的架构来解决这个问题。考虑到ssr所要解决的一系列问题,越来越多的app采用了“骨架屏”的方式去提升用户体验。
小米商城:
一、分析vue页面的内容加载过程
vue项目中的入口index.html只有简单的内容:
<!doctype html> <html lang="zh-cn"> <head>   <meta http-equiv="content-type" content="text/html;charset=utf-8">   <title>document</title> </head> <body>   <p id="root">       </p>   <script type="text/javascript" src="bundle.js"></script></body> </body> </html>
当js执行完之后,会用vue渲染成的dom将p#root完全替换掉。
我们在p#root中加入模拟骨架屏,在chrome开发者工具调整网速:
<p id="root">   这里是骨架屏 </p>
由此可知,将骨架屏内容直接插入p#root中即可实现骨架屏。
二、使用vue-server-renderer来实现骨架屏
我们需要骨架屏也是一个单独的.vue文件,因此我们需要用到vue-server-renderer。对vue服务端渲染有所了解的同学一定知道,这个插件能够将vue项目在node端打包成一个bundle,然后由bundle生成对应的html。
首先是生成项目:
. ├── build │  ├── webpack.config.client.js │  └── webpack.config.server.js ├── src │  └── views │    ├── index │    │  └── index.vue │    ├── skeleton │    │  └── skeleton.vue │    ├── app.vue │    ├── index.js │    └── skeleton-entry.js ├── index.html └── skeleton.js └── package.json
vue的服务端渲染一般会用vue-server-renderer将整个项目在node端打包成一份bundle,而这里我们只要一份有骨架屏的html,所以会有一个单独的骨架屏入口文件skeleton-entry.js,一个骨架屏打包webpack配置webpack.config.server.js,而skeleton.js作用是将webpack打包出来的bundle写入到index.html中。
//skeleton-entry.js import vue from 'vue' import skeleton from './views/skeleton/skeleton.vue' export default new vue({  components: {   skeleton  },  template: '<skeleton />' })
//webpack.config.server.js const path = require('path') const { vueloaderplugin } = require('vue-loader') const vuessrserverplugin = require('vue-server-renderer/server-plugin') module.exports = {  mode: process.env.node_env,  target: 'node',  entry: path.join(dirname, '../src/skeleton-entry.js'),  output: {   path: path.join(dirname, '../server-dist'),   filename: 'server.bundle.js',   librarytarget: 'commonjs2'  },  module: {   rules: [    {     test: /\.vue$/,     loader: 'vue-loader'    },    {     test: /\.css$/,     use: [      'vue-style-loader',      'css-loader'     ]    }     ]  },  externals: object.keys(require('../package.json').dependencies),  resolve: {   alias: {    'vue$': 'vue/dist/vue.esm.js'   }  },  plugins: [   new vueloaderplugin(),   new vuessrserverplugin({    filename: 'skeleton.json'   })  ] }
其中骨架屏的webpack配置因为是node端,所以需要target: 'node' librarytarget: 'commonjs2'。在vuessrserverplugin中,指定了其输出的json文件名。当执行webpack会在/server-dist目录下生成一个skeleton.json文件,这个文件记载了骨架屏的内容和样式,会提供给vue-server-renderer使用。
//skeleton.js const fs = require('fs') const path = require('path') const createbundlerenderer = require('vue-server-renderer').createbundlerenderer // 读取`skeleton.json`,以`index.html`为模板写入内容 const renderer = createbundlerenderer(path.join(dirname, './server-dist/skeleton.json'), {  template: fs.readfilesync(path.join(dirname, './index.html'), 'utf-8') }) // 把上一步模板完成的内容写入(替换)`index.html` renderer.rendertostring({}, (err, html) => {  fs.writefilesync('index.html', html, 'utf-8') })
注意,作为模板的html文件,需要在被写入内容的位置添加<!--vue-ssr-outlet-->占位符,本例子在p#root里写入:
<p id="root"> <!--vue-ssr-outlet--> </p>
最后执行node skeleton就能实现vue的骨架屏。
最终的index.html:
<!doctype html> <html lang="zh-cn"> <head>   <meta http-equiv="content-type" content="text/html;charset=utf-8">   <meta http-equiv="x-ua-compatible" content="ie=edge,chrome=1">   <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">   <title>document</title> <style data-vue-ssr-id="a7049cb4:0"> .skeleton[data-v-61761ff8] {  position: relative;  height: 100%;  overflow: hidden;  padding: 15px;  box-sizing: border-box;  background: #fff; } .skeleton-nav[data-v-61761ff8] {  height: 45px;  background: #eee;  margin-bottom: 15px; } .skeleton-swiper[data-v-61761ff8] {  height: 160px;  background: #eee;  margin-bottom: 15px; } .skeleton-tabs[data-v-61761ff8] {  list-style: none;  padding: 0;  margin: 0 -15px;  display: flex;  flex-wrap: wrap; } .skeleton-tabs-item[data-v-61761ff8] {  width: 25%;  height: 55px;  box-sizing: border-box;  text-align: center;  margin-bottom: 15px; } .skeleton-tabs-item span[data-v-61761ff8] {  display: inline-block;  width: 55px;  height: 55px;  border-radius: 55px;  background: #eee; } .skeleton-banner[data-v-61761ff8] {  height: 60px;  background: #eee;  margin-bottom: 15px; } .skeleton-productions[data-v-61761ff8] {  height: 20px;  margin-bottom: 15px;  background: #eee; } </style></head> <body>   <p id="root">     <p data-server-rendered="true" class="skeleton page" data-v-61761ff8><p class="skeleton-nav" data-v-61761ff8></p> <p class="skeleton-swiper" data-v-61761ff8></p> <ul class="skeleton-tabs" data-v-61761ff8><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li></ul> <p class="skeleton-banner" data-v-61761ff8></p> <p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p></p>   </p> </body> </html>
看下效果:
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
怎样进行mpvue小程序项目搭建
chart.js轻量级图表库使用步骤详解
以上就是怎样实现vue页面骨架屏的详细内容。
其它类似信息

推荐信息