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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:20:18