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
相关产品推荐
相关产品推荐

