Как разделить код между лямбда-функциями Netlify
У меня есть 3 отдельные функции, каждая в своих папках. Все они используют клиент Twilio и клиент Apollo для работы с SMS и сервером GraphQL соответственно.
Вместо того, чтобы иметь весь код для создания экземпляра каждого клиента (получить ключи из env и т. Д.) В каждом файле, можно ли его где-то поместить и потребовать?
Я попытался поместить код в файл.js в папке functions/ верхнего уровня и потребовать его в коде функции, как показано ниже, и это отлично работает локально на 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.
...
4 ответа
Я добился успеха с таким подходом.
Краткий ответ:
Создайте файл utils в папке функций и потребуйте его в файлах функций.
Длинный ответ:
Мой
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
или разверните его. Журналы ваших функций или терминал должны сказать «привет, мир».
Мой сайт netlify развертывается с GitHub.
Я добился некоторого успеха (локально и вживую), поместив общие модули в локальный пакет npm:
/functions
/utils
package.json
index.js
/src
/auth
auth.js
/trails
trails.js
package.json
Экспорт всех распространенных модулей в functions/utils/index.js
и установить свойство "main": "index.js"
в functions/utils/package.json
.
В 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
Где auth, scripts, receive-sms и stripe - мои лямбда-функции.
я имею "prebuild": "sh scripts/prebuild.sh"
в моем корне package.json
что выглядит так:
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 в каждую папку лямбда-функций и запускаю yarn
для установки своих зависимостей.
Затем в моих папках с функциями я могу использовать код utils, просто импортировав из локального /utils
папка ie const apolloClient = require('./utils/apolloClient');
Я также gitignore скопированный /utils
папки, поэтому git отслеживает только основную версию утилит.
Как я уже сказал, это далеко не идеально, но работает, хотя я надеюсь, что приведенный выше ответ сработает для меня.
Для всех, кто столкнулся с этой проблемой: Netlify добавила поддержку esbuild еще в апреле 2021 года. Конкретным изменением, которое мне нужно было добавить в свой проект, была конфигурация, приведенная ниже в моемnetlify.toml
файл:
[functions]
node_bundler = "esbuild"
После этого я смог ссылаться на локальные общие файлы через esmodulesimport
/export
операторы или через commonjsrequire
заявления.