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

在AWS Lambda中使用Rollup的TypeScript插件时__filename引发引用错误

解决AWS Lambda + Rollup + TypeScript中的__filename is not defined错误

问题根源

这个错误的核心是运行环境的模块类型与Rollup输出的代码格式不匹配:

  • __filename是CommonJS模块特有的变量,ES模块环境中默认不存在
  • 虽然你在tsconfig.json里指定了module: "CommonJS",但Rollup的输出格式可能没同步设置,或者Lambda的运行环境把打包后的文件识别成了ES模块,导致TypeScript内部代码调用__filename时出错

解决方案

1. 强制Rollup输出CommonJS格式

AWS Lambda默认支持CommonJS模块,必须确保Rollup的输出格式设置为cjs:
修改你的Rollup配置文件(通常是rollup.config.js):

export default {
  input: 'src/index.ts',
  output: {
    file: 'dist/index.js',
    format: 'cjs', // 关键配置:指定输出CommonJS
    sourcemap: true // 可选,方便Lambda调试
  },
  plugins: [typescript()]
};

2. 移除package.json中的"type": "module"字段

如果项目根目录下的package.json里有"type": "module",Node.js会强制把所有.js文件当作ES模块处理,哪怕代码是CommonJS格式的。直接删掉这个字段即可。

3. 手动注入__filename和__dirname(兜底方案)

如果上面两步还没解决问题,可以用Rollup插件手动注入这两个变量:

  • 先安装插件:
    npm install @rollup/plugin-inject --save-dev
    
  • 修改Rollup配置:
    import inject from '@rollup/plugin-inject';
    import typescript from '@rollup/plugin-typescript';
    
    export default {
      input: 'src/index.ts',
      output: {
        file: 'dist/index.js',
        format: 'cjs'
      },
      plugins: [
        typescript(),
        inject({
          __filename: ['node:process', '__filename'],
          __dirname: ['node:process', '__dirname']
        })
      ]
    };
    

4. 确认Lambda运行时版本

确保你选择的Lambda Node.js运行时版本(比如18.x、20.x)支持你的TypeScript编译目标(ES6),避免使用过旧的版本(比如12.x以下)。


内容的提问来源于stack exchange,提问作者FRMR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:13:23