Введение

Архитектура приложений NodeJS — это огромная тема с множеством различных подходов. В своей серии статей я собираюсь начать с основ и перейти к, на мой взгляд, хорошей архитектуре приложений. Короче говоря, мы будем использовать NestJS. Этот фреймворк включает в себя все лучшие шаблоны проектирования. Он чрезвычайно эффективен как для небольших микросервисов, так и для крупных приложений. Но настоящая цель состоит в том, чтобы показать все эти закономерности в глубине. Итак, мы будем:

  • Создадим наше первое простое приложение
  • Используйте TypeScript и ознакомьтесь с его синтаксисом
  • Погрузитесь в принципы архитектуры приложений
  • Напишите реальное приложение в NestJS
  • Разверните его с помощью Docker

Что нужно знать, чтобы чувствовать себя комфортно во время чтения? Просто базовые знания JavaScript. Итак, начнем!

Глава 1. Почему TypeScript?

Есть множество статей о преимуществах или недостатках TypeScript. Особенно в мире фронтенда. Но давайте подойдем к этому с точки зрения NodeJS.

Хорошо и плохо

Во-первых, TypeScript — типизированный язык программирования, как можно догадаться из его названия. Что это значит для нас?

  • Подсветка синтаксиса и автозаполнение в IDE избавят вас от ошибок и ускорят разработку.
  • Код гораздо проще поддерживать и тестировать, что ценно в крупных корпоративных приложениях.
  • Рефакторинг! Вы можете сделать это в мгновение ока и не бояться сломать свой код.

Во-вторых, он реализует основные объектно-ориентированные концепции, такие как наследование, инкапсуляция и полиморфизм.
И последнее, но не менее важное — это надмножество JavaScript. Он упрощает
порог входа и не нарушает шаблоны javascript, такие как Dart.

Но за каждую функцию мы должны платить. В этом случае вы заплатите своим временем, потому что вам придется писать больше кода. Вам нужен интерфейс для каждого объекта, типа для любой переменной, параметра или возврата функции. И если вы используете библиотеки, в которых нет типов, вам придется писать их самостоятельно. Но в некоторых случаях вы можете схитрить и использовать любой тип.

Установка и настройка окружения

Прежде всего, давайте создадим пример приложения и углубимся в его структуру. Все, что нам нужно, это VSCode и терминал.

npm init

Здесь мы вводим имя пакета, версию, автора и описание. Эта команда создает файл package.json с основной информацией. Все зависимости нашего приложения будут храниться здесь. Теперь устанавливаем typescript глобально:

npm i -g typescript

И в зависимостях вашего приложения мы устанавливаем типы NodeJS, чтобы мы могли использовать их в вашем приложении:

npm i @types/node --save-dev

Чтобы скомпилировать TS в JS, нам нужно сообщить TypeScript, как мы хотим это сделать, где нам нужны выходные файлы js или какая целевая версия ECMAScript. Нам нужен файл tsconfig.json, который указывает, что это корневой каталог для нашего машинописного проекта. Я объясню каждый вариант компиляции, который мы будем использовать, но эти знания не очень важны для начала:

{
 “compilerOptions”: {
 “module”: “commonjs”, // Specify module code generation
 “declaration”: false, // Do I generate d.ts files?
 “noImplicitAny”: false, // Do I raise an error on expressions and declarations with an implied any type?
 “removeComments”: true, // Remove all comments from bundle
 “noLib”: false, // Do i exclude lib.d.ts?
 “allowSyntheticDefaultImports”: true, // Do I allow default imports from modules with no default export?
 “emitDecoratorMetadata”: true, // Necessary for decorators
 “experimentalDecorators”: true, // Necessary for decorators
 “target”: “es6”, // Specify ECMAScript target version
 “sourceMap”: true, // Do I generate .map files for debugging?
 “outDir”: “./dist”, // Ouput path
 “baseUrl”: “./src” // Base directory to resolve non-relative module names
 },
 “include”: [
 “src/**/*” // Which files to include
 ],
 “exclude”: [
 “node_modules” // Which files to exclude
 ]
 }

Простой пример приложения

Создайте файл index.ts в каталоге src:

mkdir src
cd src
touch index.ts

Затем мы добавим код, создающий хомяка:

Здесь мы объявили класс хомяка и инициализировали его, передав некоторые переменные процесса, такие как его имя и возраст. Затем мы вызываем функцию «introduce», которая заставляет нашего нового друга представиться. Мы используем 2-й и 3-й аргумент процесса, потому что 0 — это путь к узлу, а 1-й — это путь к файлу.

А что, если мы напишем тот же код на JS (es6)?

Как видите, нам пришлось написать больше кода на TypeScript. Здесь мы объявили типы всех переменных, параметров и возвратов. На данный момент VSCode изящно подскажет все параметры и их тип, когда мы создадим нового хомяка:

При рефакторинге мы можем поменять имя переменной в один клик, не боясь сломать код:

Или найдите определение класса или другого объекта из любого файла:

В этом конкретном примере преимущества не так очевидны, но в больших проектах это сэкономит вам много времени.

Но мы отвлеклись. Давайте вернемся к нашему проекту хомяка и, наконец, запустим его.

Запустить с tsc

Чтобы запустить наш проект, нам нужно скомпилировать его в JS и запустить как стандартное приложение NodeJS. Просто беги

tsc

Мы получим скомпилированный файл js и файл .map в каталоге dist.

Затем запустите его:

node dist/index.js Alfred 34

Мы получили вывод Я Альфред, мне 34 года. Я рекомендую использовать этот способ в производстве.

Запуск с node-ts

Когда вы разрабатываете свое приложение, удобно просто запустить его без дополнительного шага компиляции. В этом случае вы можете использовать ts-node, который будет компилировать ваш код во время полета. Ссылка на проект здесь.

Установка:

npm i ts-node --save-dev
npm i typescript --save-dev

Вы можете установить его глобально, но автор этого не рекомендует.
Кроме того, локальная установка TypeScript делает ваш проект более стабильным, поэтому вам не нужно беспокоиться об обновлениях TypeScript и различных версиях на других машинах разработчиков. Теперь мы можем запустить его без компиляции:

./node_modules/.bin/ts-node src/index.ts Alfred 34

Продолжить

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

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