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

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

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

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

В моих functions / geospatial / handler.js я объявил модуль geopoint с помощью:

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

Лямбда-консоль возвращает ошибку:

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

Как правильно добавить внешние модули NPM в проект Serverless Framework?


person taptipblard    schedule 11.05.2016    source источник
comment
Почему вы вообще пытаетесь разрешить ../geopoint и ../../geopoint? Это что-то особенное для Serverless?   -  person E_net4 the curator    schedule 12.05.2016


Ответы (3)


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

Я понимаю, что без сервера все развертывается в каждом каталоге компонентов (подкаталог в корне приложения). В вашем случае под 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, которые нужны вашим функциям, без тех, которые бессерверно необходимы для развертывания ваших ресурсов.

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

person e_m0ney    schedule 11.05.2016
comment
Привет, спасибо за ответ, но я нашел другой способ. В s-functions.json функции я отредактировал строку "handler": "handler.handler" на "handler": "functions/geospatial/get_bounding_coordinates/handler.handler",, чтобы она установила корень функции в каталог узловых модулей. - person taptipblard; 12.05.2016
comment
Привет. Да, спасибо, что отправили это. Я обнаружил, что пока ваше предложение сработало, sls dash deploy занял намного больше времени, потому что он также пытался связать зависимости разработки из моей корневой папки node_modules. Хотя я мог бы использовать npm prune --prod, я думаю, что оставлю второй node_modules, который я использую в своем ответе, для более быстрого развертывания и отсутствия необходимости сокращать зависимости разработчиков каждый раз при развертывании. - person e_m0ney; 16.05.2016
comment
Вы правы, что отредактировать значение, используемое для атрибута обработчика, - это правильный путь. Вы должны иметь возможность структурировать свои функции таким образом, чтобы вы могли сохранять node_modules очень специфичными (как хотите) для данной функции (функций). Например, у меня есть package.json для моего основного проекта, а затем два дополнительных файла package.json, по одному для каждого набора лямбда-функций. - person Mikelax; 27.05.2016
comment
Отличный вызов @Mikelax, все, что угодно, чтобы размер каждой лямбда-функции был как можно меньше, на мой взгляд, хорошо. - person e_m0ney; 01.07.2016

Для меня лучшим решением был плагин Serverless: serverless-plugin-include-dependencies

serverless-plugin-include-dependencies

person Maximi    schedule 05.12.2017
comment
Могу подтвердить это. Работал безупречно - person Jens Væver Hartfelt; 02.09.2019
comment
У меня тоже сработало! - person lmgonzalves; 25.09.2020

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

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

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

person Marcin Rapacz    schedule 21.06.2019
comment
Это круто! Спасибо чувак. - person Joimee Cajandab; 03.07.2021