首页 > 其他分享 >browserless 对于延迟加载图片的处理

browserless 对于延迟加载图片的处理

时间:2024-04-18 11:57:08浏览次数:23  
标签:browserless browser const await height viewportHeight 加载 page 延迟

日常中大家为了提高web的性能基于可见区的图片加载基本常见,但是对于基于puppeteer的快照以及pdf生成就不太方便了,以下是一个解决方法,核心是过去内容的高度,基于代码进行滚动,模拟人的操作实现资源的加载

参考实现

const express = require("express");
const puppeteer = require("puppeteer-core");
 
const app = express();
 
const browserWSEndpoint = process.env.ENDPOINT || "ws://localhost:3000";
 
const getBrowser = async () => puppeteer.connect({ browserWSEndpoint });
 
app.get("/image", async (req, res) => {
  let browser = null;
  const website = req.query.website;
  await getBrowser()
    .then(async (browser) => {
      const page = await browser.newPage();
      await page.setViewport({ width: 1280, height: 1024 });
      await page.goto(website, {
        waitUntil: ["load", "networkidle0"],
      });
      const bodyHandle = await page.$("body");
      const { height } = await bodyHandle.boundingBox();
      console.log("height", height);
      await bodyHandle.dispose();
 
      // Scroll one viewport at a time, pausing to let content load
      const viewportHeight = page.viewport().height;
      console.log("viewportHeight", viewportHeight);
      let viewportIncr = 0;
      while (viewportIncr + viewportHeight < height) {
        await page.evaluate((_viewportHeight) => {
          console.log("scrolling", _viewportHeight);
          window.scrollBy(0, _viewportHeight);
        }, viewportHeight);
        await wait(20);
        viewportIncr = viewportIncr + viewportHeight;
      }
 
      // Scroll back to top
      await page.evaluate((_) => {
        window.scrollTo(0, 0);
      });
      await wait(100)
      const screenshot = await page.screenshot({
        fullPage: true,
        captureBeyondViewport: true,
      });
      res.end(screenshot, "binary");
    })
    .catch((error) => {
      if (!res.headersSent) {
        res.status(400).send(error.message);
      }
    })
    .finally(() => browser && browser.close());
});
 
function wait (ms) {
  return new Promise(resolve => setTimeout(() => resolve(), ms));
}
 
app.get("/pdf", async (req, res) => {
  let browser = null;
  const website = req.query.website;
  await getBrowser()
    .then(async (browser) => {
      const page = await browser.newPage();
      await page.setViewport({ width: 1280, height: 1024 });
      await page.goto(website, {
        waitUntil: ["load", "networkidle0"],
      });
      const bodyHandle = await page.$("body");
      const { height } = await bodyHandle.boundingBox();
      console.log("height", height);
      await bodyHandle.dispose();
 
      // Scroll one viewport at a time, pausing to let content load
      const viewportHeight = page.viewport().height;
      console.log("viewportHeight", viewportHeight);
      let viewportIncr = 0;
      while (viewportIncr + viewportHeight < height) {
        await page.evaluate((_viewportHeight) => {
          console.log("scrolling", _viewportHeight);
          window.scrollBy(0, _viewportHeight);
        }, viewportHeight);
        await wait(20);
        viewportIncr = viewportIncr + viewportHeight;
      }
 
      // Scroll back to top
      await page.evaluate((_) => {
        window.scrollTo(0, 0);
      });
      await wait(100);
      const screenshot = await page.pdf({
        displayHeaderFooter: true,
        format: "A4",
        printBackground: true,
      });
      res.end(screenshot, "binary");
    })
    .catch((error) => {
      if (!res.headersSent) {
        res.status(400).send(error.message);
      }
    })
    .finally(() => browser && browser.close());
});
 
app.listen(8080, () => console.log("Listening on PORT: 8080"));

说明

以上是基于滚动,以及延迟处理的,实际可能还需要结合实际调整,不能确保没问题

参考资料

https://wiki.zegnat.net/cache/?md5=f7ce4fd73de0ac41f15ea708b4c8f20f

标签:browserless,browser,const,await,height,viewportHeight,加载,page,延迟
From: https://www.cnblogs.com/rongfengliang/p/18142801

相关文章

  • browserless 屏幕捕捉以及pdf 导出简单试用
    基于browserless以及puppeteer我们可以快速的进行屏幕捕捉生成图片以及导出pdf文件,以下是一个简单的试用环境准备docker-composeversion:"3"services:app:image:browserless/chrome:latestports:-"3000:3000"......
  • browserless 部署无头浏览器到docker中的工具
    browserless部署无头浏览器到docker中的工具包含的特性支持可配置的并行以及请求队列开箱即用的字体支持debug视图支持交互式的puppeteer调试器支持puppeteer以及playwright支持基于websocket以及restapi的请求控制(可以进行pdf生成,图片处理等)简单使用docker......
  • 前端【小程序】04-小程序基础篇【分包加载】
    一、分包加载官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html​分包加载是优化小程序加载速度的一种手段。1.1为什么?​微信平台对小程序单个包的代码体积限制为2M,超过2M的情况下可以采用分包来解决即使小程序代码体积没......
  • 解决加载GPT2(Tensorflow预训练模型)的Linear权重到PyTorch的Linear权重 形状不匹配(互为
    解决报错内容:RuntimeError:Error(s)inloadingstate_dictforPyTorchBasedGPT2:sizemismatchfortransformer.h.0.attn.c_attn.weight:copyingaparamwithshapetorch.Size([768,2304])fromcheckpoint,theshapeincurrentmodelistorch.Size([2304,768]).........
  • 常见问题——VS调试出现:未加载mscorlib.pdb 的页面
    问题:VS在调试程序的时间,出现单独一个报错页面:未加载mscorlib.pdbmscorlib.pdb包含查找模块mscorlib.dll的源文件所需的调试信息解决方法:点击调试=>选项=>调试=>勾选:常规点击启用我的代码=》勾选:启用时若没有用户代码则发出警告(仅限托管)参考:https://www.cnblogs.com/Can-da......
  • JVM性能优化 —— 类加载器,手动实现类的热加载
    一、类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的cl......
  • Visual Studio 工具箱报错:未能加载工具箱项,将从项目中移除(转)
    未能加载工具箱项1篇文章0订阅订阅专栏我是在使用AnyCpu模式下,出现上面的错误,因为我目标平台设置的是X64解决办法:只需要把【项目名称右键->属性->生成->目标平台】设置成AnyCpu,一开始我设置的X64,因为有些第三方Nuget包不允许在X86下运行,所以为了使程序在X64下运行,把目标平台......
  • SSM使用自定义ConditionalOnProperty实现按需加载spring bean
    SSM使用自定义ConditionalOnProperty实现按需加载springbean背景:公司提供的系统框架是SSM架构,SSM架构是没有springboot的ConditionalOnProperty注解的,而我们的系统是在很多区县部署的,每个区县会有一些定制化需求,其中有一个类只在一个区县里用得到,所以打算采用按需加载bean的......
  • 纯前端实现发版版本变化后页面重新加载
    0.原理通过在前端静态文件目录下维护一个版本,首次进入页面存储当前版本,轮询查询静态文件版本是否发生变化,如果变化则重新加载页面,如果未变化,则继续轮询1.优点比通过后端维护在数据库版本进行查询消耗更小,不需要查询数据库,也不用走到后台代码层,只需要访问到ngxin/......
  • video 分片加载
    API使用:MediaSource+SourceBufferhttpRangeseek进度跳转client.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=devic......