Vercel部署serverless函数使用canvas时ZLIB_1.2.9缺失如何解决
问题核心
Vercel Serverless 运行环境基于 Amazon Linux 2,其官方 yum 源内置的 zlib 最高版本仅为 1.2.7,无法满足新版 node-canvas 依赖的 libpng 对 ZLIB_1.2.9 版本的要求,因此直接通过 yum 安装无法拿到更高版本的zlib。
解决方案
方案1:更换无系统依赖的canvas实现(优先推荐)
直接替换原版node-canvas为@napi-rs/canvas即可,该库基于Rust开发,预先编译了适配所有主流Serverless环境的二进制包,无需任何系统依赖,API和原版node-canvas完全兼容,几乎不用修改业务代码:
- 卸载原版canvas:
npm uninstall canvas - 安装替代包:
npm install @napi-rs/canvas - 业务代码中把所有
require('canvas')替换为require('@napi-rs/canvas'),原有绘图逻辑不需要做任何调整
方案2:手动编译安装zlib 1.2.9(保留原版canvas)
如果必须使用原版node-canvas,可以修改package.json中的vercel-build脚本,手动下载zlib源码编译后替换canvas依赖目录下的库文件:
"scripts": { "vercel-build": "yum install -y libuuid-devel libmount-devel gcc make && \ wget https://zlib.net/zlib-1.2.9.tar.gz && \ tar xzf zlib-1.2.9.tar.gz && \ cd zlib-1.2.9 && \ ./configure --prefix=/tmp/zlib && \ make && make install && \ cd .. && \ cp /tmp/zlib/lib/libz.so.1 node_modules/canvas/build/Release/ && \ cp /lib64/{libuuid,libmount,libblkid}.so.1 node_modules/canvas/build/Release/" }
该方案仅将编译好的高版本zlib供canvas单独使用,不会修改系统全局的zlib版本,不会影响其他系统组件运行。
方案3:使用预构建的Lambda层
可以提前打包包含zlib 1.2.9和完整canvas依赖的AWS Lambda层,在Vercel控制台配置对应函数使用该层即可,该方案适合有Lambda层使用经验的开发者,无需每次构建重复编译依赖。
内容的提问来源于stack exchange,提问作者keegan3d
相关产品推荐
相关产品推荐

