无法在AWS Lambda函数上使用ES6;如何在 Lambda 中导入 ES6 模块

Der*_* C. 5 javascript amazon-web-services typescript aws-lambda

我有一个用 ES6和 Typescriptfoo编写的库。import/export

我有一个bar使用foo. bar也是用导出和 Typescript 编写的。我想bar在 AWS Lambda 上运行。

据我所知,我无法import/export在 Lambda(运行时节点 14.x)中使用

export const handler = async () => {...};
Run Code Online (Sandbox Code Playgroud)

会报错,但是

exports.handler = async () => {...};
Run Code Online (Sandbox Code Playgroud)

将不会。

所以在我的内部tsconfig我已经设置了:

    "target": "ES5", (or ES6)
    "module": "CommonJS",
Run Code Online (Sandbox Code Playgroud)

在编译器选项下。

这样,在 Lambda 上运行时我会收到错误,因为它现在尝试访问requirefoo库并表示它必须使用import.

我怎样才能实现我的最终目标?

在我看来,有 3 个选项,但我对其中没有一个了解很多,因为我对 JS 的细微差别还很陌生。

  • 让我的bar应用程序转译,或者使用 webpack,或者任何可以import在 cjs 中复制的工具。
  • 让我的foo库也包含一个 CJS 发行版(开始这样做时,我遇到了很多错误,我必须让该库在 es6 中工作)。
  • 我在 Lambda / Typescript 中遗漏了一些东西,这将使这变得容易。

sti*_*tel 2

Node v14 中添加了 ES 模块支持。然而,我们需要帮助 Node 确定他必须使用哪种类型来加载文件。

如果您只使用 ES 模块,那很简单,您只需添加"type": "module"package.json文件中即可告诉 Node 使用 ES 模块。另一种方法是使用不同的文件扩展名。但是,由于 AWS Lambda 需要以 的形式配置处理程序filename.methodname,因此它将始终使用该.js扩展名,这使得您无法为入口点使用不同的文件扩展名。

我已经在 AWS Lambda 中进行了测试"type": "module",这似乎有效。我还没有测试互操作性如何与使用 CommonJS 模块的依赖项一起工作,但我认为这可以开箱即用。

您可以参考此博客以获取有关 Node 如何处理此问题的更多信息。