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 并获取内容。不用每次都启动,会更快。
如何实施?将您的功能简化为三个步骤:
创建浏览器实例。不管有没有头。如果你 运行 X 环境下的应用程序,你可以启动一个 window,看看你的木偶做了什么
创建功能代码,循环执行主任务
块完成后,调用 await page.goto(url)
(其中“页面”是 browser.newPage()
的实例)并再次 运行 您的函数。
这是函数样式代码中可能的解决方案之一:
创建一个实例:
const browser = await puppeteer.launch( {'headless' : false });
const page = await browser.newPage();
page.setViewport({'width' : 1280, 'height' : 1024 });
我把它放在像(async ()=>{})();
这样的实时异步函数中
- 获取数据
我的情况是,一组 urls 在 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()中,我根据加载的页面实现了一个逻辑:
等待page.goto(url); // 前往 url
.. 处理页面数据的代码
也可以循环加载url然后放入你的逻辑
希望我给了你一些帮助)
我有一个节点 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 并获取内容。不用每次都启动,会更快。
如何实施?将您的功能简化为三个步骤:
创建浏览器实例。不管有没有头。如果你 运行 X 环境下的应用程序,你可以启动一个 window,看看你的木偶做了什么
创建功能代码,循环执行主任务
块完成后,调用
await page.goto(url)
(其中“页面”是browser.newPage()
的实例)并再次 运行 您的函数。
这是函数样式代码中可能的解决方案之一:
创建一个实例:
const browser = await puppeteer.launch( {'headless' : false }); const page = await browser.newPage(); page.setViewport({'width' : 1280, 'height' : 1024 });
我把它放在像(async ()=>{})();
- 获取数据
我的情况是,一组 urls 在 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()中,我根据加载的页面实现了一个逻辑:
等待page.goto(url); // 前往 url
.. 处理页面数据的代码
也可以循环加载url然后放入你的逻辑
希望我给了你一些帮助)