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

Serverless部署AppSync时node_modules存在仍报模块未找到

问题根因
  • 错误栈已经直接指向核心矛盾:@coin-miles/some-service 构建后输出到dist目录的JS文件,仍保留了对@coin-miles/common-service/src/models的源码级路径引用,但部署包内的路径结构和本地开发环境不一致,运行时找不到对应文件。
  • 本地开发时Yarn Workspace会通过软链把node_modules下的内部包直接指向各包的本地源码根目录,src目录天然存在,所以这类路径引用不会报错。但部署打包时,你用的几个Serverless插件处理Lerna软链依赖时,要么只拷贝了内部包的dist目录漏了src,要么没有转译构建后产物里的源码路径,哪怕包文件夹存在,路径指向的文件不存在就会抛MODULE_NOT_FOUND。
  • 你之前尝试的「给每个依赖包重装依赖、重新构建」没有解决问题,本质是没触达核心:构建工具默认只会转译TS/JS语法,不会主动修改跨包引用的路径,只要dist产物里还留着/src/的引用,打包时目录结构不对就一定会报错。
解决方案

按优先级选可落地的方案即可:

方案1(推荐,长期可维护)

统一修正内部包的引用规则,从根源避免源码路径泄漏:

  • 所有跨包引用禁止直接写@包名/src/xxx的深层路径,统一从包根路径引入,比如把require('@coin-miles/common-service/src/models')改成const { SomeModel } = require('@coin-miles/common-service')
  • 在每个内部包的入口文件(对应package.json里main字段指向的dist文件)里统一导出需要对外暴露的方法、类、模型
  • 替换现有兼容性差的打包插件组合,移除serverless-plugin-monorepo、serverless-plugin-common-excludes、serverless-plugin-include-dependencies,改用serverless-esbuild直接把业务代码和所有内部依赖打包成单文件,自动处理所有路径解析,不需要额外处理软链问题,最小配置参考:
plugins:
  - serverless-esbuild
custom:
  esbuild:
    bundle: true
    platform: node
    target: node18 # 替换成你Lambda运行时实际用的Node版本
    sourcemap: true
    minify: false

方案2(临时快速修复,不推荐长期用)

如果暂时不想改存量的引用路径:

  • 给所有内部包的构建流程加路径转译步骤,TS项目可以搭配tsc-alias在tsc构建完成后,自动把dist产物里的/src/跨包引用替换成对应dist/的正确路径
  • 修改Serverless的打包规则,强制把所有内部依赖包的src目录加入打包包含列表,同时检查每个内部包package.json的files字段,确保src目录在打包拷贝的范围内,不会被插件默认过滤掉。

验证步骤

不管用哪个方案,打包后不要直接在本地源码目录跑node dist/lambda.js验证:

  • 执行sls package后,解压.serverless目录下生成的部署ZIP包到单独文件夹
  • 在解压后的目录里执行node dist/lambda.js,复现Lambda运行时的真实目录结构,确认不报错后再部署到AWS。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:06:18