gpt4 book ai didi

node.js - NodeJS 与 Express 作为 HTML --> PDF 生成的服务器。能有效率吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:35 26 4
gpt4 key购买 nike

我了解 NodeJS 的事件循环和单线程特性。鉴于此,您认为继续开发一个 NodeJS/Express 服务来将 HTML 部分转换为 PDF 页面是一个好主意吗?

我们正在考虑 Puppeteer。我已经使用过它并且效果很好,但我不确定组织中的每个用户是否都必须等待事件循环,因为每个请求都会使进程保持忙碌直到结束?

最佳答案

事件循环

事件循环负责处理 JavaScript 的“单线程事件驱动”性质,这意味着需要执行的异步 (JavaScript) 代码将被放入队列中并逐个执行(通过循环),而不是使用更经典的多线程方法。有关此主题的更多信息,我推荐 this great video explanation .

事件循环与您的问题并不真正相关,因为大多数工作在浏览器内异步发生(而不是在 Node.js 运行时内)。这意味着您的 puppeteer 脚本大部分时间都会等待浏览器返回结果。

考虑这样一个简单的行:

await browser.newPage();

这实际上是做什么的?它将命令发送到浏览器(在另一个进程中运行)以打开页面。实际工作发生在浏览器内部,而不是在 Node.js 环境中。基本上所有的 puppeteer 操作者功能都是如此。因此,“主要工作”不会发生在 Node.js 环境中,因此事件循环与您的问题无关。

实现

您所描述的内容对于 puppeteer 和 Node.js 来说绝对可行。让我们考虑一下这个示例代码,它应该可以帮助您入门:

const puppeteer = require('puppeteer');
const express = require('express');

const app = express();

app.get('/pdf', async (req, res) => { // Call /pdf?url=... to create a PDF of the provided URL
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(req.query.url); // URL is given by the user
const pdfBuffer = await page.pdf();

// Respond with the PDF
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-Length': pdfBuffer.length
});
res.end(pdfBuffer);

await browser.close();
});

app.listen(4000);

这将提供一个 API 来生成 URL 的 PDF。每个请求都会打开浏览器、打开新页面、导航到给定的 URL 并向用户返回 PDF。由于 JavaScript 的异步环境,这将完全并行发生。只要您的机器可以处理并行打开的浏览器的数量,就可以了。

进一步改进

虽然给定的脚本有效,但您应该记住,由于许多打开的浏览器,太多的请求可能会很快消耗太多的内存/CPU,从而导致资源问题。为了改进实现,您需要使用 puppeteer 资源池来处理流量。为此,您可能需要查看 puppeteer-cluster (免责声明:我是作者)它为您提供浏览器实例池,并允许限制正在运行的浏览器的数量。该库可以轻松处理这个用例。实际上有一个example在线针对这个确切的用例(但是,它生成屏幕截图而不是 PDF)。

关于node.js - NodeJS 与 Express 作为 HTML --> PDF 生成的服务器。能有效率吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com