You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复第三方库引发的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的依赖:

  1. 在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;
  1. 同步调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:55:20