Node.js 20.x AWS Lambda内联代码ES6导入问题及方案咨询
Node.js 20.x AWS Lambda内联代码启用ES6导入的问题与解决
你对限制的理解完全正确
内联Lambda的这两个限制是真实存在的:
- 内联部署仅支持单文件,无法附带
package.json,因此没法通过"type": "module"声明将代码标记为ES模块 - 内联代码会被自动命名为
index.js,Lambda运行时会默认按CommonJS规则解析该文件,无法指定为index.mjs
单文件内联代码的变通方案
方案1:用动态导入替代静态import
动态导入(import())是CommonJS和ES模块兼容的语法,无需修改模块类型就能加载内置模块或第三方依赖(依赖需提前通过层或部署包安装)。示例代码:
exports.handler = async (event) => { // 动态导入内置模块 const { default: fetch } = await import('node:fetch'); // 动态导入第三方包(需确保Lambda环境已安装) const { format } = await import('date-fns'); const now = format(new Date(), 'yyyy-MM-dd'); const response = await fetch(`https://example.com/api?date=${now}`); const data = await response.json(); return { statusCode: 200, body: JSON.stringify(data) }; };
方案2:通过CDK打包单文件.mjs模拟内联
虽然Code.fromInline直接生成的是index.js,但可以通过CDK手动创建包含index.mjs的Zip归档,实现单文件ES模块部署,效果接近内联:
import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as cdk from 'aws-cdk-lib'; import { ZipArchive } from 'aws-cdk-lib'; const app = new cdk.App(); const stack = new cdk.Stack(app, 'EsModuleLambdaStack'); // 直接编写ES模块代码(模拟内联) const esModuleCode = ` import fetch from 'node:fetch'; export const handler = async (event) => { const response = await fetch('https://example.com'); const data = await response.json(); return { statusCode: 200, body: JSON.stringify(data) }; }; `; // 创建Zip归档,将代码作为index.mjs放入 const zip = new ZipArchive(); zip.addFile('index.mjs', esModuleCode); new lambda.Function(stack, 'EsModuleLambda', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.mjs.handler', // 指定mjs文件的handler code: lambda.Code.fromZipFile(zip), });
这种方式下,.mjs文件会被Lambda运行时自动识别为ES模块,支持静态import语法,且无需额外的package.json。
内容的提问来源于stack exchange,提问作者Nicklas Karlsson
相关产品推荐
相关产品推荐

