# @aws-cdk/aws-lambda-nodejs 中文文档

规范地址：https://npmcn.com/package/%40aws-cdk/aws-lambda-nodejs/

版本：1\.204\.0
npm 元数据更新时间：2023-11-21T10:16:07.098Z
中文译文更新时间：2026-11-07T14:16:09.571Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40aws-cdk/aws-lambda-nodejs
原文对照：https://npmcn.com/package/%40aws-cdk/aws-lambda-nodejs/?lang=original
项目主页：https://github.com/aws/aws-cdk
源码仓库：https://github.com/aws/aws-cdk

弃用说明：AWS CDK v1 has reached End-of-Support on 2023-06-01\. This package is no longer being updated, and users should migrate to AWS CDK v2\. For more information on how to migrate, see https://docs\.aws\.amazon\.com/cdk/v2/guide/migrating-v2\.html

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：361 kB，24 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>= 14\.15\.0
- 运行依赖：3 个
- peer 依赖：@aws-cdk/aws-lambda 1\.204\.0，@aws-cdk/core 1\.204\.0，constructs ^3\.3\.69
- 首次发布：2020-02-07T03:50:32.217Z
- 最新版本发布：2023-06-19T21:07:28.086Z
- 近 30 天下载量：24380（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：211（近 12 个月 0 个）

## 中文简介

在节点.js的 AWS Lambda 的 CDK 构造库

## 安装

```sh
npm install @aws-cdk/aws-lambda-nodejs
```

也可以使用：`pnpm add @aws-cdk/aws-lambda-nodejs`、`yarn add @aws-cdk/aws-lambda-nodejs`、`bun add @aws-cdk/aws-lambda-nodejs`

## README

# 亚马逊Lambda节点图书馆

* * *

![End-of-Support](https://img.shields.io/badge/End--of--Support-critical.svg?style=for-the-badge)

> AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
> 
> 关于如何移徙的更多信息,请参见: [_移动到 AWS CDK v2_ 指南](https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html)。 。 。 .

* * *

这个库为Node.js Lambda函数提供构造.

## 节点.js 函数

这个 `NodejsFunction` 构造创建自动转接和捆绑的 Lambda 函数 类型脚本或 Javascript 代码。 因此,Lambda小包只包含: 操作该函数需要代码和依赖.

用这个 [兴建](https://esbuild.github.io/) 在引擎盖下.

## 参考项目架构

这个 `NodejsFunction` 允许您在单个中定义您的 CDK 和运行时的依赖性 package.json 和将您的运行时间代码与您的基础设施代码拼接:

```plaintext
.
├── lib
│   ├── my-construct.api.ts # Lambda handler for API
│   ├── my-construct.auth.ts # Lambda handler for Auth
│   └── my-construct.ts # CDK construct with two Lambda functions
├── package-lock.json # single lock file
├── package.json # CDK and runtime dependencies defined in a single package.json
└── tsconfig.json
```

默认情况下,构造将使用定义文件的名称和构造的 查找条目文件的ID 。 单位 `my-construct.ts` 上面有:

```ts
// automatic entry look up
const apiHandler = new lambda.NodejsFunction(this, 'api');
const authHandler = new lambda.NodejsFunction(this, 'auth');
```

或者,可以指定条目文件和处理器:

```ts
new lambda.NodejsFunction(this, 'MyFunction', {
  entry: '/path/to/my/file.ts', // accepts .js, .jsx, .ts, .tsx and .mjs files
  handler: 'myExportedFunc', // defaults to 'handler'
});
```

对于单体,参考架构变为:

```plaintext
.
├── packages
│   ├── cool-package
│   │   ├── lib
│   │   │   ├── cool-construct.api.ts
│   │   │   ├── cool-construct.auth.ts
│   │   │   └── cool-construct.ts
│   │   ├── package.json # CDK and runtime dependencies for cool-package
│   │   └── tsconfig.json
│   └── super-package
│       ├── lib
│       │   ├── super-construct.handler.ts
│       │   └── super-construct.ts
│       ├── package.json # CDK and runtime dependencies for super-package
│       └── tsconfig.json
├── package-lock.json # single lock file
├── package.json # root dependencies
└── tsconfig.json
```

## 自定义基本的 Lambda 函数

所有属性 `lambda.Function` 可用于自定义基础 `lambda.Function`。 。 。 .

另见 [AWS Lambda 构建库](https://github.com/aws/aws-cdk/tree/master/packages/%40aws-cdk/aws-lambda)。 。 。 .

这个 `NodejsFunction` 自动构造 [重复使用现有连接](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html) 当与 JavaScript 的 AWS SDK 合作时. 设定 `awsSdkConnectionReuse` 向 `false` 来禁用它.

## 锁定文件

这个 `NodejsFunction` 需要依赖性锁定文件( q)`yarn.lock`, (中文(简体) ), `pnpm-lock.yaml` 或者说 `package-lock.json`) (中文(简体) ). 当捆绑在一个 Docker 容器中时,包含此锁文件的路径是 用作源(`/asset-input`用于装入容器的体积.

默认情况下, 构造将尝试自动确定您的工程锁定文件 . 或者,您可以指定 `depsLockFilePath` 手动道具。 在这 您需要确保此路径包含 `entry` 和任何模块/相互依存关系 用于您的函数。 否则,捆绑将失败.

## 本地捆绑

若为 `esbuild` 它将用来将您的代码捆绑在您的环境中 。 否则, 捆绑将发生在一个 [Lambda 兼容多克容器](https://gallery.ecr.aws/sam/build-nodejs12.x) 与多克平台基于Lambda函数的目标架构.

对于macOS,建议的方法是安装 `esbuild` 因为Docker的体积表现很差.

`esbuild` 可用下列方式安装:

```console
$ npm install --save-dev esbuild@0
```

或

```console
$ yarn add --dev esbuild@0
```

如果你使用单重排布局 `esbuild` 依赖需要安装在“ 根” 中 `package.json` 文档, 不是在工作空间。 从描述的参考架构 [上文](https://npmcn.com/package/%40aws-cdk/aws-lambda-nodejs/#readme-reference-project-architecture),则 `esbuild` dev 依赖性需要在 `./package.json`没有 `packages/cool-package/package.json` 或者说 `packages/super-package/package.json`。 。 。 .

强迫捆绑在一个多克容器中,即使 `esbuild` 在你的环境中, 设定 `bundling.forceDockerBundling` 改为 `true`。如果函数依赖于节点,则此功能是有用的 应安装的模块`nodeModules` 道具,见 [下级](https://npmcn.com/package/%40aws-cdk/aws-lambda-nodejs/#readme-install-modules)在兰巴达 兼容环境。 使用本土依赖的模块通常属于这种情况.

## 使用模块

### 外部人员

默认情况下,除了 `aws-sdk`。可以通过指定 `bundling.externalModules`数字 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    externalModules: [
      'aws-sdk', // Use the 'aws-sdk' available in the Lambda runtime
      'cool-module', // 'cool-module' is already available in a Layer
    ],
  },
});
```

### 安装模块

默认情况下,您 Lambda 代码中引用的所有节点模块将被捆绑 `esbuild`。 。 。 . 使用 `nodeModules` 道具下方 `bundling` 指定一个不应是 已捆绑,但已纳入 `node_modules` lambda 软件包的文件夹。 这个有用 与本地依赖者合作或何时 `esbuild` 无法捆绑模块 .

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    nodeModules: ['native-module', 'other-module'],
  },
});
```

所列模块 `nodeModules` 必须在 `package.json`其依赖性或 已安装。 同一版本将用于安装。 锁定文件( R)`yarn.lock`, (中文(简体) ), `pnpm-lock.yaml` 或者说 `package-lock.json`)将与右安装器一起使用(`yarn`, (中文(简体) ), `pnpm` 或者说 `npm`) (中文(简体) ).

合作时 `nodeModules` 使用本地依赖,您可能想要强制捆绑在一个 即使挂载容器 `esbuild` 可以在您的环境中使用。 可以通过设置 `bundling.forceDockerBundling` 改为 `true`。 。 。 .

## 配置 `esbuild`

这个 `NodejsFunction` 构造曝光 [新建选项](https://esbuild.github.io/api/#build-api) 通过属性 `bundling`数字 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    minify: true, // minify code, defaults to false
    sourceMap: true, // include source map, defaults to false
    sourceMapMode: lambda.SourceMapMode.INLINE, // defaults to SourceMapMode.DEFAULT
    sourcesContent: false, // do not include original source into source map, defaults to true
    target: 'es2020', // target environment for the generated JavaScript code
    loader: { // Use the 'dataurl' loader for '.png' files
      '.png': 'dataurl',
    },
    define: { // Replace strings during build time
      'process.env.API_KEY': JSON.stringify('xxx-xxxx-xxx'),
      'process.env.PRODUCTION': JSON.stringify(true),
      'process.env.NUMBER': JSON.stringify(123),
    },
    logLevel: lambda.LogLevel.SILENT, // defaults to LogLevel.WARNING
    keepNames: true, // defaults to false
    tsconfig: 'custom-tsconfig.json', // use custom-tsconfig.json instead of default,
    metafile: true, // include meta file, defaults to false
    banner: '/* comments */', // requires esbuild >= 0.9.0, defaults to none
    footer: '/* comments */', // requires esbuild >= 0.9.0, defaults to none
    charset: lambda.Charset.UTF8, // do not escape non-ASCII characters, defaults to Charset.ASCII
    format: lambda.OutputFormat.ESM, // ECMAScript module output format, defaults to OutputFormat.CJS (OutputFormat.ESM requires Node.js 14.x)
    mainFields: ['module', 'main'], // prefer ECMAScript versions of dependencies
    inject: ['./my-shim.js', './other-shim.js'], // allows to automatically replace a global variable with an import from another file
    esbuildArgs: { // Pass additional arguments to esbuild
      "--log-limit": "0",
      "--splitting": true,
    },
  },
});
```

## 命令钩子

通过指定 `commandHooks` 道具 :

```text
// This example only available in TypeScript
// Run additional props via `commandHooks`
new lambda.NodejsFunction(this, 'my-handler-with-commands', {
  bundling: {
    commandHooks: {
      beforeBundling(inputDir: string, outputDir: string): string[] {
        return [
          `echo hello > ${inputDir}/a.txt`,
          `cp ${inputDir}/a.txt ${outputDir}`,
        ];
      },
      afterBundling(inputDir: string, outputDir: string): string[] {
        return [`cp ${inputDir}/b.txt ${outputDir}/txt`];
      },
      beforeInstall() {
        return [];
      },
      // ...
    },
    // ...
  },
});
```

现提供以下钩子:

-   `beforeBundling`: 在所有捆绑命令之前运行
-   `beforeInstall`: 在节点模块安装前运行
-   `afterBundling`: 在所有捆绑命令后运行

他们都收到包含锁文件的目录(`inputDir`)和 捆绑资产将输出的目录( e)`outputDir`) (中文(简体) ). 他们必须回来 要运行的一系列命令。 命令与 `&&`。 。 。 .

命令将在捆绑发生的环境中运行: 用于多克捆绑的容器或用于本地捆绑的主机OS上.

## 附带海训方案的预汇编

在某些情况下, `esbuild` 可能尚不支持打字语言的一些较新的特性,例如, [`emitDecoratorMetadata`](https://www.typescriptlang.org/tsconfig#emitDecoratorMetadata)。 。 。 . 在这种情况下,可以使用 `tsc` 通过设置 `preCompilation` 旗帜.

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    preCompilation: true,
  },
});
```

注:A [`tsconfig.json` 文件](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) 需要时间

## 自定义多克捆绑

使用 `bundling.environment` 以定义环境变量,当 `esbuild` 运行 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    environment: {
      NODE_ENV: 'production',
    },
  },
});
```

使用 `bundling.buildArgs` 在构建 Docker 捆绑图像时通过构建参数 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    buildArgs: {
      HTTPS_PROXY: 'https://127.0.0.1:3001',
    },
  }
});
```

使用 `bundling.dockerImage` 要使用自定义的多克捆绑图像 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    dockerImage: DockerImage.fromBuild('/path/to/Dockerfile'),
  },
});
```

这个图像应该有 `esbuild` 已安装 **全球**。如果计划使用 `nodeModules` 这个 也应该有 `npm`, (中文(简体) ), `yarn` 或者说 `pnpm` 取决于您使用的锁文件.

使用 [默认图像提供方式 `@aws-cdk/aws-lambda-nodejs`](https://github.com/aws/aws-cdk/blob/master/packages/%40aws-cdk/aws-lambda-nodejs/lib/Dockerfile) 作为灵感的来源.

## 资产散列h

默认情况下,资产散列将根据捆绑的产出计算(`AssetHashType.OUTPUT`) (中文(简体) ).

使用 `assetHash` 通过自定义散列的道具 :

```ts
new lambda.NodejsFunction(this, 'my-handler', {
  bundling: {
    assetHash: 'my-custom-hash',
  },
});
```

如果您选择自定义散列, 您需要确保每次资产更新它 否则,一些部署不会被取消.

## 常见问题

### @aws-cdk/aws-lambda-nodejs 是什么？

在节点\.js的 AWS Lambda 的 CDK 构造库注意：该包已被作者标记为弃用——AWS CDK v1 has reached End-of-Support on 2023-06-01\. This package is no longer being updated, and users should migrate to AWS CDK v2\. For more information on how to migrate, see https://docs\.aws\.amazon\.com/cdk/v2/guide/migrating-v2\.html

### 如何安装 @aws-cdk/aws-lambda-nodejs？

在项目目录运行 npm install @aws-cdk/aws-lambda-nodejs，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@aws-cdk/aws-lambda（1\.204\.0）、@aws-cdk/core（1\.204\.0）、constructs（^3\.3\.69）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @aws-cdk/aws-lambda-nodejs 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @aws-cdk/aws-lambda-nodejs 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @aws-cdk/aws-lambda-nodejs 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>= 14\.15\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @aws-cdk/aws-lambda-nodejs 可以商用吗？

@aws-cdk/aws-lambda-nodejs 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @aws-cdk/aws-lambda-nodejs 的下载量有多少？

根据 npm 官方下载统计，@aws-cdk/aws-lambda-nodejs 在 2026/10/08 – 2026/11/06 这 30 天内被下载 24,380 次，日均约 813 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @aws-cdk/aws-lambda-nodejs 还在维护吗？

最新版本 1\.204\.0 发布于 2023/06/20（3 年前）；至今共发布 211 个版本，其中过去 12 个月发布了 0 个；首次发布于 2020/02/07。作者已将其标记为弃用，新项目建议寻找替代方案。

