Що таке Ditsmod
Ознайомлення з Ditsmod
Ditsmod є Node.js веб-фреймворком, його назва складається із DI + TS + Mod, щоб підкреслити важливі складові: він має Dependency Injection, написаний на TypeScript, та спроектований для хорошої Модульності.
Головні особливості Ditsmod:
- Модульна архітектура на декораторах, що дозволяє декларативно описувати структуру застосунку.
- Зручний механізм указання та вирішення залежностей між різними класами: ви в конструкторі указуєте інстанси яких класів вам потрібні, а DI бере на себе непросту задачу "як їх отримати".
- Можливість написання власн их розширень (інколи їх називають плагінами), що можуть асинхронно ініціалізуватись, і що можуть залежати один від одного.
- Можливість динамічно додавати та видаляти модулі після старту вебсервера, без необхідності рестарту.
- Має підтримку OpenAPI, та має можливість проводити валідацію запитів на основі метаданих OpenAPI.
- На сьогодішній день, Ditsmod є одним із найшвидших серед Node.js веб фреймворків.
Деякі концепції архітектури Ditsmod взяті з Angular концепцій, а DI побудована на базі нативного модуля Angular DI.
Попередні умови
Будь-ласка, переконайтесь що на вашій операційній системі встановлено Node.js >= v18.14.0.
Встановлення
Базовий набір для роботи застосунку має репозиторій ditsmod/seed. Клонуйте його та встановіть залежності:
git clone --depth 1 https://github.com/ditsmod/seed.git my-app
cd my-app
npm i
У якості альтернативи, ви можете скористатись стартовим монорепозиторієм:
git clone --depth 1 https://github.com/ditsmod/monorepo.git my-app
cd my-app
npm i
Запуск в режимі розробки
Для режиму розробки вам потрібно два термінали. В одному буде компілюватись TypeScript-код у JavaScript-код, а у другому - запускатиметься вебсервер, який після кожної зміни коду підхвачуватиме ці зміни та перезавантажуватиметься.
Команда для першого терміналу:
npm run watch
Команда для другого терміналу:
npm start
Перевірити роботу сервера можна за допомогою curl
:
curl -i localhost:3000
Або просто перейшовши у браузері на http://localhost:3000/.
Звичайно ж, замість двох терміналів можна використовувати, наприклад, ts-node в одному терміналі, але це повільніший варіант, бо після кожної зміни ts-node
буде перекомпільовувати увесь код на льоту заново, тоді як у режимі tsc -w
перекомпільовується лише змінений файл. Окрім цього, завдяки використанню у ditsmod/seed так з ваних Project References і режиму збірки tsc -b
, навіть дуже великі проекти компілюються дуже швидко.
Зверніть увагу, що у репозиторії ditsmod/seed
є чотири конфіг-файли для TypeScript:
tsconfig.json
- базова конфігурація, що використовується вашою IDE (у більшості це мабуть VS Code).tsconfig.build.json
- ця конфігурація використовується для компіляції коду з текиsrc
у текуdist
, вона призначається для коду застосунку.tsconfig.test.json
- ця конфігурація використовується для компіляції коду end-to-end тестів.tsconfig.utin.json
- ця конфігурація використовується для компіляції коду юніт-тестів.
Окрім цього, зверніть увагу, що завдяки тому, що ditsmod/seed
оголошено як EcmaScript Module (ESM), для скорочення шляху до файлів ви можете використовувати нативні аліаси Node.js. Це аналог compilerOptions.paths
у tsconfig
. Такі аліаси оголошуються у package.json
у полі imports
:
"imports": {
"#app/*": "./dist/app/*"
},
Тепер ви можете використовувати його, наприклад у теці test
, ось так:
import { AppModule } from '#app/app.module.js';
На даний момент (2023-10-13) TypeScript ще не у повній мірі підтримує ці аліаси, тому бажано їх продублювати у файлі tsconfig.json
:
// ...
"paths": {
"#app/*": ["./src/app/*"]
}
// ...
У інших tsconfig
-файлах немає сенсу це робити, бо він потрібен лише для вашого редактора коду. Зверніть увагу, що у package.json
аліаси вказують на dist
, тоді як у tsconfig.json
- на src
.
Запуск в продуктовому режимі
Компіляція застосунку та запуск сервера в продуктовому режимі відбувається за допомогою команди:
npm run build
npm run start-prod
Більше прикладів застосунку є у теці examples, а також у репозиторію RealWorld.
Вхідний файл для Node.js
Після встановлення Ditsmod seed, перше, що необхідно знати: весь код застосунку знаходиться у теці src
, він компілюється за допомогою TypeScript-утиліти tsc
, після компіляції попадає у теку dist
, і далі вже у вигляді JavaScript-коду його можна виконувати у Node.js.
Давайте розглянемо файл src/main.ts
:
import { Application } from '@ditsmod/core';
import { AppModule } from './app/app.module.js';
const app = await new Application().bootstrap(AppModule);
app.server.listen(3000, '0.0.0.0');
Після компіляції, він перетворюється на dist/main.js
та стає вхідною точкою для запуску застосунку у продуктовому режимі, і саме тому ви будете його вказувати у якості аргументу для Node.js:
node dist/main.js
Проглядаючи файл src/main.ts
, ви можете бачити, що створюється інстанс класу Application
, а у якості аргумент у для методу bootstrap()
передається AppModule
. Тут AppModule
є кореневим модулем, до якого вже підв'язуються інші модулі застосунку.