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

如何在AWS CDK的NodejsFunction中使用export=导出的模块?

使用CDK NodejsFunction加载sharp等原生模块的解决方法

结论:可以使用export =方式导出的模块(比如sharp),你遇到的报错和导入写法无关,根源是sharp这类带原生二进制文件的模块需要适配Lambda的Linux运行环境,本地直接安装的二进制文件和Lambda环境不兼容。

报错原因

sharp依赖对应操作系统的二进制文件,如果你在Mac/Windows本地安装sharp,生成的是对应平台的二进制(比如sharp-darwin-x64.node),而Lambda运行在Linux环境下,需要的是sharp-linux-x64.node,所以会出现找不到模块的错误。

解决方法

方法1:通过CDK的Docker打包构建(推荐)

让CDK在Docker容器中完成依赖安装和代码打包,确保生成的二进制文件适配Lambda的Linux环境。修改你的CDK配置如下:

import { aws_lambda_nodejs as lambda, aws_lambda as lambdaCore } from 'aws-cdk-lib';

const fn = new lambda.NodejsFunction(scope, 'fn-id', {
  entry: 'lib/lambda/my-fn.ts',
  functionName: 'fn-name',
  runtime: lambdaCore.Runtime.NODEJS_20_X, // 选择你需要的Node版本
  bundling: {
    // 使用Lambda官方的Node.js镜像作为打包环境
    image: lambdaCore.Runtime.NODEJS_20_X.bundlingImage,
    // 设置sharp的环境变量,强制安装独立的libvips
    environment: {
      SHARP_IGNORE_GLOBAL_LIBVIPS: '1',
    },
  },
});

这样CDK会自动启动Docker容器,在Linux环境下执行npm install和代码编译,生成符合Lambda要求的二进制文件。

方法2:使用Lambda层

直接使用预构建好的sharp Lambda层,避免在代码包中包含原生依赖:

  1. 可以使用AWS社区维护的sharp层,或者自己构建层(将sharp安装在Linux环境后打包成层)
  2. 在CDK中给Lambda函数添加层:
// 假设已经有一个sharp层的ARN
const sharpLayer = lambdaCore.LayerVersion.fromLayerVersionArn(scope, 'SharpLayer', 'arn:aws:lambda:你的区域:xxxxxx:layer:sharp:版本号');

const fn = new lambda.NodejsFunction(scope, 'fn-id', {
  entry: 'lib/lambda/my-fn.ts',
  functionName: 'fn-name',
  layers: [sharpLayer],
});

关于导入写法的说明

对于export =导出的模块,TypeScript中以下写法都是有效的:

  • import sharp = require('sharp')(TypeScript特定的写法)
  • 若在tsconfig.json中设置"esModuleInterop": true,可以使用import sharp from 'sharp'
    这些写法本身不会导致报错,之前的问题完全是原生模块的平台适配问题。

内容的提问来源于stack exchange,提问作者kusumoto_teruya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:05:25