Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Вийшла нова версія Ditsmod — 2.0 (із RealWorld прикладами)

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Для тих, хто не знайомий з Ditsmod, це NodeJS фреймворк, написаний на TypeScript. На офіційному сайті можна прочитати більше технічних характеристик цього фреймворка.

Швидкий старт

Щоб почати працювати з Ditsmod 2.0, ви можете клонувати ditsmod/seed:

git clone --depth 1 https://github.com/ditsmod/seed.git my-app
cd my-app
npm i

Також ви можете проглянути Ditsmod застосунок, що містить реальний приклад (CRUD, авторизація, інші патерни), де реалізовано так званий RealWorld spec and API.

Хоча вже вийшла друга версія Ditsmod, але більшість користувачів взагалі не знайомі з цим фреймворком, отже я спробую тут презентувати його в загальних рисах, як в перший раз.

Головні особливості Ditsmod:

  • Модульна архітектура на декораторах, що дозволяє вам декларативно описувати структуру застосунку.
  • Зручний механізм вказання та вирішення залежностей між різними класами застосунку: в конструкторі ви вказуєте інстанси яких класів вам потрібні, а DI бере на себе непросту задачу «як це отримати».
  • Можливість писати власні розширення (інколи їх ще називають плагінами), що можуть асинхронно ініціалізуватись та залежати одне від одного.
  • Можливість динамічно додавати та видаляти модулі після старту вебсервера без необхідності рестарта.
  • Має підтримку OpenAPI та можливість робити валідацію HTTP-запитів, використовуючи метадані OpenAPI.
  • На сьогодні Ditsmod є одним із найшвидших серед Node.js веб-фреймворків.

Приклад контролера:

  import { controller, Res, route } from '@ditsmod/core';

  @controller()
  export class HelloWorldcontroller {  
    @route('GET')
    tellHello(res: Res) {
      res.send('Hello World!');
    }
  }

Приклад модуля, що має контролери:

  import { featureModule } from '@ditsmod/core';

  import { Articlescontroller } from './articles.controller.js';
  import { CommentsModule } from './comments/comments.module.js';
  import { DbService } from './db.service.js';
  import { FavoriteModule } from './favorite/favorite.module.js';
  
  @featureModule({
    imports: [
      { path: 'comments', module: CommentsModule },
      { path: 'favorite', module: FavoriteModule },
    ],
    controllers: [Articlescontroller],
    providersPerReq: [DbService]
  })
  export class ArticlesModule {}

Приклад модуля, що має одні лише сервіси:

  import { featureModule } from '@ditsmod/core';
  import { JwtModule } from '@ditsmod/jwt';
  
  import { AuthService } from './auth.service.js';
  import { BearerGuard } from './bearer.guard.js';
  import { ModuleConfigService } from './config.service.js';
  import { CryptoService } from './crypto.service.js';
  import { PermissionsGuard } from './permissions.guard.js';
  
  const jwtModuleWithParams = JwtModule.withParams({ secret: process.env.JWT_SECRET, signOptions: { expiresIn: '1y' } });
  
  @featureModule({
    imports: [jwtModuleWithParams],
    providersPerMod: [ModuleConfigService],
    providersPerReq: [BearerGuard, CryptoService, AuthService, PermissionsGuard],
    exports: [BearerGuard, CryptoService, AuthService, PermissionsGuard]
  })
  export class AuthModule {}

Ditsmod vs NestJS

Ditsmod схожий на NestJS тільки через те, що обидва ці фреймворки у своїй архітектурі мають схожі концепції із Angular. Але Ditsmod під капотом не має Express, Fastify чи іншого фреймворку. Ditsmod на 11% швидший за NestJS+Fastify, при умові що інстанси контролера створюються за кожним запитом. І більш ніж удвічі швидший за NestJS+Express. Ditsmod також споживає значно менше пам’яті у порівнянні із NestJS.

Завдяки системі розширень, застосунки Ditsmod є більш експресивними, а тому потребують написання меншого об’єма коду. Наприклад, якщо ви порівняєте модулі OpenAPI, написані на Ditsmod та NestJS, виявиться, що модуль Ditsmod більше ніж у 3,5 рази менший за кількістю рядків коду та кількістю файлів.

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Спробував використати AsyncLocalStorage для передачі контексту запиту чисто за ради експерименту, але не побачив помітних переваг. Можливо я ще глибоко не розібрався, але на скільки я зрозумів, головна вигода від використання asyncLocalStorage.run(requestContext, callback) у тому, що ми контекст запиту не передаємо явно як аргумент до middleware чи методу контролера. Разом з тим, нам все ще потрібно передавати інстанс asyncLocalStorage. Тобто ми можемо безпечно використовувати контролер-сінглтон для роботи з контекстом запиту, але нам потрібен інстанс asyncLocalStorage щоб отримати цей контекст запиту.

Виявилось що працює цей варіант майже так само за швидко, як і варіант передачі контексту в контролер, інстанс якого створюється за кожним запитом. Тому цю фічу я не залишив. Можливо вигоду від неї можуть отримати фреймворки, які не мають Dependency Injection...

До речі, ще забув сказати, що починаючи з v2.50, Ditsmod йде у форматі ESM, завдяки чому холодний старт «Hello, World» скоротився до 20-30 ms, а також стали доступними нативні subpath-аліаси NodeJS.

У статистиці скачувань Ditsmod з’явилась позитивна динаміка. Його почали стабільно скачувати у середньому 40-50 разів за тиждень. Після релізів завжди кількість скачувань збільшується десь на 60 разів за тиждень для кожного релізу. Але на даний момент, останній реліз v2.51.2 був місяць назад, тобто 40-50 разів скачувань — це вже «чистими».

На github Ditsmod вже має 66 зірочок. На даний момент я його, можна сказати, стабілізую. Тобто збільшую покриття тестами, рефакторю без breaking changes, додаю більше документації.

Просто хочу повідомити про поточні здобутки Ditsmod:
1. Ditsmod має найкращу композитну оцінку на сайті TechEmpower серед бекенд-фреймворків на базі Node.js. Щоправда є кращі результати серед JavaScript-фреймворків, але якщо брати середовище виконання Node.js, то Ditsmod показує кращі результати навіть за Fastify. Результати швидкодії Ditsmod різко покращились після версії 2.50, у якій додалась можливість робити контролери сінглтонами.
2. На github Ditsmod вже має 64 зірочки.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Якщо ви питаєте за тести при розробці Ditsmod, то так, вони є, йдуть із закінченням *.spec.ts, наприклад, github.com/...​e/src/application.spec.ts, використовую jest.

Та я троллю)
Вы все таки известный в узких кругах ценитель Неста)

А, ясно. Ну після того як ви побачили кількість помилок в Pull Request, як ви вважаєте, грубо було з мого боку писати «Tests are written with numerous gross mistakes»?

Не сумнівався у такій вашій відповіді. Дасте лінк на ваш github-профіль? Там можна побачити хоча б десятки зірочок за ваші проекти?

Не знаю які у вас там профілі на github, але я можу хоча б похвалитись що у мене 128 зірочок на одному проекті, 78 — на іншому, 16 — ще на іншому. Я контрибутив для таких проектів як PHP, Twitter Bootstrap, Angular, VS Code, TypeScript і ще купа інших проектів, які я вже й не пам’ятаю. Я знаю як працювати в open source і яка там має бути культура дуже добре, не треба мене вчити цьому.

у вас в голові зірочка дірочка)

На жаль, на ДОУ тролів, типу вас, дуже багато. Це показує і та тема, звідки ви взяли цю цитату. Там більшість коментаторів та лайкерів проявили свою непрофесійність та некомпетентність, особливо це стало очевидним після згаданого вище Pull Request’у, де таки стали явними ті численні та грубі помилки, про які я писав.

Ну нічого, на своєму майбутньому ресурсі (аналог хабра) я блокуватиму представників русского мира, а це мабуть десь біля 80% від усіх тролів на ДОУ.

P.S. Решту тролів залишу щоб трафік веселіший був =).

на своєму майбутньому ресурсі

Представляю как вы наводите порядок на своём ресурсе аналоге Гитхаба)

На щастя, на github відсоток представників русского мира мізерний, тому створювати аналогічний ресурс не має сенсу.

А на вашем-то откуда возьмутся?)

най буде, най пробують звичайно, але..., як на мій хлопський розум, react, angular, vue, svelte можуть не хвилюватись і навряд чи будуть запозичувати якісь рішення у Ditsmod... Чи хтось вважає інакше?

Нагадаю, Ditsmod — це бекенд фреймворк, причому він не претендує на нові концепції в програмуванні на TypeScript, він застосовує вдалі концепції Angular.

Підписатись на коментарі