Vue首頁(yè)加載白屏原因以及10種解決方法匯總
首先說(shuō)一下首頁(yè)加載為什么會(huì)白屏?
先說(shuō)下Spa單頁(yè)面的加載過(guò)程
首先就是html,也就是FP階段
<div id="app"></div>?
頁(yè)面在導(dǎo)航后首次呈現(xiàn)出不同于導(dǎo)航前內(nèi)容的時(shí)間點(diǎn),有一個(gè)東西回來(lái)渲染在頁(yè)面上了
然后是靜態(tài)資源css,js,之后解析js,生成HTML,也就是FCP階段,css,js資源加載下來(lái)了,首次的內(nèi)容繪制,有一個(gè)大結(jié)構(gòu)了
<div id="app"> ? <div class="header"></div> </div>
比如app根目錄里面有一個(gè)header,div
到最后,就是FMP,ajax請(qǐng)求數(shù)據(jù)之后,首次有效繪制,就是頁(yè)面加載差不多了,但是可能圖片還沒(méi)加載出來(lái)
總結(jié):
從FP到FMP這個(gè)過(guò)程全是白屏,可能你的header如果有啥大背景色啊,這個(gè)背景色或許會(huì)出來(lái),ajax之后,才會(huì)真正去解析我們的數(shù)據(jù),把數(shù)據(jù)放入我們的html標(biāo)簽中。
如下圖所示:
得說(shuō)解決首屏加載慢的辦法了,我總結(jié)了10種!
1.預(yù)渲染
預(yù)渲染就是webpack打包時(shí)候渲染,通過(guò)無(wú)頭瀏覽器
無(wú)頭瀏覽器,打包的時(shí)候,可以把你index.html的內(nèi)容放入你這個(gè)瀏覽器,但是你這個(gè)瀏覽器是空白的,然后當(dāng)你進(jìn)入頁(yè)面時(shí)候直接加載這個(gè)index.html,但是沒(méi)ajax請(qǐng)求
獲取到預(yù)渲染的頁(yè)面html內(nèi)容,然后再放入index.html,再到CDN,直接請(qǐng)求html(相當(dāng)于FMP提前到了FP),其實(shí)更像另外一種骨架屏,少了ajax請(qǐng)求
但是由于這樣做我們只能添加死數(shù)據(jù),而不能把a(bǔ)jax請(qǐng)求的數(shù)據(jù)渲染到首頁(yè)上,怎么解決呢?
我們可以在app.vue中
<div id="header"></div>
比如要在這個(gè)header標(biāo)簽里面加ajax請(qǐng)求
直接在script中請(qǐng)求給它添加數(shù)據(jù)即可
document.querySelector('#header').html('...')
2.同構(gòu)
何為同構(gòu)渲染,就是一套代碼多端使用
現(xiàn)在有一些框架,Next,Nuxt,類(lèi)似于渲染就是vue ->json ->vue-server-renderer ->html
3.SSR
服務(wù)端渲染也可以解決首屏加載慢這個(gè)問(wèn)題,因?yàn)榉?wù)端會(huì)把所有數(shù)據(jù)全部渲染完成再返回給客戶(hù)端
ssr =>請(qǐng)求->node->解析 ->吐回給客戶(hù)端(帶請(qǐng)求數(shù)據(jù))
但是有一個(gè)大問(wèn)題,重要的是node層,高并發(fā)的解決
4.路由懶加載
可以通過(guò)plugin-syntax-dynamic-import 這個(gè)插件
Vue.component('async-component',(resolve)=>{ import('./AsyncComponent.js') .then((AsyncComponent)=>{ resolve(AsyncComponent.default) }) })
但是現(xiàn)在好像直接可以通過(guò)箭頭函數(shù)實(shí)現(xiàn)路由懶加載
const app = () =>import('')
5.quicklink
quicklink就是在瀏覽器空閑的時(shí)候去指定需要加載的數(shù)據(jù),這個(gè)是谷歌開(kāi)源的,可以去看看
6.使用Gzip壓縮
減少文件體積,加快首屏頁(yè)面打開(kāi)速度
前提是服務(wù)器那邊得開(kāi)啟gzip
前端需要做的事
npm i compression-webpack-plugin -D
vue.config.js
const CompressionPlugin = require("compression-webpack-plugin") module.exports = { configureWebpack: () => { if (process.env.NODE_ENV === 'production') { return { plugins: [ new CompressionPlugin({ test: /\.js$|\.html$|\.css$|\.jpg$|\.jpeg$|\.png/, // 需要壓縮的文件類(lèi)型 threshold: 10240, // 歸檔需要進(jìn)行壓縮的文件大小最小值,我這個(gè)是10K以上的進(jìn)行壓縮 deleteOriginalAssets: false, // 是否刪除原文件 minRatio: 0.8 }) ] } } } }
7.外鏈CSS,JS文件
很多時(shí)候我們?cè)趍ain.js中直接import一些ui庫(kù)或者css文件啥的,以后可以在index.html,通過(guò)script外鏈引入,這樣就不會(huì)通過(guò)我們的webpack打包
8.webpack entry
這個(gè)就是將單頁(yè)改成多頁(yè)應(yīng)用,比如一些組件中,vue.js vue-router等插件已經(jīng)在某個(gè)頁(yè)面使用了,然后給它緩存起來(lái),下次就無(wú)需加載
9.骨架屏
骨架屏就是在進(jìn)入項(xiàng)目的FP階段,給它來(lái)一個(gè)類(lèi)似輪廓的東西,當(dāng)我們的頁(yè)面加載完成之后就消失,這個(gè)也很好做的,很多ui庫(kù)都有這個(gè)東西,可以參考一下
10.loading
首頁(yè)加一個(gè)loading或許是最原始的方法了,在index.html里加一個(gè)loadingcss效果,當(dāng)頁(yè)面加載完成消失
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue.js 2.0窺探之Virtual DOM到底是什么?
大家可能聽(tīng)說(shuō)Vue.js 2.0已經(jīng)發(fā)布,并且在其中新添加如了一些新功能。其中一個(gè)功能就是“Virtual DOM”。那么下面這篇文章就來(lái)給大家詳細(xì)介紹Vue.js 2.0中的Virtual DOM到底是什么?需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02在vue-cli搭建的項(xiàng)目中增加后臺(tái)mock接口的方法
這篇文章主要介紹了在vue-cli搭建的項(xiàng)目中增加后臺(tái)mock接口的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04vue2結(jié)合echarts實(shí)現(xiàn)一個(gè)地圖的效果
這篇文章主要介紹了vue2結(jié)合echarts實(shí)現(xiàn)一個(gè)地圖的效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家何用vue和echarts實(shí)現(xiàn)一個(gè)地圖有一定的幫助,感興趣的朋友一起看看吧2024-03-03Vue中commit和dispatch區(qū)別及用法辨析(最新)
在Vue中,commit和dispatch是兩個(gè)用于觸發(fā)Vuex store中的mutations和actions的方法,這篇文章主要介紹了Vue中commit和dispatch區(qū)別及其用法辨析,需要的朋友可以參考下2024-06-06element的el-upload組件上傳文件跨域問(wèn)題的幾種解決
跨域問(wèn)題網(wǎng)上搜索很多,感覺(jué)情況都不一樣,本文主要介紹了element的el-upload組件上傳文件跨域問(wèn)題的幾種解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03vue通過(guò)接口直接下載java生成好的Excel表格案例
這篇文章主要介紹了vue通過(guò)接口直接下載java生成好的Excel表格案例2020-10-10一次在vue中使用post進(jìn)行excel表下載的實(shí)戰(zhàn)記錄
最近遇到了需求,覺(jué)著有必要給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于一次在vue中使用post進(jìn)行excel表下載的實(shí)戰(zhàn)記錄,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07