骨架屏是在页面数据还没有加载完成前先给用户展现出页面的大体结构,直到请求数据返回后再显示真正的页面内容;随着单页应用( SPA )的愈来愈流行,单页应用的用户体验也愈来愈获得前端开发者的关注;为了优化用户体验,在数据到达用户以前,每每会在页面上加上 loading 的效果,而如今,愈来愈多的场景倾向于使用页面的骨架替代单一的 loading 效果;javascript
为何须要自动生成骨架屏?css
常见的方案:前端
a. 前二者的前提都是须要开发者本身编写骨架屏代码vue
b. 饿了么的作的比较强大了,还有 UI 界面专门调整骨架屏java
咱们的方案是:用纯 DOM 的方式结合 Puppeteer 自动生成网页骨架屏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 或者做为爬虫访问页面来收集数据。webpack
Puppeteer 提供运行环境和导出方式git
const evalDOM = require('../evalDOM');
await page.goto(url, {waitUntil: 'networkidle0'});
const skeletonHTML = await page.evaluate.call(page, evalDOM, ...args);
复制代码
小结github
还有不少细节优化中,欢迎感兴趣的小伙伴一块儿加入!
详细代码和使用方式请移步: github.com/famanoder/D…
欢迎 star !,欢迎提 PR !