詳解VUE單頁應用骨架屏方案

什么是骨架屏?
簡單的說,骨架屏就是在頁面未渲染完成的時候,先用一些簡單的圖形大致勾勒出頁面的基本輪廓,給用戶造成頁面正在加載的錯覺,待頁面渲染完成之后再用頁面替換掉骨架屏,從而減少頁面白屏的時間,給用戶帶來更好的體驗 。

詳解VUE單頁應用骨架屏方案

分析VUE渲染過程
使用vue-cli3.0創建項目: vue create project
詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

詳解VUE單頁應用骨架屏方案

在生成的項目文件夾下的public文件夾下的index.html文件代碼如下:
詳解VUE單頁應用骨架屏方案

可以看到,DOM里面有一個div#app,當js被執行完成之后,此div#app會被整個替換掉,因此,如何在Vue頁面實現骨架屏,已經有了一個很清晰的思路——在div#app內直接插入骨架屏相關內容即可 。
實現方案
手動在div#app里面寫入骨架屏內容是不科學的,因此需要一個擴展性強且自動化的易維護方案 。既然是在Vue項目里,所以所謂的骨架屏也是一個.vue文件,它能夠在構建時由工具自動注入到div#app里面 。首先,我們在/src目錄下新建一個Skeleton.vue文件,其內容如下:
詳解VUE單頁應用骨架屏方案

接下來,在/src目錄再新建一個skeleton.entry.js入口文件:
詳解VUE單頁應用骨架屏方案

在完成了骨架屏的準備之后 , 我們需要一個關鍵插件vue-server-renderer 。該插件本用于服務端渲染,但是在這里,我們主要利用它能夠把.vue文件處理成html和css字符串的功能 , 來完成骨架屏的注入 。
骨架屏注入
首先在public文件夾下新建一個template.html文件,并且其代碼和index.html文件代碼相同,但是需要在div#app中添加 占位符:
【詳解VUE單頁應用骨架屏方案】
詳解VUE單頁應用骨架屏方案

然后,我們還需要在根目錄新建一個webpack.skeleton.conf.js文件,以專門用來進行骨架屏的構建 。
詳解VUE單頁應用骨架屏方案

可以看到,該配置文件和普通的配置文件基本完全一致,主要的區別在于其target: 'node',配置了externals,以及在plugins里面加入了VueSSRServerPlugin 。在VueSSRServerPlugin中,指定了其輸出的json文件名 。然后通過運行下列指令,在/dist目錄下生成一個skeleton.json文件: webpack --config ./webpack.skeleton.conf.js 接下來,在根目錄下新建一個skeleton.js , 該文件即將被用于往index.html內插入骨架屏:
詳解VUE單頁應用骨架屏方案

接下來,只要運行 node skeleton.js , 就可以完成骨架屏的注入 。為了在 npm run serve 的時候自動完成骨架屏的注入,避免運行多次命令,需要在 package.json 中增加一條命令 "preserve": "webpack --config ./webpack.skeleton.conf.js && node skeleton.js" ,放在 "serve" 命令之前 。
總結
新建template.html文件的目的是為了保存模板文件的干凈,因為每次完成骨架屏的注入后index.html文件中的 占位符已經被骨架屏代碼所替換,再次修改骨架屏后就無法完成骨架屏的注入啦 , 所以在注入骨架屏時先用template.html文件中的內容替換index.html文件,避免了每次修改骨架屏時還要手動修改index.html文件,運行一條命令實現骨架屏的自動注入 。

相關經驗推薦