Бессерверные технологии стали чрезвычайно популярными среди так называемых облачных технологий. С обещанием платить только за то, что вы используете, и автоматическим масштабированием, он устанавливает новую планку. Вам не нужно беспокоиться об инфраструктуре, беспокойтесь только о своем коде.

В то же время JavaScript или, точнее, Node.js стал одним из самых популярных языков для написания бессерверных приложений. Для этого, вероятно, есть много причин, но я предполагаю, что популярность JavaScript в бессерверной среде связана с некоторыми из их сходств: оба ориентированы на быстрое время вывода на рынок, и оба особенно популярны. среди разработчиков интерфейса.

Источник: https://lesscodeismore.dev/serverless-typescript/

А как насчет наших проблем?

В 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

В этом шаблоне мы используем два плагина:

Начать

Прежде всего, мы видим, что структура проекта похожа на 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.