我终于解决了 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 只有在找到正确路径的配置时才会执行。如果插件看不到配置:

  1. esbuild 从未运行。
  2. Serverless 直接压缩原始源码和 node_modules
  3. 所有 package.patterns 看起来“失效”,因为它们作用在错误的文件结构上。
  4. ZIP 大小始终不变。

修正配置路径即可解决整个打包流程。

经验教训

如果你的 Serverless 包:

  • 体积过大,
  • 忽略了你的排除规则,
  • 持续包含 Prisma 引擎、WASM 或 TypeScript,
  • 或者无论怎么改都没有变化,

首先检查 esbuild: 块是否位于正确的位置(要么在 custom.esbuild 下,要么在顶层)。一行错位的配置就可能导致整个打包过程失效。

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...