我目前正在开发一个无服务器项目,其中使用 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 文件?任何指导或示例将不胜感激。谢谢!
我通过使用 lambda 层解决了这个问题。我试图打包一个特定于平台的库(mongodb-zstd)。
您可以按照以下步骤操作:
{
"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"
}
}
现在在您的无服务器文件中,您可以引用 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