Node js 加速 puppeteer html 到 pdf

Node js speed up puppeteer html to pdf

我有一个节点 js 应用程序,它创建我希望用户下载的动态内容。

static async downloadPDF(res, html, filename) {
    const puppeteer = require('puppeteer');
    
    const browser = await puppeteer.launch({
        headless: true
    });
    
    const page = await browser.newPage()
    
    await page.setContent(html, {
        waitUntil: 'domcontentloaded'
    })
    
    const pdfBuffer = await page.pdf({
        format: 'A4'
    });
    
    res.set("Content-Disposition", "attachment;filename=" + filename + ".pdf");
    res.setHeader("Content-Type", "application/pdf");
    res.send(pdfBuffer);
    
    await browser.close()
}

创建一个 100kb 大小的 pdf 文件大约需要 10 秒,有没有办法加快整个过程? 我在某处读到我可以启动无头浏览器一次,然后我只会创建一个新页面,而不是每次请求文件时都启动浏览器。 我找不到正确的方法。

您可以将 page 创建移动到一个 util 并提升它以重新使用它。

const puppeteer = require('puppeteer');

let page;

const getPage = async () => {
  if (page) return page;

  const browser = await puppeteer.launch({
    headless: true,
  });

  page = await browser.newPage();

  return page;
};

.

const getPage = require('./getPage');

static async downloadPDF(res, html, filename) {
    const page = await getPage()
}

是的,没有理由每次都启动浏览器。您可以将 puppeter 设置为调用 new url 并获取内容。不用每次都启动,会更快。

如何实施?将您的功能简化为三个步骤:

  1. 创建浏览器实例。不管有没有头。如果你 运行 X 环境下的应用程序,你可以启动一个 window,看看你的木偶做了什么

  2. 创建功能代码,循环执行主任务

  3. 块完成后,调用 await page.goto(url)(其中“页面”是 browser.newPage() 的实例)并再次 运行 您的函数。

这是函数样式代码中可能的解决方案之一:

  1. 创建一个实例:

    const browser = await puppeteer.launch( {'headless' : false }); const page = await browser.newPage(); page.setViewport({'width' : 1280, 'height' : 1024 });

我把它放在像(async ()=>{})();

这样的实时异步函数中
  1. 获取数据

我的情况是,一组 urls 在 mongo db 中,得到它后,我有 运行 个循环 :

for( const entrie of entries)
    {
       const url  = entrie[1];
       const  id = entrie[0];

       await get_aplicants_data(page,url,id,collection);

    }
  1. 在get_aplicants_data()中,我根据加载的页面实现了一个逻辑:

    等待page.goto(url); // 前往 url

.. 处理页面数据的代码

也可以循环加载url然后放入你的逻辑

希望我给了你一些帮助)