基于 vue-skeleton-webpack-plugin 的骨架屏實(shí)戰(zhàn)
前言
目前正在做的項(xiàng)目,登錄是需要跳轉(zhuǎn)到別人的頁面的,導(dǎo)致重定向很多,需要優(yōu)化一下白屏?xí)r間,所以就用到了骨架屏,但是這次用的骨架屏不是自動(dòng)生成的,還是自己敲的樣式,一步步來吧,先從簡單的用起 。
先上效果圖:
什么是骨架屏
骨架屏,英文 Skeleton screen
,是指在頁面開始渲染之前的白屏?xí)r間內(nèi),先讓用戶看到即將要展現(xiàn)頁面的“骨架”,頁面渲染完成之后再將它替換掉,起到一個(gè)從 白屏 → 渲染完成 過程中的過渡作用,它可以有效減少用戶的感知時(shí)間,讓用戶“感覺上”認(rèn)為打開頁面比較快(相比較于完整的白屏?xí)r間)。
實(shí)現(xiàn)
本文主要圍繞一個(gè)開源的 Webpack 插件 vue-skeleton-webpack-plugin ,來實(shí)現(xiàn)在 Vue 項(xiàng)目中加入骨架屏。
由于項(xiàng)目對(duì)骨架屏的需求不同,相應(yīng)的代碼也會(huì)不一樣。 本文所實(shí)現(xiàn)的骨架屏是 基于 Vue-cli 3.x 搭建的項(xiàng)目 ,根據(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, // 服務(wù)端渲染時(shí)是否需要輸出信息到控制臺(tái) 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 是我們骨架屏的入口,我們過會(huì)再創(chuàng)建。先看來一下其中 router 這個(gè)配置項(xiàng)。
router的配置決定了我們各個(gè)路由路徑所對(duì)應(yīng)的骨架屏。
- router.mode 填路由模式,兩個(gè)值可選 history | hash.
- router.routes 填路由數(shù)組,其中 path 對(duì)應(yīng)著頁面在 vue-router 中的 path , skeletonId 是骨架屏的 id ,后面馬上會(huì)說明。
skeleton.js
配置完成后,新建一個(gè)骨架屏的入口 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> ` })
上面的代碼中,引入的兩個(gè)組件分別對(duì)應(yīng) 首頁(Home) 和 消息頁(Message) 的骨架屏,其中組件的 id 對(duì)應(yīng)之前在 vue.config.js 里 skeletonId 。
貼上其中一個(gè)骨架屏組件的代碼:
// 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>
其實(shí)就是很普通的一個(gè) Vue 組件,在組件里寫自己想要的骨架屏的樣式即可,可復(fù)用的地方還可以再分成組件。 在路由里加上 skeletonMessage ,看一下效果:
至此,現(xiàn)在骨架屏已經(jīng)準(zhǔn)備就緒了,是不是很簡單 。
效果展示
這邊模擬一下移動(dòng)端訪問環(huán)境,先進(jìn)入 Chrome DevTools 中的 Performance 進(jìn)行設(shè)置。
運(yùn)行 Performance:
效果:
從骨架屏替換成頁面的過程中還是有閃一下的,目前還不知道這個(gè)是否可以優(yōu)化,嘗試中。
查看一下 Performance 中不同頁面展現(xiàn)的時(shí)間:
(ps:解釋一下,我也不知道什么情況,運(yùn)行完之后就是尼:horse:這么糊...)
可以看到在通過本地運(yùn)行訪問的情況下(本地訪問較快),在進(jìn)入頁面后 221ms 頁面先展示骨架屏,隨后在 738ms 時(shí)完成頁面的渲染。
這里如果不加骨架屏的話就是 738ms 的白屏?xí)r間,我們已經(jīng)通過骨架屏優(yōu)化了一些白屏?xí)r間:surfer:。
最后
vue-skeleton-webpack-plugin 是較為初級(jí)的骨架屏方案,相信大家也可以馬上想到許多缺點(diǎn)。
比如:
- 需要手動(dòng)去寫骨架屏的樣式。
- 骨架屏樣式在不同尺寸下的響應(yīng)式問題。
- 在界面改動(dòng)之后也需要手動(dòng)修改對(duì)應(yīng)的骨架屏。
由于在本人的項(xiàng)目中使用到了 postcss-px2rem 自動(dòng) px 轉(zhuǎn) rem,所以避開了一些缺點(diǎn)。
其他方法
此外還有許多使用骨架屏的方法:
page-skeleton-webpack-plugin 餓了么開源的自動(dòng)生成骨架屏生成插件。
用 base64 的圖片做骨架屏,就讓 UI 在出設(shè)計(jì)稿的時(shí)候順便把骨架屏也給畫了😂。
參考:
http://www.dbjr.com.cn/article/166912.htm
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Vue Router的10條高級(jí)技巧總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Vue Router的10條高級(jí)技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Vue實(shí)現(xiàn)數(shù)據(jù)篩選與搜索功能的示例代碼
在許多Web應(yīng)用程序中,數(shù)據(jù)篩選和搜索是關(guān)鍵的用戶體驗(yàn)功能,本文將深入探討在Vue中如何進(jìn)行數(shù)據(jù)篩選與搜索的實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10詳解如何配置vue-cli3.0的vue.config.js
這篇文章主要介紹了詳解如何配置vue-cli3.0的vue.config.js,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Vue實(shí)現(xiàn)todo應(yīng)用的示例
這篇文章主要介紹了Vue實(shí)現(xiàn)todo應(yīng)用的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-02-02Vue3子組件向父組件傳值的兩種實(shí)現(xiàn)方式
近期學(xué)習(xí)vue3的父子組件之間的傳值,發(fā)現(xiàn)跟vue2的并沒有太大的區(qū)別,這篇文章主要給大家介紹了關(guān)于Vue3子組件向父組件傳值的兩種實(shí)現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04Vue中使用定時(shí)器(setInterval、setTimeout)的兩種方式
js中定時(shí)器有兩種,一個(gè)是循環(huán)執(zhí)行?setInterval,另一個(gè)是定時(shí)執(zhí)行?setTimeout,這篇文章主要介紹了Vue中使用定時(shí)器?(setInterval、setTimeout)的兩種方式,需要的朋友可以參考下2023-03-03Element的el-tree控件后臺(tái)數(shù)據(jù)結(jié)構(gòu)的生成以及方法的抽取
這篇文章主要介紹了Element的el-tree控件后臺(tái)數(shù)據(jù)結(jié)構(gòu)的生成以及方法的抽取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Django Vue實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)權(quán)限
本文主要介紹了Django Vue實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)權(quán)限,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06詳解vue中點(diǎn)擊空白處隱藏div的實(shí)現(xiàn)(用指令實(shí)現(xiàn))
本篇文章主要介紹了詳解vue中點(diǎn)擊空白處隱藏div的實(shí)現(xiàn)(用指令實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04