溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

發(fā)布時間:2021-09-09 09:39:14 來源:億速云 閱讀:182 作者:小新 欄目:web開發(fā)

小編給大家分享一下如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

先上效果圖:

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏 

什么是骨架屏

骨架屏,英文 Skeleton screen ,是指在頁面開始渲染之前的白屏時間內,先讓用戶看到即將要展現(xiàn)頁面的“骨架”,頁面渲染完成之后再將它替換掉,起到一個從 白屏 → 渲染完成 過程中的過渡作用,它可以有效減少用戶的感知時間,讓用戶“感覺上”認為打開頁面比較快(相比較于完整的白屏時間)。

實現(xiàn)

本文主要圍繞一個開源的 Webpack 插件 vue-skeleton-webpack-plugin ,來實現(xiàn)在 Vue 項目中加入骨架屏。

由于項目對骨架屏的需求不同,相應的代碼也會不一樣。 本文所實現(xiàn)的骨架屏是 基于 Vue-cli 3.x 搭建的項目 ,根據(jù)的不同路由,顯示不同的骨架屏,如需其他用法詳見開源插件。

讓我們開始吧: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,
   // 根據(jù)路由顯示骨架屏
   router: {
     mode: 'history',
     routes: [
      {
       path: '/',
       skeletonId: 'skeleton-home'
      },
      {
       path: '/message',
       skeletonId: 'skeleton-message'
      }
     ]
   }
  }
 },
 css: {
  // 使用 css 分離插件 mini-css-extract-plugin,不然骨架屏組件里的 <style> 不起作用,
  extract: true,
 }
}

其中 skeleton.js 是我們骨架屏的入口,我們過會再創(chuàng)建。先看來一下其中 router 這個配置項。

router的配置決定了我們各個路由路徑所對應的骨架屏。

  • router.mode 填路由模式,兩個值可選 history | hash.

  • router.routes 填路由數(shù)組,其中 path 對應著頁面在 vue-router 中的 path , skeletonId 是骨架屏的 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" />
   <skeletonMessage id="skeleton-message" />
  </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 ,看一下效果:

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

至此,現(xiàn)在骨架屏已經準備就緒了,是不是很簡單 。

效果展示

這邊模擬一下移動端訪問環(huán)境,先進入 Chrome DevTools 中的 Performance 進行設置。

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

運行 Performance:

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

效果:

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

從骨架屏替換成頁面的過程中還是有閃一下的,目前還不知道這個是否可以優(yōu)化,嘗試中。

查看一下 Performance 中不同頁面展現(xiàn)的時間:

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏 

如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏

(ps:解釋一下,我也不知道什么情況,運行完之后就是尼:horse:這么糊...)

可以看到在通過本地運行訪問的情況下(本地訪問較快),在進入頁面后 221ms 頁面先展示骨架屏,隨后在 738ms 時完成頁面的渲染。

這里如果不加骨架屏的話就是 738ms 的白屏時間,我們已經通過骨架屏優(yōu)化了一些白屏時間:surfer:。

最后

vue-skeleton-webpack-plugin 是較為初級的骨架屏方案,相信大家也可以馬上想到許多缺點。
比如:

  • 需要手動去寫骨架屏的樣式。

  • 骨架屏樣式在不同尺寸下的響應式問題。

  • 在界面改動之后也需要手動修改對應的骨架屏。

由于在本人的項目中使用到了 postcss-px2rem 自動 px 轉 rem,所以避開了一些缺點。

其他方法

此外還有許多使用骨架屏的方法:

page-skeleton-webpack-plugin 餓了么開源的自動生成骨架屏生成插件。

用 base64 的圖片做骨架屏,就讓 UI 在出設計稿的時候順便把骨架屏也給畫了?。

以上是“如何實現(xiàn)基于vue-skeleton-webpack-plugin的骨架屏”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI