骨架屏是在頁面數據還沒有加載完成前先給用戶展現出頁面的大體結構,直到請求數據返回後再顯示真正的頁面內容;隨着單頁應用( SPA )的愈來愈流行,單頁應用的用戶體驗也愈來愈獲得前端開發者的關注;爲了優化用戶體驗,在數據到達用戶以前,每每會在頁面上加上 loading 的效果,而如今,愈來愈多的場景傾向於使用頁面的骨架替代單一的 loading 效果;javascript
爲何須要自動生成骨架屏?css
常見的方案:前端
a. 前二者的前提都是須要開發者本身編寫骨架屏代碼
b. 餓了麼的作的比較強大了,還有 UI 界面專門調整骨架屏vue
咱們的方案是:用純 DOM 的方式結合 Puppeteer 自動生成網頁骨架屏java
編寫操做 DOM 的 Javascript 腳本node
const createSkeletonHTML = require('DrawPageStructure/evalDOM') createSkeletonHTML({ // ... background: 'red', animation: 'opacity 1s linear infinite;' }).then(skeletonHTML => { console.log(skeletonHTML) }).catch(e => { console.error(e) })
直接在瀏覽器端運行,在控制檯打印當前頁面骨架屏節點,複製添加到應用頁面,可是該方式不夠自動化,咱們該讓骨架屏自動生成並添加到應用頁面react
Puppeteer 是谷歌官方出品的一個能夠控制 headless Chrome 的 Node 庫。能夠經過 Puppeteer 的提供的 api 直接控制 Chrome 模擬大部分用戶操做來進行 UI Test 或者做爲爬蟲訪問頁面來收集數據。
Puppeteer 提供運行環境和導出方式webpack
const evalDOM = require('../evalDOM'); await page.goto(url, {waitUntil: 'networkidle0'}); const skeletonHTML = await page.evaluate.call(page, evalDOM, ...args);
小結git
還有不少細節優化中,歡迎感興趣的小夥伴一塊兒加入!github
詳細代碼和使用方式請移步: https://github.com/famanoder/...
歡迎 star !,歡迎提 PR !