使用esbuild打包NodeJS项目后运行报错:AWS CRT binary not present
解决AWS CRT二进制文件路径错误问题
以下是针对你遇到的打包后运行报错的排查和解决步骤:
1. 扩大external依赖范围
仅将@aws-sdk/crt-loader设为外部依赖不足以解决问题,因为@aws-sdk/signature-v4-crt依赖的是整个AWS CRT生态的包(包括底层的aws-crt,二进制文件实际存放在这里)。需要将所有相关AWS SDK CRT包设为外部依赖,让Node运行时从node_modules加载:
esbuild src/server.ts --outdir=dist --bundle --platform=node --external:@aws-sdk/* --external:aws-crt
2. 保留Node.js原生路径变量
esbuild打包Node项目时会默认修改__dirname和__filename,导致crt-loader计算二进制文件路径出错。添加参数保留原生路径变量:
esbuild src/server.ts --outdir=dist --bundle --platform=node --external:@aws-sdk/* --external:aws-crt --define:__dirname='__dirname' --define:__filename='__filename'
3. 手动指定CRT二进制路径
如果上述方法无效,可通过环境变量强制指定二进制文件位置:
- 运行时指定(需根据你的系统架构调整路径):
AWS_CRT_BINARY_PATH=./node_modules/aws-crt/bin/linux-x64-glibc/aws-crt-nodejs.node node dist/server.js
- 代码中提前设置:
process.env.AWS_CRT_BINARY_PATH = require.resolve('aws-crt/bin/linux-x64-glibc/aws-crt-nodejs.node');
4. 验证aws-crt包安装完整性
检查node_modules中是否存在对应架构的二进制文件:
ls -la node_modules/aws-crt/bin/
如果缺失,重新安装依赖:
rm -rf node_modules package-lock.json npm install
5. 调整tsconfig模块解析策略
将tsconfig.json中的moduleResolution改为node,贴近Node.js原生模块解析逻辑:
"moduleResolution": "node"
修改后重新打包测试。
内容的提问来源于stack exchange,提问作者Patrick Michaelsen
相关产品推荐
相关产品推荐

