【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",



相关文章
|
7月前
|
移动开发 JavaScript 小程序
uView Skeleton 骨架屏
uView Skeleton 骨架屏
151 0
|
JavaScript 前端开发 API
好用的轮子之强大的原生引导js库---Driver.js
好用的轮子之强大的原生引导js库---Driver.js
好用的轮子之强大的原生引导js库---Driver.js
|
编解码 程序员 atlas
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
图集只是当所有给低昂的纹理需要相同的着色器时采用的一种方法,如果一些纹理需要通过着色器应用独立的图形效果,它们就必须分离到自己的材质中,并在单独的组中打图集。
1758 0
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
|
7月前
HBuilderX使用uniapp中的video标签开发视频应用APP,出现视频覆盖<view>图层无法遮住等问题如何解决?
HBuilderX使用uniapp中的video标签开发视频应用APP,出现视频覆盖<view>图层无法遮住等问题如何解决?
|
前端开发 API UED
「前端UI组件」如何实现一个骨架屏组件
用技术实现梦想,用梦想打开前端技术之门。今天分享如何实现一个骨架屏组件。
780 1
「前端UI组件」如何实现一个骨架屏组件
|
iOS开发
iOS - 用Masonry封装的slider,完全支持Masonry的适配
iOS - 用Masonry封装的slider,完全支持Masonry的适配
123 0
|
前端开发 Java 程序员
构建安卓项目通用TitleBar
构建安卓项目通用TitleBar
149 0
|
数据采集 资源调度 JavaScript
【dart-skeleton】自动生成骨架屏项目
【dart-skeleton】自动生成骨架屏项目
396 0
【dart-skeleton】自动生成骨架屏项目
|
JavaScript
【dart-skeleton,脚本篇】自动生成骨架屏项目
【dart-skeleton,脚本篇】自动生成骨架屏项目
247 0
【dart-skeleton,脚本篇】自动生成骨架屏项目
|
Web App开发 缓存 JavaScript
Vue项目骨架屏注入实践
相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代,如今已发展到前后端分离,这种开发方式大大提升了前后端项目的可维护性与开发效率,让前后端工程师关注于自己的主业。然而在带来便利的同时,也带来了一些弊端,比如首屏渲染时间(FCP)因为首屏需要请求更多内容,比原来多了更多HTTP的往返时间(RTT),这造成了白屏,如果白屏时间过长,用户体验会大打折扣,如果用户网速差,则FCP会更长。
Vue项目骨架屏注入实践