根据AWS博客的说法,从Nodejs14运行时开始支持在Lambda中使用ES模块。
公告 - https://aws.amazon.com/about-aws/whats-new/2022/01/aws-lambda-es-modules-top-level-await-node-js-14/ 示例 - https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ 我已经检查了Lambda函数运行时是Node14(并尝试切换到Node18没有任何区别)- 我通过Lambda控制台检查了一次我推送代码后的设置,并检查了当Amplify配置更改时版本是否更改为18。
我不会详细介绍我如何到达这里,除了我需要使用一个编写为ESM语法的npm包。
作为一种合理的检查方法和最小可重现的示例,我使用Amplify CLI生成了一个新的简单hello world函数,然后使用
公告 - https://aws.amazon.com/about-aws/whats-new/2022/01/aws-lambda-es-modules-top-level-await-node-js-14/ 示例 - https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ 我已经检查了Lambda函数运行时是Node14(并尝试切换到Node18没有任何区别)- 我通过Lambda控制台检查了一次我推送代码后的设置,并检查了当Amplify配置更改时版本是否更改为18。
我不会详细介绍我如何到达这里,除了我需要使用一个编写为ESM语法的npm包。
作为一种合理的检查方法和最小可重现的示例,我使用Amplify CLI生成了一个新的简单hello world函数,然后使用
amplify mock function test --event src/event.json
运行它并确认它可以正常运行。但当我将package.json更改为"type":"module"
时,出现了以下错误: stack: 'Error: Could not load lambda handler function due to Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /[redacted]/amplify/backend/function/test/src/index.js\n' +
'require() of ES modules is not supported.\n' +
'require() of /[redacted]/amplify/backend/function/test/src/index.js from /snapshot/repo/build/node_modules/amplify-nodejs-function-runtime-provider/lib/utils/execute.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.\n'
无论我是从amplify mock function
CLI、Lambda控制台还是通过访问链接到Lambda函数的API网关来运行该函数,我都会遇到相同的错误。
除了上面链接的博客文章之外,我找不到任何其他关于在Lambda中使用ES模块的提及或示例。
如果您想自己尝试:
- 安装amplify cli
amplify init
amplify add function
并将其命名为test
,选择Nodejs,Hello World模板amplify mock function test --event src/event.json
,它将正常工作- 更改amplify/backend/function/test/src/package.json
以包括
"type":"module"` amplify mock function test --event src/event.json
,它将失败
可选地,您可以将应用程序推送到AWS并通过Lambda控制台测试lambda,您应该获得相同的结果。
相关问题:
- https://github.com/aws-amplify/amplify-cli/issues/10437:同样的问题是由于导入的模块是ESM,通过更新该模块的版本提供了CJS支持来解决的。
- https://github.com/aws-amplify/amplify-cli/issues/5691:这与根项目是ESM(在package.json中类型为module)有关,并通过amplify hooks对package.json进行了猴子补丁,但并未解决导入ESM包的问题。底部有一条评论声称在amplify CLI 10.2.3中已经修复了此问题,但可能仅解决了根包问题,而没有解决我遇到的lambda子项目问题。
- https://github.com/aws-amplify/amplify-cli/issues/10432:涉及使用“mock function”,但问题与模拟或部署的函数有关。所述步骤是继续从TypeScript生成CJS输出,将TS代码转换为ESM样式的导入/导出。因为amplify运行的代码是CJS,如果尝试导入ESM包,则会失败。