将 Node 14.X 程序转换为 AWS Node 12.X Lambda 函数

sti*_*tus 6 javascript node.js aws-lambda es6-modules

我的目标

获取一个节点程序(一个命令行服务器端程序,而不是一个 Web 应用程序)并将其部署为 AWS 中的 lambda 函数。

背景:我的节点开发环境/方法

  • 我的 MacBook Pro 上的 Node 14.X:版本 14.2.0,默认情况下启用 ECMAScript 模块支持
  • 将我的软件开发为 ES6 模块,如下所示:
    • 将类型:模块放入我的 package.json 文件中
    • 使用 .js 扩展名而不是 .mjs 和 .cjs 扩展名(因为 VS Code 智能感知与多扩展方法不兼容)
    • 由于这是一个后端程序,我没有做任何蒸腾或捆绑(目前没有 Babel 或 Webpack)

创建 lambda 函数

  • 使用 AWS (12.X) 支持的最新节点环境
  • 从我在 AWS lambda 环境中可以看出:
    • 在这种情况下,入口点是硬编码的 (index.js)
      • 我无法将命令行参数传递给节点
    • 如果我尝试不加修改地运行我的代码(使用类型:模块),它会按预期失败,因为 AWS 节点正在尝试“要求”我的 ES6 模块:
      • “必须使用导入来加载 ES 模块:不支持 /var/task/index.js\nrequire() 的 ES 模块。而是将 index.js 重命名为以 .cjs 结尾,更改需要的代码以使用 import(),或者从 /var/task/package.json 中删除“type”:“module”。”
    • 如果我尝试将文件的扩展名更改为显式,AWS 会堵嘴,因为它将入口点硬编码为“index.js”
    • 如果我天真地从 package.json 中删除 type:module,它会按预期失败,因为它希望所有内容都是 CommonJS:
      • “语法错误:不能在模块外使用导入语句”

我需要帮助的地方

从我完成的几个小时的阅读/研究来看,这些似乎是我的选择??:

  1. 重写我的代码以使用 CommonJS(不可取,我想使用现代功能/方法)
  2. 设置 babel 或像 WebPack 这样的打包器将我的 ES6 模块转换为 CommonJS,并将转换后的代码转储到 lambda
  3. 使用'esm'

我的问题

  1. 我在自己的代码中“全力以赴”模块是否正确?
  2. 上面哪种方法:#1、#2、#3——或其他什么——是这里最简单的成功途径和“正确”的方法?

谢谢!

Ros*_*don 3

就我个人而言,我会选择转译方法。这样您就可以继续按照您想要的方式编写代码并输出 lambda 满意的内容。

我用 TypeScript 编写 lambda 并编译为 lambda 兼容的 JavaScript (ES2018)。

有各种部署工具 - SAM、无服务器等 - 但看看claudiajs,部署选项可以轻松指定包含入口点的文件以及该文件中的函数名称。

此外,就使用命令行将数据发送到 lambda 而言,这可能来自最终调用 lambda 的事件。此事件可以包含与命令行参数相同的所有信息。