如何修复第三方库引发的ReferenceError: __dirname未定义错误
解决SST框架Lambda中sharp包的__dirname未定义错误
问题核心:SST构建Lambda产物时,自动生成的package.json包含"type": "module",导致依赖CommonJS环境变量__dirname的sharp包运行报错。以下是几种可行解决方法:
方案1:强制Lambda使用CommonJS模式
在SST栈定义中,给目标Lambda配置format: "cjs",让SST构建时生成CommonJS格式产物,避开ES模块的冲突:
// stacks/YourStack.ts import { Api, Function } from "sst/constructs"; export function YourStack({ stack }) { const api = new Api(stack, "Api", { routes: { "GET /": { function: { handler: "packages/functions/src/lambda.handler", // 强制生成CommonJS格式产物 format: "cjs", // 打包时包含sharp,适配Lambda环境 bundle: { nodeModules: ["sharp"], }, }, }, }, }); }
配置后,SST会生成.cjs后缀的处理文件,产物的package.json也不会设置"type": "module",sharp可正常读取__dirname。
方案2:注入ES模块兼容补丁
若必须使用ES模块模式,可在Lambda入口文件顶部手动定义__dirname并挂载到全局,适配sharp的依赖:
- 在Lambda入口文件添加补丁代码:
// 兼容CommonJS的__dirname变量 import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // 挂载到全局供sharp调用 global.__dirname = __dirname;
- 同步调整SST的bundle配置:
// stacks/YourStack.ts function: { handler: "packages/functions/src/lambda.handler", format: "esm", bundle: { nodeModules: ["sharp"], // 复制sharp的预编译文件到产物目录 copyFiles: [ { from: "node_modules/sharp/build/Release", to: "build/Release" }, ], }, }
方案3:使用预构建的sharp Lambda层
借助预编译的sharp Lambda层,避免自行打包时的模块格式冲突:
// stacks/YourStack.ts function: { handler: "packages/functions/src/lambda.handler", bundle: { external: ["sharp"], }, layers: [ // 替换为对应AWS区域的sharp层ARN "arn:aws:lambda:us-east-1:753240598075:layer:sharp:30", ], }
预构建层中的sharp为CommonJS格式,可直接在ES模块环境的Lambda中调用。
内容的提问来源于stack exchange,提问作者THpubs
相关产品推荐
相关产品推荐

