我终于解决了 Serverless + esbuild + Prisma 打包噩梦
发布: (2026年1月15日 GMT+8 18:23)
3 min read
原文: Dev.to
Source: Dev.to
问题
几周来,我的 AWS Lambda 包大小始终没有变化,无论我添加或删除多少 package.patterns。ZIP 文件里总是包含大量文件,例如:
@prisma/engines/**
query_engine_bg.*.wasm-base64.js
*.wasm
typescript/**
prisma/**
即使使用空的模式列表:
package:
patterns: []
ZIP 大小仍然保持不变。原来 Serverless 完全忽略了我的配置。
根本原因: esbuild 从未运行
在详细模式下运行打包命令时没有看到任何 esbuild 活动:
npx serverless package --verbose
问题在于我的 esbuild 配置放在了错误的键下:
custom:
something:
esbuild:
bundle: true
serverless‑esbuild 插件只会从以下位置读取配置:
# 选项 A
custom:
esbuild:
bundle: true
# 选项 B(较新写法)
esbuild:
bundle: true
解决办法
我把 esbuild 块移动到正确的顶层位置:
esbuild:
bundle: true
minify: true
target: node20
更改后:
- Serverless 调用了 esbuild 并生成了
.cjs包。 package.patterns开始如预期那样影响 ZIP。- 不需要的文件(WASM、Prisma 引擎、TypeScript)被排除。
- 包大小变得可预测且很小。
为什么会这样
serverless‑esbuild 只有在找到正确路径的配置时才会执行。如果插件看不到配置:
- esbuild 从未运行。
- Serverless 直接压缩原始源码和
node_modules。 - 所有
package.patterns看起来“失效”,因为它们作用在错误的文件结构上。 - ZIP 大小始终不变。
修正配置路径即可解决整个打包流程。
经验教训
如果你的 Serverless 包:
- 体积过大,
- 忽略了你的排除规则,
- 持续包含 Prisma 引擎、WASM 或 TypeScript,
- 或者无论怎么改都没有变化,
首先检查 esbuild: 块是否位于正确的位置(要么在 custom.esbuild 下,要么在顶层)。一行错位的配置就可能导致整个打包过程失效。