溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

淺談Vue項(xiàng)目骨架屏注入實(shí)踐

發(fā)布時(shí)間:2020-10-16 07:33:36 來(lái)源:腳本之家 閱讀:159 作者:SHERlocked93 欄目:web開發(fā)

相比于早些年前后端代碼緊密耦合、后端工程師還得寫前端代碼的時(shí)代,如今已發(fā)展到前后端分離,這種開發(fā)方式大大提升了前后端項(xiàng)目的可維護(hù)性與開發(fā)效率,讓前后端工程師關(guān)注于自己的主業(yè)。然而在帶來(lái)便利的同時(shí),也帶來(lái)了一些弊端,比如首屏渲染時(shí)間(FCP)因?yàn)槭灼列枰?qǐng)求更多內(nèi)容,比原來(lái)多了更多HTTP的往返時(shí)間(RTT),這造成了白屏,如果白屏?xí)r間過(guò)長(zhǎng),用戶體驗(yàn)會(huì)大打折扣,如果用戶網(wǎng)速差,則FCP會(huì)更長(zhǎng)。

由此引申出一系列的優(yōu)化方法,骨架屏也因此被提出。

1. FCP優(yōu)化

在 Google 提出的以用戶為中心的四個(gè)頁(yè)面性能衡量指標(biāo)中,F(xiàn)P/FCP可能是開發(fā)者們最熟悉的了:

淺談Vue項(xiàng)目骨架屏注入實(shí)踐

為了優(yōu)化首屏渲染時(shí)間這個(gè)指標(biāo),減少白屏?xí)r間,前端仔們想了很多辦法:

加速或減少HTTP請(qǐng)求損耗 :使用CDN加載公用庫(kù),使用強(qiáng)緩存和協(xié)商緩存,使用域名收斂,小圖片使用Base64代替,使用Get請(qǐng)求代替Post請(qǐng)求,設(shè)置 Access-Control-Max-Age 減少預(yù)檢請(qǐng)求,頁(yè)面內(nèi)跳轉(zhuǎn)其他域名或請(qǐng)求其他域名的資源時(shí)使用瀏覽器prefetch預(yù)解析等;

延遲加載 :非重要的庫(kù)、非首屏圖片延遲加載,SPA的組件懶加載等;

減少請(qǐng)求內(nèi)容的體積 :開啟服務(wù)器Gzip壓縮,JS、CSS文件壓縮合并,減少cookies大小,SSR直接輸出渲染后的HTML等;

瀏覽器渲染原理 :優(yōu)化關(guān)鍵渲染路徑,盡可能減少阻塞渲染的JS、CSS;

 優(yōu)化用戶等待體驗(yàn) :白屏使用加載進(jìn)度條、菊花圖、骨架屏代替等;

這里要介紹的就是優(yōu)化用戶等待體驗(yàn)的骨架屏,它可以被視為是原來(lái)加載菊花圖的一種升級(jí)版,結(jié)合傳統(tǒng)的首屏優(yōu)化方法對(duì)應(yīng)用進(jìn)行優(yōu)化可以達(dá)到不錯(cuò)的效果。

2. 骨架屏

骨架屏可以理解為是 當(dāng)數(shù)據(jù)還未加載進(jìn)來(lái)前,頁(yè)面的一個(gè)空白版本 ,一個(gè)簡(jiǎn)單的關(guān)鍵渲染路徑??梢钥匆幌孪旅鍲acebook的骨架屏實(shí)現(xiàn),可以看到在頁(yè)面完全渲染完成之前,用戶會(huì)看到一個(gè)樣式簡(jiǎn)單,描繪了當(dāng)前頁(yè)面的大致框架的骨架屏頁(yè)面,然后骨架屏中各個(gè)占位部分被實(shí)際資源完全替換,這個(gè)過(guò)程中用戶會(huì)覺得內(nèi)容正在逐漸加載即將呈現(xiàn),降低了用戶的焦躁情緒,使得加載過(guò)程主觀上變得流暢。

淺談Vue項(xiàng)目骨架屏注入實(shí)踐

可以看一下下面的示例圖,第一個(gè)為骨架屏,第二個(gè)為菊花圖,第三個(gè)為無(wú)優(yōu)化,可以看到相比于傳統(tǒng)的菊花圖會(huì)在感官上覺得內(nèi)容出現(xiàn)的流暢而不突兀,體驗(yàn)更加優(yōu)良。

淺談Vue項(xiàng)目骨架屏注入實(shí)踐

如今這項(xiàng)技術(shù)已經(jīng)在Facebook、Google、支付寶、餓了么、簡(jiǎn)書、新浪微博、知乎、美團(tuán)、領(lǐng)英等公司的產(chǎn)品中被廣泛的使用。在論壇和社區(qū)也都有不少文章討論骨架屏的實(shí)現(xiàn)和使用場(chǎng)景等。

3. 生成骨架屏的方法

生成骨架屏的方式主要有:

手寫HTML、CSS的方式為目標(biāo)頁(yè)定制骨架屏 做法可以參考 <Vue頁(yè)面骨架屏注入實(shí)踐> ,主要思路就是使用vue-server-renderer 這個(gè)本來(lái)用于服務(wù)端渲染的插件,用來(lái)把我們寫的 .vue 文件處理為 HTML ,插入到頁(yè)面模板的掛載點(diǎn)中,完成骨架屏的注入。這種方式不甚文明,如果頁(yè)面樣式改變了,還得改一遍骨架屏,增加了維護(hù)成本。 骨架屏的樣式實(shí)現(xiàn)參考CodePen

使用圖片作為骨架屏; 簡(jiǎn)單暴力,讓UI同學(xué)花點(diǎn)功夫吧哈哈;小米商城的移動(dòng)端頁(yè)面采用的就是這個(gè)方法,它是使用了一個(gè)Base64的圖片來(lái)作為骨架屏。

自動(dòng)生成并自動(dòng)插入靜態(tài)骨架屏 這種方法跟第一種方法類似,不過(guò)是自動(dòng)生成骨架屏,可以關(guān)注下餓了么開源的插件page-skeleton-webpack-plugin ,它根據(jù)項(xiàng)目中不同的路由頁(yè)面生成相應(yīng)的骨架屏頁(yè)面,并將骨架屏頁(yè)面通過(guò) webpack 打包到對(duì)應(yīng)的靜態(tài)路由頁(yè)面中,不過(guò)要注意的是這個(gè)插件目前只支持history方式的路由,不支持hash方式,且目前只支持首頁(yè)的骨架屏,并沒(méi)有組件級(jí)的局部骨架屏實(shí)現(xiàn),作者說(shuō)以后會(huì)有計(jì)劃實(shí)現(xiàn) (issue9) 。

另外還有個(gè)插件 vue-skeleton-webpack-plugin ,它將插入骨架屏的方式由手動(dòng)改為自動(dòng),原理在構(gòu)建時(shí)使用 Vue 預(yù)渲染功能,將骨架屏組件的渲染結(jié)果 HTML 片段插入 HTML 頁(yè)面模版的掛載點(diǎn)中,將樣式內(nèi)聯(lián)到 head 標(biāo)簽中。這個(gè)插件可以給單頁(yè)面的不同路由設(shè)置不同的骨架屏,也可以給多頁(yè)面設(shè)置,同時(shí)為了開發(fā)時(shí)調(diào)試方便,會(huì)將骨架屏作為路由寫入router中,可謂是相當(dāng)體貼了。

vue-skeleton-webpack-plugin 的具體使用參考vue-style-codebase ,主要關(guān)注build目錄的幾個(gè)文件,線上Demo 在Chrome的DevTools中把network的網(wǎng)速調(diào)為 Gast 3G / Slow 3G 就能看到效果了~

網(wǎng)上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學(xué)習(xí)過(guò)程中的總結(jié),如果發(fā)現(xiàn)錯(cuò)誤,歡迎留言指出~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

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

AI