函数计算(FC)集成Puppeteer
函数计算(FC)集成Puppeteer实战:Serverless化HTML转图片/PDF
你想在函数计算(FC)中使用Puppeteer实现HTML转图片/PDF的功能——这是典型的Serverless场景(按需执行、弹性扩缩),但FC默认环境缺少Chrome运行依赖,需要针对性适配。下面以阿里云FC(国内最常用)为例,从环境适配、完整代码、配置优化、避坑点全维度讲解,代码可直接部署运行。
一、核心前提:FC中使用Puppeteer的关键问题
函数计算(无论阿里云FC/AWS Lambda/腾讯SCF)的默认运行环境是极简的,而Puppeteer依赖Chrome/Chromium运行时+系统底层库,核心要解决2个问题:
- 依赖缺失:FC环境缺少libatk、libgtk等Chrome依赖库,直接运行会报错;
- 资源限制:Puppeteer启动Chrome需要足够内存(至少512MB)和超时时间;
- 冷启动优化:Chrome启动耗时久,需通过“层/预留实例”降低冷启动延迟。
二、环境适配:安装Puppeteer与系统依赖
1. 选择FC运行时(推荐Node.js)
优先选Node.js 14+/16+运行时(Puppeteer对Node.js兼容性最好),以下以阿里云FC Node.js 16环境为例。
2. 解决系统依赖(核心)
阿里云FC的Linux环境(Alpine/CentOS)缺少Chrome依赖,需通过「自定义层」或「代码包内置依赖」解决,推荐用层(复用性更高):
步骤1:本地构建Chrome依赖层
1 | |
步骤2:上传层到阿里云FC
- 登录阿里云FC控制台 → 「层管理」→ 「创建层」;
- 上传刚打包的
puppeteer-layer.zip,运行时选Node.js 16; - 记录层的ARN,后续函数配置时关联。
补充:极简方案(代码包内置依赖)
若不想创建层,可直接在函数代码目录安装Puppeteer,打包后上传:
1 | |
三、完整实战:阿里云FC中Puppeteer实现HTML转PDF/图片
1. 函数代码编写(index.js)
1 | |
2. FC函数配置(关键)
在阿里云FC控制台配置函数:
| 配置项 | 推荐值 | 原因 |
|---|---|---|
| 运行时 | Node.js 16 | 兼容Puppeteer,稳定性高 |
| 内存 | 1024 MB(最低512MB) | Chrome启动需要足够内存 |
| 超时时间 | 30秒(最低10秒) | 页面渲染+PDF生成需耗时 |
| 层 | 关联之前创建的puppeteer层 | 复用Chrome依赖,减小代码包 |
| 执行角色 | 配置AliyunOSSFullAccess(可选) | 若需上传PDF/图片到OSS |
3. 测试调用(示例请求)
通过FC控制台「测试函数」,传入以下JSON参数:
1 | |
返回结果为base64编码的PDF,前端可通过atob()解码后下载/预览。
四、核心优化:解决FC+Puppeteer的冷启动问题
Puppeteer启动Chrome耗时约1-3秒,FC冷启动时会导致请求延迟高,优化方案:
1. 配置「预留实例」(推荐)
在阿里云FC控制台→函数→「配置」→「弹性配置」→开启预留实例:
- 预留1-2个实例,确保高并发时直接使用预热实例,无冷启动;
- 成本略增加,但响应延迟可降到100ms内。
2. 优化Chrome启动参数
在puppeteer.launch中添加以下参数,减少启动耗时:
1 | |
3. 减小函数包体积
- 仅保留Puppeteer必要依赖,删除
node_modules中无用文件; - 使用
puppeteer-core替代puppeteer,手动指定Chrome路径(需提前在FC环境安装Chrome)。
五、避坑指南:FC+Puppeteer常见问题
1. 报错「No usable sandbox!」
→ 解决方案:启动Chrome时添加--no-sandbox --disable-setuid-sandbox参数(已在代码中配置)。
2. 报错「/dev/shm too small」
→ 解决方案:添加--disable-dev-shm-usage参数,Chrome会使用/tmp而非/dev/shm。
3. 中文乱码/字体缺失
→ 解决方案:
- 在层中添加中文字体(如思源黑体);
- 代码中指定字体路径:
1
2
3
4
5
6await page.emulateMediaType('screen');
await page.addStyleTag({
content: `
body { font-family: 'SimHei', 'Microsoft YaHei', sans-serif !important; }
`
});
4. 内存不足崩溃
→ 解决方案:将FC函数内存调高到1024MB或2048MB,Chrome渲染大页面需要足够内存。
5. 超时错误
→ 解决方案:
- 调高FC函数超时时间(最大支持10分钟);
- 优化页面加载:
waitUntil改为domcontentloaded,减少等待时间。
六、总结
关键点回顾
- 核心适配:FC中使用Puppeteer需解决Chrome系统依赖(通过层/内置依赖),必须添加
--no-sandbox等启动参数; - 配置要求:函数内存≥512MB、超时≥10秒,否则Chrome无法启动/执行超时;
- 冷启动优化:预留实例+精简Chrome启动参数,是降低响应延迟的核心手段;
- 避坑重点:解决沙箱、/dev/shm、字体缺失、内存不足等问题,确保稳定运行。
函数计算+Puppeteer是Serverless化处理HTML转PDF/图片的最佳方案,既能利用FC的弹性扩缩容承接高并发,又能按需计费(无请求时零成本)。如果需要将生成的文件自动上传到OSS,或批量处理URL,可基于上述代码扩展(添加OSS SDK调用逻辑即可)。