如何在 Serverless ESBuild 中添加 Node Loader 来解决“.node”文件错误?

问题描述 投票:0回答:1

我目前正在开发一个无服务器项目,其中使用 ESBuild 来捆绑 AWS Lambda 函数的 JavaScript 代码。到目前为止,一切都很顺利,但我遇到了一种情况,我需要加载 ESBuild 本身不支持的 Node.js 模块。

每当我运行 serverless package 命令时,都会遇到以下错误:

✘ [ERROR] No loader is configured for ".node" files: node_modules/.pnpm/[email protected]/node_modules/nodejs-polars-darwin-arm64/nodejs-polars.darwin-arm64.node

具体来说,我需要使用 Node.js 模块加载器来加载包含具有 .node 扩展名的本机绑定的模块。然而,ESBuild 似乎并不支持开箱即用,而且我不确定如何配置它以与自定义 Node.js 模块加载器一起使用。

我读过有关 Webpack 的类似问题,您可以在其中使用 node-loader 包来加载 Node.js 模块,但我不确定如何在无服务器环境中使用 ESBuild 实现相同的结果。

是否有人成功配置 ESBuild 以使用自定义 Node.js 模块加载器来解析无服务器上下文中的 .node 文件?任何指导或示例将不胜感激。谢谢!

javascript node.js webpack serverless-framework esbuild
1个回答
0
投票

我通过使用 lambda 层解决了这个问题。我试图打包一个特定于平台的库(mongodb-zstd)。

您可以按照以下步骤操作:

  • 创建一个新的节点项目
  • 在 package.json 中添加要作为 lambda 层上传的包
{
    "name": "nodejs",
    "version": "1.0.0",
    "main": "index.js",
    "license": "MIT",
    "dependencies": {
        "@mongodb-js/zstd": "^1.2.0",
        "@mongodb-js/zstd-linux-arm64-gnu": "1.2.0"
    }
}
  • 压缩项目,包括node_modules
  • 从 AWS 控制台上传 zip 作为 lambda 层:Lambda -> 其他资源 -> 层 -> 创建层

现在在您的无服务器文件中,您可以引用 lambda 层:

functions: {
        hello: {
            handler: 'handlers.hello',
            timeout: 30,
            layers: [`arn:aws:lambda:region:\${self:custom.accountId.\${self:custom.stage}}:layer:mongo-zstd`],
        }
    }

参考资料:

https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html https://www.serverless.com/framework/docs/providers/aws/guide/layers

© www.soinside.com 2019 - 2024. All rights reserved.