【dart-skeleton,脚本篇】自动生成骨架屏项目

简介: 【dart-skeleton,脚本篇】自动生成骨架屏项目

前言:


承接上篇【dart-skeleton】自动生成骨架屏项目内容,这一篇主要来说一下第一块内容脚本篇,也是我们整个项目的关键部分。


解析入口参数:


  1. 下图中的opts数组就是需要传入脚本的内容,参数主要涉及类型三种,通过的string类型,function类型,object类型,这里面将对象类型的数据进行序列化成字符串,将函数类型的数据也转换为字符串进行传递。

1.png

  1. 在接收到数据后进行解析的时候,因为函数已字符串的形式进行传递,我们这块就使用eval进行包装,由于各种编译场景均不太允许直接使用eval函数,所以我们进行了重新赋值的处理,编程了_eval。对象类型进行反序列化为对象,字符串则直接接受即可。

2.png


排除无效/干扰元素:


由于页面各式各样,不合理的布局将会造成解析的结果非常糟糕,我们可以通过指定元素选项来进行过滤,由于页面也会存在一些被隐藏或透明的元素我们也将跳过。


需要隐藏的类型包括:
  1. display属性为none的节点;
  2. visibility属性为hidden的节点;
  3. opacity属性为0的节点。

需要跳过的元素的处理:

我们在入口参数提供了一个includeElement函数,这个函数可以接收一个dom节点和一个绘制函数,当接收到dom节点后通过对选项进行筛选反返回为false即可跳过对应元素。

const isCustomSkip = typeof this.includeElement === "function" && this.includeElement(node, this.drawBlock) == false;
复制代码


绘制关键元素:



说了不需要绘制的元素,那么需要绘制的元素都包括什么呢?如下列举:
  1. 当元素设置了background-image属性时,如果解析到内容包含url地址则需要绘制;
  2. 当遍历到该元素的子元素包含文本类型的节点且节点内容不为空时需要绘制;
  3. 遍历当前的元素为文本类型且节点内容不为空时需要绘制;
  4. 当元素在我们的预设列表中存在时需要绘制。


注:

  1. 以上条件满足一项即需要绘制。
  2. 当我们设置需要绘制头部的时候,如果头部的高度会遮挡一部分元素,那么这部分元素可跳过不绘制。

这里贴出关键的绘制函数:
drawBlock({
    width,
    height,
    top,
    left,
    zIndex = 999,
    background = this.background,
    radius,
    subClas = false,
  }: DrawBlock) {
    const styles = [`height:${height}%`];
    if (!subClas) {
      styles.push(`top:${top}%`, `left:${left}%`, `width:${width}%`);
    }
    if (classProps.zIndex !== zIndex) {
      styles.push(`z-index:${zIndex}`);
    }
    if (classProps.background !== background) {
      styles.push(`background:${background}`);
    }
    radius && radius != "0px" && styles.push(`border-radius:${radius}`);
    this.blocks.push(
      `<div class="_${subClas ? " __" : ""}" style="${styles.join(";")}"></div>`
    );
}
复制代码


预览绘制效果:


这一块相对简单很多,就是一个dom操作将我们处理得到的字符串拆入到目标页面的body节点中:

const { body } = document;
const blocksHTML = this.blocks.join("");
const div = document.createElement("div");
div.innerHTML = blocksHTML;
body.appendChild(div);
复制代码


说明: 此项目是在dps项目的基础上重写的一个Ts版本,目的是学习思路方便后续改造。



相关文章
|
数据采集 运维 Java
有了 Dataphin v4.0,跨系统调度依赖再也不是难题
Dataphin v4.0引入了新的触发式节点,用于解决多数据平台间的调度问题。当上游系统(如Unix的crontab)完成数据采集后,可通过触发式节点通知Dataphin开始拉取数据,避免传统轮询方式的效率低和资源占用。触发式节点需满足Dataphin OpenAPI开通和网络连通条件,并通过SDK进行外部触发。示例展示了如何创建和使用触发式节点,以及使用Java SDK模拟触发请求。
699 0
|
缓存 监控 前端开发
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
|
12月前
|
Rust 前端开发 JavaScript
Wasm在即时通讯IM场景下的Web端应用性能提升初探
简单的来说,Wasm就是使用C/C++/Rust等语言编写的代码,经过编译后得到汇编指令,再通过JavaScript相关API将文件加载到Web容器中(即运行在Web容器中的汇编代码)。Wasm是一种可移植、体积小、加载快速的二进制格式,可以将各种编程语言的代码编译成Wasm模块,这些模块可以在现代浏览器中直接运行。尤其在涉及到GPU或CPU计算时优势相对比较明显。
223 0
|
JavaScript 数据处理
Vuex 的Mutation 和 Action 有什么区别?
【10月更文挑战第15天】Mutation 和 Action 在 Vuex 中都有着重要的作用,它们相互协作,共同实现了 Vuex 状态管理的功能。理解它们的区别与联系,并在实际应用中正确使用,对于构建高效、可靠的 Vue 应用具有重要意义。
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的豆瓣电影数据分析可视化系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的豆瓣电影数据分析可视化系统附带文章源码部署视频讲解等
194 0
|
开发框架 JavaScript 前端开发
WebAssembly:下一代跨平台代码执行环境
WebAssembly(简称Wasm)是一种新型的低级字节码格式,可以在现代Web浏览器上运行,同时也可以在其他平台上运行。它是未来互联网应用程序的重要组成部分。本文将介绍WebAssembly的基础知识、其与JavaScript的关系、以及使用WebAssembly进行高效计算的示例。
|
算法 NoSQL 关系型数据库
九种分布式ID解决方案
在复杂的分布式系统中,往往需要对大量的数据进行唯一标识,比如在对一个订单表进行了分库分表操作,这时候数据库的自增ID显然不能作为某个订单的唯一标识。除此之外还有其他分布式场景对分布式ID的一些要求:
1326 0
|
开发框架 小程序 前端开发
小程序全栈开发中的跨平台解决方案
【4月更文挑战第12天】本文探讨了小程序全栈开发中的跨平台问题,包括前端、后端和数据交互差异,并提出了解决方案:使用跨平台框架(如Taro、uni-app)、设计统一后端接口、创建API适配层以及利用云开发平台。这些方法旨在帮助开发者提高效率,实现一次开发多平台运行。随着技术进步,预计会有更多便捷的跨平台工具出现。
401 0