「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~
前言:
承接上篇【dart-skeleton】自动生成骨架屏项目内容,这一篇主要来说一下第二块内容逻辑篇。
我们先抽象一个生成骨架页面的类(GeneratePageStructure):
定义由构造函数传入options选项,且选项的类型使用Ts的interface进行定义。
提供两个函数供使用:
公开使用的start方法的主要工作流程:
- 建立pb对象(PuppeteerBrowser);
| const page = await pb.open( |
| this.options.url, |
| this.options.emulateOpts, |
| this.options.extraHTTPHeaders |
| ); |
- 生成骨架片段html;
| const html = await this.generateSkeletonFragment(page); |
- 重写入门Html文件;
| rewriteHtml(this.options.output.injectSelector, this.filepath, html); |
- 关闭并退出进程。
| await pb.close(); |
| process.exit(0); |
私有的generateSkeletonFragment函数的主要工作流程:
- 整合构造函数传入的选项;
| |
| value: `${this.options.includeElement}` |
| |
| |
| value: JSON.stringify({ |
| height: this.options.header?.height, |
| background: this.options.header?.background, |
| }) |
| |
| |
| value: value |
- 使用fs读取解析dom的js脚本;
| let scriptContent = await fs.readFileSync( |
| path.resolve(__dirname, "eval-dom-scripts.js"), |
| "utf8" |
| ); |
- 使用addScriptTag注入脚本内容;
| await page.addScriptTag({ content: scriptContent }); |
- 在evaluate中执行挂载到window上的解析函数。
| await page.evaluate((res) => { |
| |
| return window.evalDOMScripts.apply(window, res); |
| |
| }, opts) |
我们还重点操作了一个pb类,这个类的主要功能是对puppeteer库的操作:
- 使用launch函数启动获得一个浏览器对象,启动时可以控制是否需要显示浏览器页面,是否需要开启devtools或是否需要延缓执行;
| this.browser = await puppeteer.launch({ |
| headless: !this.isDebug, |
| devtools: this.isDebug, |
| slowMo: 5, |
| }); |
- 启动后使用newPage函数打开一个新的页面;
| const page = await this.browser.newPage(); |
- 我们可以根据页面的实际需要决定是否需要设置请求头属性;
| await page.setExtraHTTPHeaders(extraHTTPHeaders); |
- 现在可以对浏览器的设备属性进行调整,如是否在是手机中或PC电脑中,屏幕的尺寸信息等等;
| emulateOpts = puppeteer.devices["iPhone 6"]; |
| await page.emulate(emulateOpts); |
- 通过goto函数跳转我们的目标url,至此就可以开始解析DOM信息做后续的操作了。
| await page.goto(url, { |
| timeout: 2 * 60 * 1000, |
| waitUntil: "networkidle0", |
| }); |
说明: 此项目是在dps项目的基础上重写的一个Ts版本,目的是学习思路方便后续改造。
欢迎关注我的公众号“前端小鑫同学”,原创技术文章第一时间推送。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)