Бессерверные технологии стали чрезвычайно популярными среди так называемых облачных технологий. С обещанием платить только за то, что вы используете, и автоматическим масштабированием, он устанавливает новую планку. Вам не нужно беспокоиться об инфраструктуре, беспокойтесь только о своем коде.
В то же время JavaScript или, точнее, Node.js стал одним из самых популярных языков для написания бессерверных приложений. Для этого, вероятно, есть много причин, но я предполагаю, что популярность JavaScript в бессерверной среде связана с некоторыми из их сходств: оба ориентированы на быстрое время вывода на рынок, и оба особенно популярны. среди разработчиков интерфейса.
А как насчет наших проблем?
В Ahamove мы часто используем Javascript с Serverless. Однако написание бессерверных приложений с помощью Javascript имеет некоторые недостатки. Например, мы должны писать повторяющийся код снова и снова. Хотя мы можем создать шаблон для всего проекта, но это плохая идея, потому что эти коды все еще дублируются в нашем исходном коде. Кроме того, мы должны были обновить файлserverless.yml
, когда добавили новую функцию или изменили эти имена - это утомительная задача.
С другой стороны, Javascript - это язык с динамической типизацией. В нем нет проверки типов, автозаполнение работает некорректно и подвержено ошибкам.
Почему мы используем Typescript!
TypeScript решает наши проблемы, отлично работает с бессерверным фреймворком и AWS Lambdas. В нем есть проверка типов, улучшенная поддержка IDE, строгая проверка нуля, классы, интерфейсы, декораторы и т. Д.… И мы можем проверять синтаксические ошибки на этапе разработки.
Что такое внедрение зависимостей (DI)?
Внедрение зависимостей - это метод, с помощью которого один объект предоставляет зависимости другого объекта.
Цитата из Wiki
Что это обозначает? Вместо того, чтобы вручную создавать ваши объекты, за создание объектов отвечает какая-то часть (часто называемая Injector) вашего программного обеспечения.
Представьте себе следующий код:
Это плохо по нескольким причинам, таким как наличие прямых и неизменяемых зависимостей между классами, тестирование было бы действительно сложным, выполнение кода становится очень сложным, повторное использование компонентов становится сложнее, и т. д. Внедрение зависимостей, с другой стороны, внедряет зависимости в ваш конструктор, делая все эти плохие вещи устаревшими: Установка
Не круто.
Используя Injector, отвечающий за создание объектов, вы можете просто сделать что-то вроде:
Лучше
Существует множество причин, почему вам следует внедрять зависимости, в том числе тестируемость, удобство сопровождения, удобочитаемость и т. Д. Опять же, если вы еще не знаете об этом, пришло время изучить что-то важное.
Источник: https://nehalist.io/dependency-injection-in-typescript/
Что мы делаем для решения этих проблем?
Мы решили создать новый фреймворк на основе serverless-plugin-typescript, который также имеет шаблон DI. Мы называем это Ахалесс
Установка
# Step 1: Install serverless globally npm i -g serverless # Step 2: Create service in new folder using a custom template serverless create --template-url https://github.com/lynkxyz/ahaless-template --path hello-cat # Step 3: Go to the folder and install dependencies cd hello-cat && yarn
В этом шаблоне мы используем два плагина:
- @ Ahamove / ahaless (мы объясним это сразу в этом блоге)
- @ Ahamove / serverless-generate-functions (генерирует бессерверные функции на основе
Ahaless
)
Начать
Прежде всего, мы видим, что структура проекта похожа на Angular и NestJS.
У нас есть файл handler.ts
в корневом проекте. Нам нужно импортировать все подмодули в module
root, чтобы Ahaless
знал, какие модули вы хотите использовать. В этом примере мы используем два модуля. Есть DatabaseModule
и CatsModule
. static exports
- это использование глобального объекта экспорта NodeJS для экспорта всех функций в его.
В файле cats.service.ts
мы определяем класс с именем CatsService
. Мы добавляем декоратор @injectable
перед классом, чтобы Ahaless
узнал, что это класс зависимости, и мы можем внедрить его позже. Этот конструктор класса также внедрил службу DatabaseService
.
В файле cats.handler.ts
мы создаем класс с именем CatsHandler
. Декоратор @handler
указывает, что класс является контроллером. В теле класса мы используем эти @get
, @post
декораторы, чтобы эти функции можно было вызывать из методов GET
и POST
. По умолчанию Ahaless
будет использовать имя функции для создания пути API, но если вы хотите использовать собственное имя, вы можете передать имя path
в качестве первого аргумента. Кроме того, вы также можете использовать декораторы @medthod
, @put
, @delete
.
Мы также предоставляем @validator
для проверки аргументов body
и param
. Вы можете ознакомиться с документом класс-валидатор для получения дополнительной информации.
В нашем примере мы определяем, что тело API create_cat
должно иметь name
тип string
. Если ключ name
недействителен или отсутствует. Это вызовет ошибку клиенту.
В конце концов, вам нужно импортировать CatsHandler
и CatsService
в CatsModule
. Вам не нужно устанавливать объект exports
на static exports
в подмодуле. Просто сделайте это в корневом модуле.
Чтобы запустить проект, вы просто запускаете эту команду. Ahaless
автоматически сгенерирует список функций. Тебе это больше не нужно.
Заключение
С Ahaless
мы решили наши проблемы. Мы можем использовать шаблон DI, проверку типов, лучшую поддержку IDE, строгую проверку нуля, классы, интерфейсы, декораторы и так далее. Кроме того, мы можем написать множество бессерверных функций, но нам не нужно писать повторяющийся код. СУХОЙ!!!
Однако у него также есть некоторые недостатки, такие как:
- Асинхронные провайдеры
- Круговая зависимость
- Тестирование
Если вы хотите внести свой вклад в наши проекты или у вас есть какие-либо проблемы, пожалуйста, сделайте свой пул-реквест и создайте новые проблемы на странице Github.