使用Esbuild部署Serverless TypeScript至AWS Lambda时文件扩展名适配问题
解决Serverless+esbuild生成.js而非.mjs的问题
问题原因
你配置了outExtension但未生效,大概率是因为缺少明确的entryPoints配置,或者serverless-esbuild插件版本过旧,导致esbuild没有正确应用扩展名替换规则。另外,Lambda要求ESM格式的函数必须使用.mjs扩展名,同时函数的handler配置也需要对应更新。
解决方案
1. 更新serverless-esbuild插件
确保使用最新版本的插件,避免旧版本的兼容性问题:
npm install serverless-esbuild@latest --save-dev
2. 修改serverless.yml配置
完善esbuild配置,添加entryPoints
明确指定你的源入口文件(比如handler.ts或handler.js),让esbuild精准处理扩展名替换:
build: esbuild: bundle: true minify: false external: - "uuid" exclude: "*" format: esm outExtension: '.js': '.mjs' entryPoints: - handler.ts # 替换成你的实际源文件路径,比如handler.js
更新函数handler配置
Lambda识别ESM函数时,需要明确指定.mjs后缀:
functions: hello: handler: handler.mjs.hello # 原handler: handler.hello 修改为 handler.mjs.hello events: - httpApi: path: /hello method: get
3. (可选)验证TypeScript配置(如果用TS)
如果你的源文件是TypeScript,确保tsconfig.json的module字段匹配ESM格式:
{ "compilerOptions": { "module": "ESNext", "target": "ES2020", "moduleResolution": "NodeNext", "esModuleInterop": true } }
验证结果
重新执行serverless deploy或serverless package,编译产物应该会生成handler.mjs和handler.mjs.map,无需手动修改扩展名即可正常部署到Lambda。
内容的提问来源于stack exchange,提问作者ILoveET
相关产品推荐
相关产品推荐

