vue-cli3 配置骨架屏方案

vue-cli3配置骨架屏方案

前言

最近在學(xué)vue,準(zhǔn)備使用vue寫一個(gè)移動(dòng)端項(xiàng)目⊙欤考慮到首頁(yè)白屏優(yōu)化,需要實(shí)現(xiàn)骨架屏需求抬旺。

步驟

  • 安裝vue-skeleton-webpack-plugin插件
npm install --save-dev vue-skeleton-webpack-plugin
  • vue.config.js配置
const path = require('path')
const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');

module.exports = {
    css: {
         extract: true, // css拆分ExtractTextPlugin插件祥楣,默認(rèn)true - 骨架屏需要為true
    },
    
    configureWebpack: (config)=>{
        // vue骨架屏插件配置
        config.plugins.push(new SkeletonWebpackPlugin({
          webpackConfig: {
            entry: {
              app: path.join(__dirname, './src/utils/skeleton.js'),
            },
          },
          minimize: true,
          quiet: true,
        }))
  },
}
  • 新建一個(gè)skeleton.js文件放在src->utils文件夾下面、
import Vue from 'vue';
import Skeleton from '../components/Skeleton/skeleton-2';

export default new Vue({
  components: {
    Skeleton,
  },
  render: h => h(Skeleton),
});

這個(gè)文件是用來注入骨架屏的
  • 新建一個(gè)skeleton-2.vue骨架屏組件
<template>
  <div class="skeleton page">
    <div class="skeleton-nav"></div>
    <div class="skeleton-swiper"></div>
    <ul class="skeleton-tabs">
      <li v-for="i in 8" class="skeleton-tabs-item"><span></span></li>
    </ul>
    <div class="skeleton-banner"></div>
    <div v-for="i in 6" class="skeleton-productions"></div>
  </div>
</template>

<style>
  .skeleton {
    position: relative;
    height: 100%;
    overflow: hidden;
    padding: 15px;
    box-sizing: border-box;
    background: #fff;
  }
  .skeleton-nav {
    height: 45px;
    background: #eee;
    margin-bottom: 15px;
  }
  .skeleton-swiper {
    height: 160px;
    background: #eee;
    margin-bottom: 15px;
  }
  .skeleton-tabs {
    list-style: none;
    padding: 0;
    margin: 0 -15px;
    display: flex;
    flex-wrap: wrap;
  }
  .skeleton-tabs-item {
    width: 25%;
    height: 55px;
    box-sizing: border-box;
    text-align: center;
    margin-bottom: 15px;
  }
  .skeleton-tabs-item span {
    display: inline-block;
    width: 55px;
    height: 55px;
    border-radius: 55px;
    background: #eee;
  }
  .skeleton-banner {
    height: 60px;
    background: #eee;
    margin-bottom: 15px;
  }
  .skeleton-productions {
    height: 20px;
    margin-bottom: 15px;
    background: #eee;
  }

  .skeleton {
    padding: 10px;
  }

  .skeleton .skeleton-head,
  .skeleton .skeleton-title,
  .skeleton .skeleton-content {
    background: rgb(194, 207, 214);
  }

  .skeleton-head {
    width: 100px;
    height: 100px;
    float: left;
  }

  .skeleton-body {
    margin-left: 110px;
  }

  .skeleton-title {
    width: 500px;
    height: 60px;
    transform-origin: left;
    animation: skeleton-stretch .5s linear infinite alternate;
  }

  .skeleton-content {
    width: 260px;
    height: 30px;
    margin-top: 10px;
    transform-origin: left;
    animation: skeleton-stretch .5s -.3s linear infinite alternate;
  }

  @keyframes skeleton-stretch {
    from {
      transform: scalex(1);
    }
    to {
      transform: scalex(.3);
    }
  }
</style>

  • 新建一個(gè)skeleton-1.vue骨架屏組件
<template>
  <div class="skeleton">
    <div class="skeleton-head"></div>
    <div class="skeleton-body">
      <div class="skeleton-title"></div>
      <div class="skeleton-content"></div>
    </div>
  </div>
</template>

<style>
.skeleton {
  padding: 10px;
}

.skeleton .skeleton-head,
.skeleton .skeleton-title,
.skeleton .skeleton-content {
  background: rgb(194, 207, 214);
}

.skeleton-head {
  width: 100px;
  height: 100px;
  float: left;
}

.skeleton-body {
  margin-left: 110px;
}

.skeleton-title {
  width: 500px;
  height: 60px;
  transform-origin: left;
  animation: skeleton-stretch 0.5s linear infinite alternate;
}

.skeleton-content {
  width: 260px;
  height: 30px;
  margin-top: 10px;
  transform-origin: left;
  animation: skeleton-stretch 0.5s -0.3s linear infinite alternate;
}

@keyframes skeleton-stretch {
  from {
    transform: scalex(1);
  }
  to {
    transform: scalex(0.3);
  }
}
</style>
  • 修改main.js配置
const app = new Vue({
  store,
  router,
  render: h => h(App)
}).$mount('#app')
  • 重啟項(xiàng)目

思路

  • 將骨架屏也看成路由組件,在構(gòu)建時(shí)使用 Vue 預(yù)渲染功能历葛,將骨架屏組件的渲染結(jié)果 HTML 片段插入 HTML 頁(yè)面模版的掛載點(diǎn)中嘀略,將樣式內(nèi)聯(lián)到 head 標(biāo)簽中。這樣等前端渲染完成時(shí)屎鳍,Vue 將使用客戶端混合问裕,把掛載點(diǎn)中的骨架屏內(nèi)容替換成真正的頁(yè)面內(nèi)容。

缺點(diǎn)

  • 這種方案實(shí)現(xiàn)的是固定死的骨架(可以查看skeleton-2.vue skeleton-1.vue)兩個(gè)文件粮宛,不能夠自動(dòng)根據(jù)頁(yè)面DOM結(jié)構(gòu)生成骨架

優(yōu)化的方向

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巍杈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筷畦,更是在濱河造成了極大的恐慌刺洒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆航,死亡現(xiàn)場(chǎng)離奇詭異渔肩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)周偎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門蓉坎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袍嬉,你說我怎么就攤上這事∷磐ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵吴藻,是天一觀的道長(zhǎng)弓柱。 經(jīng)常有香客問我,道長(zhǎng)矢空,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任粥血,我火速辦了婚禮酿箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缭嫡。我一直安慰自己,他們只是感情好妇蛀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著有勾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔼卡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天荤懂,我揣著相機(jī)與錄音塘砸,去河邊找鬼。 笑死掉蔬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箭启。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傅寡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼北救!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珍策,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤攘宙,失蹤者是張志新(化名)和其女友劉穎屯耸,沒想到半個(gè)月后模聋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唠亚,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年祟蚀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前酿。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罢维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肺孵,到底是詐尸還是另有隱情,我是刑警寧澤平窘,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站是鬼,受9級(jí)特大地震影響紫新,放射性物質(zhì)發(fā)生泄漏均蜜。R本人自食惡果不足惜弊琴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紫皇。 院中可真熱鬧腋寨,春花似錦聪铺、人聲如沸萄窜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至普气,卻和暖如春佃延,著一層夾襖步出監(jiān)牢的瞬間现诀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工坐桩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留封锉,地道東北人绵跷。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓抖坪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親擦俐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子握侧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 為了前端體驗(yàn)更加友好,減緩用戶的焦慮情緒埋合,提升項(xiàng)目質(zhì)量等,我們?cè)陧?xiàng)目里面可以使用骨架屏甚颂,提前渲染出來一個(gè)跟正...
    Yinzhishan閱讀 13,666評(píng)論 12 19
  • Vue項(xiàng)目骨架屏注入實(shí)踐 相比于早些年前后端代碼緊密耦合秀菱、后端工程師還得寫前端代碼的時(shí)代,如今已發(fā)展到前后端分離衍菱,...
    萱萱暮雨閱讀 1,764評(píng)論 0 6
  • 在實(shí)現(xiàn) egg + vue 服務(wù)端渲染工程化實(shí)現(xiàn)之前,我們先來看看前面兩篇關(guān)于Webpack構(gòu)建和Egg的文章: ...
    hubcarl閱讀 6,016評(píng)論 0 19
  • 1.概要 隨著越來越多的項(xiàng)目采用 Vue, React, Weex 進(jìn)行業(yè)務(wù)開發(fā), 在前端構(gòu)建方面大多數(shù)是用web...
    hubcarl閱讀 6,316評(píng)論 3 18
  • 懶加載 為什么需要懶加載辫呻? 像vue這種單頁(yè)面應(yīng)用琼锋,如果沒有應(yīng)用懶加載,運(yùn)用webpack打包后的文件將會(huì)異常的大...
    littlesiqi閱讀 16,246評(píng)論 1 8