You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

serverless-bundle打包缺失node_modules导致依赖读目录失败如何解决

问题原因

serverless-bundle 默认启用了依赖打包合并逻辑,会把所有业务代码和依赖代码编译后合并到单个 handler.js 文件中,不会在输出产物中保留完整的 node_modules 目录结构。你用到的某依赖是通过相对路径读取自身包内的 resources 目录文件,当依赖代码被合并到单文件后,原有的依赖目录结构消失,就会触发路径读取失败的报错。

解决方案

方案1:将有问题的依赖设为外部依赖(推荐)

在 serverless.yml 的 custom.bundle 配置中添加 externals 字段,指定不参与合并打包的依赖,插件会自动将该依赖的完整目录保留到输出产物的 node_modules 中。
假设你报错的依赖包名为 xxx,修改配置如下:

custom:
  stage: ${opt:stage, 'offline'}
  region: ${opt:region, 'us-east-1'}
  bundle:
    linting: false
    externals: # 新增配置
      - xxx # 替换为你实际报错的依赖包名
  serverless-offline:
    httpPort: 4000
    noPrependStageInUrl: true

这个方案只会额外打包指定的依赖,产物体积不会有明显增长,兼容性好。

方案2:全量保留node_modules目录

如果有多个依赖存在类似的硬编码路径读取逻辑,可以直接配置所有依赖都不参与合并打包,插件会把完整的 node_modules 目录放入产物:

custom:
  bundle:
    linting: false
    externals: "all"

该方案的缺点是产物体积会明显变大,仅适合依赖较多、逐个配置太繁琐的场景。

方案3:手动复制资源目录

如果可以修改代码中读取资源的路径逻辑,可以配置插件直接复制依赖的资源目录到产物对应路径:

custom:
  bundle:
    linting: false
    copyFiles:
      - from: 'node_modules/xxx/resources/**/*' # 替换为实际依赖的资源路径
        to: './resources/'

修改你代码中读取该资源目录的路径,调整为相对于打包后 handler.js 的路径即可。


内容的提问来源于stack exchange,提问作者Eray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:03