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

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

前言:


承接上篇【dart-skeleton】自动生成骨架屏项目内容,这一篇主要来说一下第二块内容逻辑篇。


我们先抽象一个生成骨架页面的类(GeneratePageStructure):


定义由构造函数传入options选项,且选项的类型使用Ts的interface进行定义。

提供两个函数供使用:公开使用的start方法的主要工作流程:

  1. 建立pb对象(PuppeteerBrowser);
const page = await pb.open(
  this.options.url,
  this.options.emulateOpts,
  this.options.extraHTTPHeaders
);
复制代码
  1. 生成骨架片段html;
const html = await this.generateSkeletonFragment(page);
复制代码
  1. 重写入门Html文件;
rewriteHtml(this.options.output.injectSelector, this.filepath, html);
复制代码
  1. 关闭并退出进程。
await pb.close();
process.exit(0);
复制代码

私有的generateSkeletonFragment函数的主要工作流程:
  1. 整合构造函数传入的选项;
// function
value: `${this.options.includeElement}`
// object
value: JSON.stringify({
  height: this.options.header?.height,
  background: this.options.header?.background,
})
// string
value: value
复制代码
  1. 使用fs读取解析dom的js脚本;
let scriptContent = await fs.readFileSync(
  path.resolve(__dirname, "eval-dom-scripts.js"),
  "utf8"
);
复制代码
  1. 使用addScriptTag注入脚本内容;
await page.addScriptTag({ content: scriptContent });
复制代码
  1. 在evaluate中执行挂载到window上的解析函数。
await page.evaluate((res) => {
  // @ts-ignore
  return window.evalDOMScripts.apply(window, res);
  // @ts-ignore
}, opts)
复制代码


我们还重点操作了一个pb类,这个类的主要功能是对puppeteer库的操作:


  1. 使用launch函数启动获得一个浏览器对象,启动时可以控制是否需要显示浏览器页面,是否需要开启devtools或是否需要延缓执行;
this.browser = await puppeteer.launch({
  headless: !this.isDebug,
  devtools: this.isDebug,
  slowMo: 5,
});
复制代码
  1. 启动后使用newPage函数打开一个新的页面;
const page = await this.browser.newPage();
复制代码
  1. 我们可以根据页面的实际需要决定是否需要设置请求头属性;
await page.setExtraHTTPHeaders(extraHTTPHeaders);
复制代码
  1. 现在可以对浏览器的设备属性进行调整,如是否在是手机中或PC电脑中,屏幕的尺寸信息等等;
emulateOpts = puppeteer.devices["iPhone 6"];
await page.emulate(emulateOpts);
复制代码
  1. 通过goto函数跳转我们的目标url,至此就可以开始解析DOM信息做后续的操作了。
await page.goto(url, {
  timeout: 2 * 60 * 1000,
  waitUntil: "networkidle0",



相关文章
|
缓存 前端开发 JavaScript
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
|
Rust 前端开发 jenkins
Tauri 开发实践 — 使用 CI/CD 自动构建发布 Tauri 桌面端应用
本文介绍如何使用 CI/CD 自动构建发布 Tauri 应用。Tauri 是一个轻量级跨平台客户端框架,适合个人应用。文章首先概述了 CI/CD 的基本流程,并介绍了 GitHub Actions、GitLab CI 和 Jenkins 三种工具。最终选择了 GitHub Actions 进行配置。文中详细展示了使用 GitHub Actions 脚本实现 Tauri 应用构建的过程,并解决了权限和安全问题。项目源码可在 GitHub 上获取。
732 5
Tauri 开发实践 — 使用 CI/CD 自动构建发布 Tauri 桌面端应用
|
9月前
|
JavaScript 数据安全/隐私保护
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常用工具函数,并且持续不断维护更新中。另外,组件库全量使用 TypeScript,支持自动按需引入和 Tree Shaking 等,能够显著提升开发效率,降低开发成本。
546 5
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
|
8月前
|
Linux 数据安全/隐私保护 Windows
文件传输告别龟速!1分钟搞定Windows↔CentOS高速通道 小白也能玩转的Xftp秘籍
Xftp 是一款便捷的远程文件传输工具,与 XShell 类似,支持通过 SFTP 协议实现文件上传和下载。首先需下载安装 Xftp,并获取目标 Linux 系统(如 CentOS)的 IP 地址。打开 Xftp 后,按 `Ctrl + N` 新建会话,输入主机 IP、协议(SFTP)、用户名和密码连接服务器。
491 15
文件传输告别龟速!1分钟搞定Windows↔CentOS高速通道 小白也能玩转的Xftp秘籍
|
移动开发 Android开发 容器
uniapp中使用videojs构建H5直播播放器
【10月更文挑战第14天】这两天在开发H5直播带货功能模块,使用原生的video播放器播放不了m3u8的流地址,于是找了videojs,参考了网上的一些资料研究了一下,感觉还不错,videojs播放m3u8流地址还挺稳定的,下面就简单记录一下uniapp里面使用方式
1468 129
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
470 3
通义千问—7B模型
在交互式问答中,模型对历史信息的记忆能力较弱。例如,在询问“辽宁省会在哪儿”之后,如果不持续提及“沈阳”,模型将无法记住该城市,导致回答变得空泛。
|
人工智能 自然语言处理
【NLP自然语言处理】NLP中的常用预训练AI模型
【NLP自然语言处理】NLP中的常用预训练AI模型
|
IDE 调度 开发工具
鸿蒙Flutter实战:08-如何调试代码
本文介绍了鸿蒙Flutter项目的开发环境搭建、配置、日志查看及调试方法。首先按照指南搭建开发环境,安装IDE插件;接着配置vscode的launch.json文件;通过IDE调试控制台或命令行查看日志;提供两种调试Flutter的方式,包括IDE直接运行和使用DevEco;最后介绍ArkTs和Webview的调试方法。
482 0