AWS Lambda出现ImportModuleError:找不到'./json.js'模块问题求助
问题原因
这个Runtime.ImportModuleError报错是因为 esbuild 静态打包时没有将动态引入的./json.js文件包含到最终产物中,Lambda运行时找不到对应文件触发报错。
你修改resolver新增了调用外部服务的逻辑,引入了带有动态require相对路径文件逻辑的依赖(比如部分HTTP请求库、序列化工具或者间接依赖的graphql相关包),esbuild做静态依赖分析时无法识别运行时才能确定的路径,因此不会主动把对应的json.js打包到bundle里,才会出现修改代码后突然报错的情况。
排查步骤
- 先在本地构建生成的
out/index.js文件中搜索require('./json.js')这段代码,定位这段代码来源于哪个第三方依赖包 - 本地执行
node out/index.js验证是否能复现同样的报错,不用部署到Lambda就能快速验证修复效果
可行解决方案
- 方案一:将触发动态require的依赖标记为外置
在你的esbuild构建命令中添加--external:xxx参数(xxx为你定位到的依赖包名),告诉esbuild不要将这个包打包进最终产物,部署时将对应依赖的node_modules目录和打包后的index.js一起上传到Lambda即可。 - 方案二:手动补全缺失文件
如果确认缺失的./json.js是固定文件,可以在构建脚本中增加复制逻辑,构建完成后将对应文件复制到out目录下和index.js同级,部署时一起上传。 - 方案三:调整esbuild配置兼容动态引入
可以升级esbuild到最新稳定版,也可以尝试在构建命令中添加--preserve-symlinks --keep-names参数,优化esbuild对动态引入的处理逻辑。另外你当前定义的是NODE_ENV=dev,如果是生产部署可以切换为production,避免部分依赖在开发环境加载额外的动态调试文件。
内容的提问来源于stack exchange,提问作者Igor Belikov
相关产品推荐
相关产品推荐

