Безсерверная платформа: как добавить внешние пакеты NPM?

Моя ситуация в том, что у меня возникли проблемы с добавлением внешних пакетов NPM в мой проект без сервера (конкретный пакет - геоинформация).

Я пошел в корневую папку проекта без сервера и запустил npm install geopoint --save. package.json обновлен с помощью dependencies": { "geopoint": "^1.0.1" } и node_modules создана папка.

Моя структура папок выглядит так: Корневой-проект-папка
-функции
--geospatial
--- handler.js
- node_modules
--geopoint

В моих функциях /geospatial/handler.js я объявил модуль геодезической с:

    var geopoint = require('geopoint');
    var geopoint = require('../../geopoint');
    var geopoint = require('../../../geopoint');

Консоль lambda возвращает ошибку:

    {
      "errorMessage": "Cannot find module '../../geopoint'",
      "errorType": "Error",
      "stackTrace": []
    }

Как я могу правильно добавить внешние модули NPM в проект без сервера?

Ответ 1

Я думаю, что то, что вы переживаете, такое же, как то, что я переживал недавно. Я могу установить пакеты npm в корневой каталог приложения, но ничто не будет развернуто в лямбда.

Я понимаю, что serverless развертывает все под каждым каталогом компонентов (подкаталог под корнем приложения). В вашем случае под functions.

Я не мог найти много информации в документации без сервера, но то, что я сделал, это определить файл package.json в моей папке functions, а затем запустить установку npm в этом подкаталоге. Затем после развертывания в лямбда, node_modules в этом каталоге также был развернут, что означает, что для моего кода функции может потребоваться любой из этих модулей npm.

Итак, ваша структура папок теперь должна выглядеть так:

root-project-folder
|-functions
|--package.json
|--node_modules
|---geopoint
|--geospatial
|---handler.js
|-package.json
|-node_modules
|--geopoint

Преимущество здесь также в том, что вы можете развернуть только зависимости npm, которые нужны вашим функциям, без тех, которые серверу не требуется развертывать ваши ресурсы.

Надеюсь, это поможет - еще раз не уверен, что это лучшая практика, только то, что я делаю, потому что это не документировано нигде, что я мог бы найти в репозитории без сервера или в любом примере кода.

Ответ 3

Вы можете сделать следующее:

# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.

Справочный документ