Как разделить код между лямбда-функциями 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заявления.

Другие вопросы по тегам