我有一个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秒,有没有一种方法可以加快整个过程?我在某处读到,我可以启动无头浏览器一次,然后我将只创建一个新的页面,而不是每次我请求文件时都启动一个浏览器。我找不出做这件事的正确方法。
是的,没有理由每次都启动浏览器。您可以将puppeter设置为调用新的url并获取内容。没有每次发射,会更快。
如何实施?将您的功能简化为三个步骤:
>
创建浏览器实例。不管无头与否。如果您在X环境中运行应用程序,您可以启动一个窗口,以查看您木偶手在做什么
创建一个函数代码,它将在循环中完成主要任务。
block完成后,调用await page.goto(url)
(其中“page”是browser.newpage()
)的实例)并再次运行函数。
这是函数样式代码中可能的解决方案之一:
>
创建实例:
const browser=await Puppeteer.Launch({“headless”:false});常量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);//转到url
....prcess页数据的代码
您还可以循环加载url,然后放入您的逻辑
(希望我给了你一些帮助)
您可以将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()
}
你可以通过执行npm run preview -- --report来分析webpack打包之后的结果,观察各个静态资源的大小。你可以发现占用空间最多的是第三方依赖。如vue、element-ui、 ECharts等。 你可以使用 CDN 外链的方式引入这些第三方库,这样能大大增加构建的速度(通过 CDN 引入的资源不会经 webpack 打包)。如果你的项目没有自己的CDN服务的话,使用一些第三
加速计 jd.startAccelerometer(Object object) 开始监听加速度数据。 参数 Object object 属性 类型 默认值 必填 说明 interval string normal 否 监听加速度数据回调函数的执行频率 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 complete funct
本文向大家介绍用Cython加速Python到“起飞”(推荐),包括了用Cython加速Python到“起飞”(推荐)的使用技巧和注意事项,需要的朋友参考一下 事先声明,标题没有把“Python”错打成“Cython”,因为要讲的就是名为“Cython”的东西。 Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优
问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况相关,通常不适用于Internet的全球受众。要获得使该问题更广泛适用的帮助,请访问帮助中心。 8年前关闭。 PHP有一种非常快速的方法将值附加到数组: 在python中不需要索引号的最简单方法是什么?另外,有没有一种简单的方法可以使用嵌套在字典中的列表来执行此操作,例如此PHP等效项。 问题答案:
在xlsx工作簿中,有些单元格具有一些无界的SUMIF公式,如下所示:。使用ApachePOI5.0.0对一个SUMIF函数的评估持续100ms,对给定工作簿的评估持续几分钟。 提高执行持续时间的一种方法是将公式绑定到如下内容:。在我的情况下,这不是一个解决方案,因为我不是xlsx文件的作者,系统从未知的人那里获取未知的xlsx文件(因此我不能仅仅告诉他们限制SUMIF范围)。 的当前实现迭代给定
Julia有一个非常好的特性,可以访问自己的语法树,这使得以编程方式生成新函数变得很容易,但它比普通的Julia代码慢得多。 例如: 有没有办法给提供与普通Julia代码相同的速度? @Ivarne建议我提供我的项目的细节。我想使用Julia的元编程功能来计算符号导数并运行它们。 我编写了一个函数,它接受and表达式和一个参数,并返回一个新表达式,该表达式是相对于的导数。不幸的是,结果需要太长时间