在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
相关产品推荐
相关产品推荐

