Node.js ES6导入Amplify生成的aws-exports.js报export语法错误咨询
问题根因
Node.js对模块格式的判定规则是以被导入的文件自身属性为依据,和导入方的文件格式无关:
- 当Node解析
aws-exports.js时,会向上查找该文件所在目录链上最近的package.json配置,如果未设置"type": "module",就会默认把这个.js文件按CommonJS格式解析 - CommonJS运行环境不识别ESM的顶层
export语法,因此会直接抛出SyntaxError: Unexpected token 'export'
需要明确:并非必须全局设置package.json的type字段为module才能正常加载这个配置文件,Node的模块判定是分文件粒度的,不存在全局一刀切的强制要求。
可落地的解决方案
- 最小改动方案:直接将
../src/aws-exports.js重命名为aws-exports.mjs
Node看到.mjs后缀会自动把文件识别为ESM格式,不需要修改任何项目全局配置,也不会影响项目里其他CommonJS格式的.js文件的正常运行。
这个配置文件本身就是标准ESM语法,和Node的.mjs识别规则完全适配,改动成本几乎为零。如果不想每次Amplify重新生成配置后手动改后缀,可以在package.json的脚本里加一行自动重命名的钩子,比如配置post-amplify-pull脚本,每次拉取完Amplify配置后自动执行重命名操作。 - 无侵入适配方案:保留原
aws-exports.js文件名,写一层轻量适配
新建独立的适配文件aws-exports-adapter.mjs,把Amplify生成的纯配置对象以ESM语法重新导出。因为配置文件本身没有任何逻辑代码,只是键值对形式的配置参数,直接把原js里的配置内容拷贝到适配文件中,加上标准的export default语句即可,后续业务代码全部从这个适配文件导入配置,完全不需要修改原Amplify生成的文件。 - 全项目适配方案:当项目本身已经计划全量切换到ESM语法时
可以在项目根的package.json中设置"type": "module",此时Node会把项目内所有普通.js文件默认识别为ESM格式,自然能识别aws-exports.js里的导出语法。
但需要注意这个改动是全局生效的,会导致项目里所有原CommonJS格式的.js文件全部运行报错,需要手动将这些CJS文件重命名为.cjs后缀,改动成本较高,不适合仅为了加载这一个配置文件就做全局调整的场景。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

