使用CDK部署TypeScript编写的Lambda时如何仅部署JS文件
解决方案:仅部署Lambda的JavaScript文件(排除TS/类型定义文件)
我来给你几个实用的方案,帮你解决CDK部署Lambda时包含冗余TS文件的问题,每个方案都有明确的操作步骤,你可以根据自己的场景选择:
方案1:直接在CDK Asset中过滤文件(最快实现)
不需要修改任何编译配置,直接通过CDK的AssetOptions参数来排除不需要的文件,或者只包含需要的JS文件。
代码示例:
// 方式1:排除TS和类型定义文件 code: lambda.Code.asset('lambdas', { exclude: ['**/*.ts', '**/*.d.ts'], }) // 方式2:仅包含JS文件(二选一即可) code: lambda.Code.asset('lambdas', { include: ['**/*.js'], })
优点:
- 零侵入,不用改现有TS编译流程或目录结构
- 配置简单,直接在CDK代码中完成过滤
方案2:为Lambda代码单独配置TS编译目录(更清晰的结构)
如果想彻底分离源文件和部署产物,可以给Lambda的TS代码单独设置一个tsconfig,编译到独立的输出目录,这样CDK只需要指向这个输出目录即可,不会影响根目录的stack.ts编译。
操作步骤:
- 在
lambdas目录下创建tsconfig.lambda.json:
{ "extends": "../tsconfig.json", // 继承根目录的基础配置 "compilerOptions": { "outDir": "../dist/lambdas", // 指定Lambda代码的输出目录 "rootDir": "./" // 源文件根目录为当前lambdas目录 }, "include": ["**/*.ts"] // 只编译当前目录下的TS文件 }
- 在
package.json中添加Lambda编译脚本:
"scripts": { "build": "tsc", // 编译根目录的CDK代码(比如stack.ts) "build:lambda": "tsc -p lambdas/tsconfig.lambda.json", // 单独编译Lambda代码 "deploy": "npm run build && npm run build:lambda && cdk deploy" // 部署前先编译两者 }
- 修改CDK中的代码源指向编译后的目录:
code: lambda.Code.asset('dist/lambdas')
优点:
- 源文件和部署产物完全分离,目录结构更清晰
- 避免误部署源文件,编译后的JS是纯净的运行代码
方案3:使用CDK的NodejsFunction自动处理TS编译与打包(最优解)
AWS CDK提供了@aws-cdk/aws-lambda-nodejs包,专门用于处理Node.js(含TypeScript)的Lambda函数,它会自动用esbuild编译TS代码、打包成最小体积的JS文件,还支持tree shaking和压缩,彻底解决文件冗余问题。
操作步骤:
- 安装依赖:
npm install @aws-cdk/aws-lambda-nodejs
- 在CDK代码中替换原有的
Function为NodejsFunction:
import { NodejsFunction } from '@aws-cdk/aws-lambda-nodejs'; // ... const myLambda = new NodejsFunction(this, 'MyLambdaFunction', { entry: 'lambdas/index.ts', // Lambda的TS入口文件路径 handler: 'handler', // 你导出的处理函数名称 bundling: { minify: true, // 开启代码压缩,进一步减小体积 sourceMap: false, // 如果不需要源码映射可以关闭 // 还可以配置外部依赖排除、自定义esbuild选项等 }, });
优点:
- 自动处理TS编译,无需手动管理编译流程
- 打包后的代码体积最小(esbuild支持tree shaking)
- 支持热重载、自定义打包配置等高级功能
内容的提问来源于stack exchange,提问作者adamfli
相关产品推荐
相关产品推荐

