用纯 DOM 的方式结合 Puppeteer 自动生成网页骨架屏

2018-10-11 20:03:25 +08:00
 famanoder

  骨架屏是在页面数据尚未加载完成前先给用户展示出页面的大致结构,直到请求数据返回后再显示真正的页面内容;随着单页应用( SPA )的越来越流行,单页应用的用户体验也越来越得到前端开发者的关注;为了优化用户体验,在数据到达用户之前,往往会在页面上加上 loading 的效果,而现在,越来越多的场景倾向于使用页面的骨架替代单一的 loading 效果;

为什么需要自动生成骨架屏?

  1. 提高效率,节约单独编写骨架屏代码的时间
  2. 替换原来单一的 loading 图片效果
  3. 可以优化用户体验,在页面数据尚未加载完成前先给用户展示出页面的大致结构,配合动画效果,给用户一种平滑切换的感觉

常见的方案:

  1. 手动编写骨架屏代码
  2. 通过预渲染手动书写的代码生成相应的骨架屏 比如:vue-skeleton-webpack-plugin
  3. 饿了么内部的生成骨架页面的工具 page-skeleton-webpack-plugin
  4. ..

a. 前两者的前提都是需要开发者自己编写骨架屏代码

b. 饿了么的做的比较强大了,还有 UI 界面专门调整骨架屏

我们的方案是:用纯 DOM 的方式结合 Puppeteer 自动生成网页骨架屏

    const createSkeletonHTML = require('DrawPageStructure/evalDOM')

    createSkeletonHTML({
        // ...
        background: 'red',
        animation: 'opacity 1s linear infinite;'
    }).then(skeletonHTML => {
        console.log(skeletonHTML)
    }).catch(e => {
        console.error(e)
    })

  直接在浏览器端运行,在控制台打印当前页面骨架屏节点,复制添加到应用页面,但是该方式不够自动化,我们该让骨架屏自动生成并添加到应用页面

Puppeteer 是谷歌官方出品的一个可以控制 headless Chrome 的 Node 库。可以通过 Puppeteer 的提供的 api 直接控制 Chrome 模拟大部分用户操作来进行 UI Test 或者作为爬虫访问页面来收集数据。

Puppeteer 提供运行环境和导出方式

  1. 使用 puppeteer 运行需要生成骨架屏的页面
  2. 将之前编写的 Javascript 脚本通过 puppeteer 提前注入到该页面,这样即可运行该脚本,并生成骨架屏所需的 DOM 节点
  3. 将自动生成的骨架屏 DOM 片段插入到应用页面的入口节点
const evalDOM = require('../evalDOM');

await page.goto(url, {waitUntil: 'networkidle0'});
const skeletonHTML = await page.evaluate.call(page, evalDOM, ...args);

小结

  1. 核心在于 DOM 操作,puppeteer 仅提供运行环境和导出方式
  2. 只要能访问的页面都能生成,history 与 hash 模式无限制
  3. 不受项目和框架的限制,vue 和 react 等项目零修改即可复用
  4. 生成色块的单位为百分比,不同设备自适应
  5. 不需要 css-tree 来提取样式,不依赖页面本身的布局结构,生成扁平的 DOM 节点体积特别小
  6. 支持自定义生成方式与导出方式

还有很多细节优化中,欢迎感兴趣的小伙伴一起加入!

详细代码和使用方式请移步: https://github.com/famanoder/DrawPageStructure

欢迎 star !,欢迎提 PR !

1587 次点击
所在节点    问与答
1 条回复
horizon
2018-10-11 20:22:59 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/496830

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX