我有 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
语句引用本地共享文件。