我有一个 Node 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
创建移动到实用程序并将其提升以重新使用它。
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()
}
是的,没有理由每次都启动浏览器。您可以设置 Puppeteer 来调用新的 url 并获取内容。不用每次都启动,会更快。
如何实施?将您的功能分为三个步骤:
创建一个浏览器实例。不管无头与否。如果您在 X 环境中运行应用程序,您可以启动一个窗口,看看您的 Puppeteer 做了什么。
创建一个功能代码,它将循环执行主要任务。
块完成后,调用
await page.goto(url)
(其中“page”是browser.newPage()
的实例)并再次运行您的函数。
这是函数式代码的一种可能的解决方案:
const browser = await puppeteer.launch( {'headless' : false });
const page = await browser.newPage();
page.setViewport({'width' : 1280, 'height' : 1024 });
我已将其放入实时异步函数中,例如
(async ()=>{})();
就我而言,Mongo DB 中有一组 URL。拿到它们后,我跑了一个周期:
for( const entrie of entries)
{
const url = entrie[1];
const id = entrie[0];
await get_aplicants_data(page,url,id,collection);
}
get_aplicants_data()
中,我根据加载的页面实现了一个逻辑:await page.goto(url); // Going to url
//.... code to process page data
您也可以循环加载 URL,然后放入您的逻辑。
希望能给你一些帮助。