如何在 Netlify lambda 函数之间共享代码



我有 3 个单独的函数,每个函数都在各自的文件夹中。它们都使用Twilio客户端和Apollo客户端分别处理SMS和GraphQL服务器。

与其在每个文件中拥有所有代码来实例化每个客户端(从 env 等获取密钥(,不如将其放在某个地方并需要它吗?

我尝试将代码放入顶级 functions/文件夹中的.js文件中,并要求它在函数代码中如下所示,这在本地netlify dev上运行良好,但在实时环境中调用函数时Module not found '../twilioClient'错误。

/functions
apolloClient.js
twilioClient.js
package.json - specifying deps used by above files
/auth
auth.js - require('../apolloClient')
...
/trails
trails.js - require('../twilioClient') etc.
...

我在这种方法上取得了成功。

简短的回答

在函数文件夹中创建一个实用程序文件,并在函数文件中需要它。

长答案

我的netlify.toml文件如下所示:

[build] 
functions = "./functions"

functions文件夹:

/functions
function-1.js
function-2.js
utils.js

utils.js

exports.helloWorld = () => {
console.log('hello world')
}

function-1.js

const {helloWorld} = require('./utils')
exports.handler = async (event) => {
helloWorld()
}

要对其进行测试,请执行以下操作

运行netlify dev或部署它。 您的函数日志或终端应显示"hello world"。

我的网络网站从GitHub部署。

我确实在将共享模块放入本地 npm 包中取得了一些成功(本地和实时(:

/functions
/utils
package.json
index.js
/src
/auth
auth.js
/trails
trails.js
package.json

导出functions/utils/index.js中的所有常用模块,并在functions/utils/package.json中设置属性"main": "index.js"

functions/package.json安装模块:

{
"dependencies": {
...
"utils": "file:utils"
}
}

并将其导入您的函数(functions/src/auth/auth.js(:import { apolloClient, twilioClient } from "utils"

请查看此存储库以供参考。

在我有机会尝试@nomadoda的答案之前,发布我的临时解决方案以防有帮助。

我的函数文件夹如下所示

/functions
/utils
apolloClient.js
twilioClient.js
/receive-sms
/auth
/stripe
/scripts

其中身份验证、脚本、接收短信和条纹是我的 lambda 函数。

我的根package.json中有"prebuild": "sh scripts/prebuild.sh",如下所示:

cp -rf functions/utils functions/receive-sms
cp -rf functions/utils functions/auth
cp -rf functions/utils functions/scripts
cp -rf functions/utils functions/stripe

这也是我cd到每个lambda函数文件夹并运行yarn以安装其依赖项的地方。

然后在我的函数文件夹中,我可以通过简单地从本地/utils文件夹导入来利用 utils 代码,即const apolloClient = require('./utils/apolloClient');

我也 gitignore 复制的/utils文件夹,因此 git 只跟踪 utils 的主版本。

正如我所说,它不太理想,但确实有效,尽管我希望上面的答案对我有用。

对于其他偶然发现此问题的人,Netlify 早在 2021 年 4 月就增加了对 esbuild 的支持。我需要添加到项目中的具体更改是我的netlify.toml文件中的以下配置:

[functions]
node_bundler = "esbuild"

之后,我能够通过 esmodulesimport/export语句或通过 commonjsrequire语句引用本地共享文件。

最新更新