在AWS Lambda+Serverless中使用ES Modules遇'require未定义'错误求助
问题解决:AWS Lambda部署ES Modules代码出现require未定义错误
问题根源
部署后生成的s_getStatus.js是Serverless框架自动创建的代理文件,该文件使用了CommonJS的require语法,但你的项目通过package.json的"type": "module"声明为ES Modules环境,二者冲突导致报错。本地serverless-offline直接加载源码运行,不会生成这个代理文件,因此无问题。
解决方案
1. 移除不兼容的插件
serverless-plugin-tracing插件较陈旧,不兼容ES Modules,且AWS Lambda的X-Ray追踪可通过原生配置开启,无需该插件:
- 从
serverless.yml的plugins数组中删除serverless-plugin-tracing - 你已配置
provider.tracing.lambda: true和对应的IAM权限,追踪功能仍会正常工作
2. 使用ES Modules兼容的打包插件
添加serverless-esbuild插件,它原生支持ES Modules打包,替代Serverless默认的打包逻辑:
- 安装依赖:
npm install --save-dev serverless-esbuild - 修改
serverless.yml,添加插件和配置:plugins: - serverless-esbuild custom: esbuild: format: esm # 指定输出为ES Modules格式 target: node18 # 匹配Lambda的nodejs18.x运行时 bundle: true # 打包依赖和代码
3. 优化package.json配置
明确ES模块入口,避免打包歧义:
{ "main": "handler.js", "exports": "./handler.js", // 明确入口文件 "type": "module" }
4. 验证打包结果
执行sls package命令生成打包包,解压后检查var/task目录下的文件,确保代理文件(如果存在)使用ES Modules的import而非CommonJS的require。
内容的提问来源于stack exchange,提问作者MathKimRobin
相关产品推荐
相关产品推荐

