使用 esbuild 构建 Node.js Lambda 函数 - AWS Serverless Application Model

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 esbuild 构建 Node.js Lambda 函数

要构建和打包 Node.js AWS Lambda 函数,可以将与 esbuild JavaScript 捆绑器 AWS SAMCLI一起使用。esbuild 捆绑器支持你写入的 Lambda 函数。 TypeScript

要使用 esbuild 构建 Node.js Lambda 函数,请向您的 AWS:Serverless::Function 资源添加一个 Metadata 对象并为 BuildMethod 指定 esbuild。当你运行sam build命令时, AWS SAM 使用 esbuild 来捆绑你的 Lambda 函数代码。

元数据属性

Metadata 对象针对 esbuild 支持以下属性:

BuildMethod

为应用程序指定捆绑程序。esbuild 是唯一受支持的值。

BuildProperties

为 Lambda 函数代码指定构建属性。

BuildProperties 对象针对 esbuild 支持以下属性:所有属性均为可选属性。默认情况下, AWS SAM 使用您的 Lambda 函数处理程序作为入口点。

EntryPoints

为应用程序指定入口点。

外部

指定要从构建中省略的程序包列表。有关更多信息,请参阅 esbuild 网站上的外部

格式

指定应用程序中生成 JavaScript 文件的输出格式。有关更多信息,请参阅 esbuild 网站中的格式

加载程序

指定用于加载给定文件类型的数据的配置列表。

MainFields

指定解析程序包时要尝试导入哪些 package.json 字段。默认值为 main,module

缩小

指定是否缩小捆绑的输出代码。默认值为 true

OutExtension

自定义 esbuild 生成的文件的扩展名。有关更多信息,请参阅 esbuild 网站上的向外扩展

源映射

指定捆绑程序是否生成源映射文件。默认值为 false

如果设置为 true,则 NODE_OPTIONS: --enable-source-maps 会附加到 Lambda 函数的环境变量中,生成源映射并将其包含在函数中。

或者,如果 NODE_OPTIONS: --enable-source-maps 包含在函数的环境变量中,则 Sourcemap 会自动设置为 true

发生冲突时,Sourcemap: false 优先于 NODE_OPTIONS: --enable-source-maps

注意

默认情况下,Lambda 使用 AWS Key Management Service (AWS KMS) 加密所有静态环境变量。使用源映射时,要成功部署,您的函数的执行角色必须具有执行 kms:Encrypt 操作的权限。

SourcesContent

指定是否在源映射文件中包含源代码。当 Sourcemap 设置为 'true' 时,可配置此属性。

  • 指定 SourcesContent: 'true' 包含所有源代码。

  • 指定 SourcesContent: 'false' 排除所有源代码。这样可以缩小源映射文件的大小,缩短启动时间,从而在生产中非常有用。但是,调试器中将无法使用源代码。

默认值为 SourcesContent: true

有关更多信息,请参阅 esbuild 网站中的源内容

目标

指定目标 ECMAScript 版本。默认值为 es2020

TypeScript Lambda 函数示例

以下示例 AWS SAM 模板片段使用 esbuild 根据中的代码创建 Node.js Lambda 函数。 TypeScript hello-world/app.ts

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.handler Runtime: nodejs20.x Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get Environment: Variables: NODE_OPTIONS: --enable-source-maps Metadata: BuildMethod: esbuild BuildProperties: Format: esm Minify: false OutExtension: - .js=.mjs Target: "es2020" Sourcemap: true EntryPoints: - app.ts External: - "<package-to-exclude>"