在Vercel部署Flask REST API遇Serverless函数超50MB限制求解决方案
解决Vercel部署Flask REST API时Serverless函数体积超限的方法
针对你遇到的Serverless函数体积超过50MB限制的问题,以下是几种可行的解决方案:
1. 清理与替换重体积依赖
- 移除未使用的依赖:检查
requirements.txt中的包,确认是否有代码中未实际用到的依赖(例如若某些蓝图未用到nlpcloud或PyDrive2,可暂时注释或移除)。 - 替换轻量替代包:部分依赖体积较大,可考虑用轻量方案替代:
- 若使用
PyDrive2仅为简单操作Google Drive,可改用requests直接调用Google Drive REST API,省去PyDrive2及其附带的大量依赖。 - 检查
supabase等依赖的版本,升级到最新版可能会优化依赖结构,减小整体体积。
- 若使用
2. 拆分Serverless函数,按功能隔离
当前所有业务逻辑都打包在一个函数中,导致依赖全部被加载。可将不同蓝图拆分为独立的Vercel函数,每个函数仅加载自身所需依赖:
- 将各蓝图代码拆分到单独文件(如
database.py、model.py、workspace.py),每个文件只导入对应功能的依赖。 - 修改
vercel.json配置,为每个函数单独构建:
{ "version": 2, "builds": [ { "src": "./index.py", "use": "@vercel/python" }, { "src": "./database.py", "use": "@vercel/python" }, { "src": "./model.py", "use": "@vercel/python" }, { "src": "./workspace.py", "use": "@vercel/python" } ], "routes": [ { "src": "/(.*)", "dest": "/index.py" }, { "src": "/database/(.*)", "dest": "/database.py" }, { "src": "/model/(.*)", "dest": "/model.py" }, { "src": "/workspace/(.*)", "dest": "/workspace.py" } ] }
拆分后每个函数的体积会大幅降低,因为仅包含自身业务代码和必要依赖。
3. 优化构建过程,排除冗余文件
- 创建
.vercelignore文件:在项目根目录添加该文件,排除无需打包的文件和目录:
venv/ __pycache__/ *.pyc *.pyo tests/ docs/ .git/
- 调整依赖安装命令:在
vercel.json中指定使用无缓存的安装方式,避免缓存文件被打包:
{ "version": 2, "builds": [ { "src": "./index.py", "use": "@vercel/python", "config": { "installCommand": "pip install --no-cache-dir --upgrade pip && pip install --no-cache-dir -r requirements.txt" } } ], "routes": [ { "src": "/(.*)", "dest": "/" } ] }
4. 使用Vercel层分离公共依赖
将多个函数共享的依赖(如Flask、Flask_Cors等)打包成Vercel层,避免每个函数重复打包相同依赖:
- 创建层目录(如
layers/python),在该目录下执行pip install -r requirements.txt -t python/lib/python3.x/site-packages(替换3.x为你的Python版本)。 - 在
vercel.json中为每个函数指定层路径:
{ "version": 2, "builds": [ { "src": "./index.py", "use": "@vercel/python", "config": { "layers": ["./layers/python"] } } ] }
层的体积不计入单个函数的体积限制,能有效降低每个函数的打包大小。
内容的提问来源于stack exchange,提问作者Chubbyman
相关产品推荐
相关产品推荐

