VS Code调试TypeScript版AWS Lambda时指定自定义tsconfig.json的方法
SAM构建TypeScript Lambda时读取自定义tsconfig配置的解决方法
问题核心原因
SAM CLI本地构建、调试TypeScript编写的Lambda函数时,默认会使用内置的固定tsconfig配置执行编译,不会自动读取项目根目录下的自定义tsconfig.json,即使项目中配置了esModuleInterop: true也不会生效,最终出现默认导出不存在的运行时错误。
SAM内置的默认编译配置如下:
{ "compilerOptions": { "target": "es6", "module": "commonjs", "typeRoots": [ "node_modules/@types" ], "types": [ "node" ], "rootDir": ".", "inlineSourceMap": true } }
可用解决方式
- 方式一:在SAM模板中显式指定tsconfig路径
打开项目根目录下的template.yaml,找到对应Lambda函数的配置块,在Metadata段添加构建属性,明确指定自定义tsconfig的文件路径:
配置后SAM执行构建时会直接读取该路径下的配置,完全覆盖内置默认规则。Resources: # 替换为你的Lambda函数逻辑ID TypeScriptLambda: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs18.x CodeUri: src/ Metadata: BuildMethod: esbuild BuildProperties: # 填写项目中tsconfig.json的相对路径 Tsconfig: ./tsconfig.json - 方式二:构建命令追加参数指定配置
手动执行sam build时,追加--tsconfig参数指定配置文件路径即可:
如果是通过VS Code的AWS Toolkit插件启动调试,打开项目# 清空缓存后重新构建 rm -rf .aws-sam sam build --tsconfig ./tsconfig.json.vscode/launch.json中对应的SAM调试配置,在sam.buildArguments字段中加入该参数:{ "type": "aws-sam", "request": "direct-invoke", "name": "本地调试TypeScript Lambda", "invokeTarget": { "target": "code", "projectRoot": "${workspaceFolder}/src", "lambdaHandler": "index.handler" }, "lambda": { "runtime": "nodejs18.x" }, "sam": { "buildArguments": ["--tsconfig", "${workspaceFolder}/tsconfig.json"] } } - 方式三:直接传递单个编译器选项
如果不需要全量引用自定义tsconfig,仅需要开启esModuleInterop这类个别配置,可以直接向底层构建工具传递编译参数,无需额外调整配置文件:Metadata: BuildMethod: esbuild BuildProperties: EsbuildArgs: - --tsconfig-raw={"compilerOptions":{"esModuleInterop":true}}
注意:所有配置修改完成后,必须先删除项目根目录下的
.aws-sam缓存文件夹,再重新执行构建或启动调试,否则旧的构建缓存会导致新配置不生效。
内容的提问来源于stack exchange,提问作者Isac Casapu
相关产品推荐
相关产品推荐

