【问题标题】:Cannot use ES6 on AWS Lambda function; how to import ES6 module within Lambda无法在 AWS Lambda 函数上使用 ES6;如何在 Lambda 中导入 ES6 模块
【发布时间】:2021-10-18 20:51:38
【问题描述】:

我有一个库 foo,它是用 ES6、import/export 和 Typescript 编写的。

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

据我所知,我不能在 Lambda(运行时节点 14.x)中使用 import/export 作为

export const handler = async () => {...};

会出错,但是

exports.handler = async () => {...};

不会。

所以在我的tsconfig 内我设置了:

    "target": "ES5", (or ES6)
    "module": "CommonJS",

在编译器选项下。

有了这个,在 Lambda 上运行我得到错误,因为它现在尝试 require foo 库并说它必须使用 import

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

在我看来,有 3 个选项,我对这些选项都不了解,因为我对 JS 的细微差别还很陌生。

  • 让我的 bar 应用转译,或使用 webpack,或使用任何工具在 cjs 中复制 import
  • 让我的 foo 库也包含 CJS 发行版(开始这样做,但为了使库在 es6 中工作,我不得不经历很多错误)。
  • 我在 Lambda / Typescript 中遗漏了一些可以简化此操作的内容。

【问题讨论】:

    标签: javascript typescript amazon-web-services aws-lambda


    【解决方案1】:

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

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

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

    您可以参考this blog 了解有关 Node 如何处理此问题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2018-09-18
      • 2019-02-08
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多