如何用tsc将AWS AppSync TS解析器的本地依赖打包进输出JS?
解决方案:结合TSC与打包工具实现本地模块内嵌
TSC仅负责TypeScript到JavaScript的转译,不具备模块打包(将本地依赖代码内嵌)的能力,因此需要配合ESBuild或Rollup这类轻量打包工具,同时保留对@aws-appsync/utils的外部依赖,确保输出符合AppSync解析器的要求。以下是适配NX项目的具体实现步骤:
一、使用ESBuild实现(推荐,轻量高效)
1. 安装依赖
在NX项目的对应包目录下执行:
npm install esbuild --save-dev
2. 配置打包命令
在项目的project.json中添加解析器打包目标,批量处理所有解析器文件:
{ "build-resolvers": { "executor": "nx:run-commands", "options": { "commands": [ // 先执行TS类型检查(仅校验不输出JS) "nx run your-project:type-check", // 批量打包所有解析器TS文件,保留@aws-appsync/utils为外部依赖 "esbuild src/resolvers/*.ts --bundle --format=esm --external:@aws-appsync/utils --outdir=dist/resolvers" ] } }, "type-check": { "executor": "nx:tsc", "options": { "tsConfig": "src/tsconfig.json", "noEmit": true } } }
3. 验证输出结果
打包后的JS文件需满足:
- 本地依赖(如
./utils/dynamoDBGetItemRequest)的代码被直接内嵌 - 仅保留
import { ... } from '@aws-appsync/utils'的外部导入语句 - 明确导出
request和response函数,示例:
export function request(ctx) { /* 内嵌的业务逻辑 */ } export function response(ctx) { /* 内嵌的业务逻辑 */ }
4. CDK适配
确保CDK代码指向打包后的输出目录:
const getUserFunction = new appsync.Function(this, 'GetUserFunction', { name: 'GetUser', api: api, dataSource: userDataSource, code: appsync.Code.fromAsset('dist/resolvers/getUser.js'), runtime: appsync.FunctionRuntime.JS_1_0_0, });
二、替代方案:使用Rollup
若偏好Rollup,可按以下配置实现:
1. 安装依赖
npm install rollup @rollup/plugin-typescript @rollup/plugin-node-resolve --save-dev
2. 编写Rollup配置文件
在项目根目录创建rollup.config.js:
import typescript from '@rollup/plugin-typescript'; import resolve from '@rollup/plugin-node-resolve'; export default { input: 'src/resolvers/getUser.ts', // 可编写脚本批量处理多个文件 output: { file: 'dist/resolvers/getUser.js', format: 'esm' }, external: ['@aws-appsync/utils'], // 标记外部依赖不打包 plugins: [resolve(), typescript()] };
3. 整合进NX构建流程
在project.json中添加Rollup执行命令,替换ESBuild的对应步骤即可。
内容的提问来源于stack exchange,提问作者Måns Dahlström
相关产品推荐
相关产品推荐

