如何解决Node js 加速 puppeteer html 到 pdf
我有一个 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()
}
,
是的,没有理由每次都启动浏览器。您可以设置 puppeter 调用新的 url 并获取内容。无需每次启动,速度会更快。
如何实现?将您的功能分为三个步骤:
-
创建一个浏览器实例。不管有没有头。如果你在 X 环境下运行 app,你可以启动一个窗口,看看你的 puppetter 做了什么
-
创建一个函数代码,循环执行主任务。
-
块完成后,调用
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 ()=>{})();
这样的实时异步函数中
- 获取数据
我的情况是,一组 url 在 mongo db 中,得到它后,我运行了一个循环:
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); // 去网址
.... 处理页面数据的代码
你也可以循环加载url,然后放入你的逻辑
希望我给了你一些帮助)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。