Nest.js - wyciekająca magia

Robię sobie HelloWorldzik w Nest.js, żeby zobaczyć, o co cały szum. Bo podobno to jakiś nowoczesny framework w Node.js, który obudowuje Express/Fastify i na tym kładzie swoją architekturę.

I wiecie co? Rzeźnia to jest. Ale o tym za chwilę. Na razie wspomnę o tym, że jest to napakowane wzorcami jak Angular (zresztą było to inspirowane Angularem). Ale żeby tylko. Wzorce projektowe wcale nie są trudne. Mam nawet wrażenie, że Nest.js mający opinię chyba trudnego frameworka, wydaje mi się tutaj dość łatwy pod kątem architektury (wcześniej czytałem dokumentację i w miarę przejrzyste to było).

No dobra, to gdzie ta rzeźnia? W niepotrzebnej magii i opieranie wszystkiego o jakieś magiczne dekoratory i magiczny sposób, w jaki są wstrzykiwane rzeczy do klas.

Przy czym starałem się zrozumieć i wykorzystać moc wstrzykiwania. Więc widząc sposób, w jaki deklaruje się route'y nawet się ucieszyłem, wygląda łatwo, mamy dekorator @Get i tam można dać ścieżkę, np. hello/:name, żeby kontroler złapał parametr name:


  @Get('hello/:name')
  getHello1(params): string {
     return params.name;
  }

Wszystko fajnie, tylko to nie zadziała z automatu. Musisz ręcznie (ironio losu) dodać jakiś specjalny dekorator do argumentu:


getHello1(@Param() params): string {

BTW o ile znam mniej lub bardziej TypeScript, to ta opcja w TS, żeby dodawać dekoratory do parametrów, wydaje mi się dość magiczna i nie wiem, czy w ogóle potrzebna w języku, poza tym, że zaciemnia ona kod.

A więc - miała być magia - ale trochę chyba nie działa.

Ale idźmy dalej - ku serwisom. Nest.js wrażenie frameworka w pełni zautomatyzowanego, więc co zrobiłem? Utworzyłem prosty serwis, zaimportowałem go i na czuja dodałem do argumentu w konstruktorze, na podobieństwo tego, co już było w kodzie startowym:


   constructor(
      private readonly appService: AppService, 
      mojeService: MojeService) {}  
   

i nie zadziałało. Ale przypomniałem sobie z dokumentacji, że każdy serwis trzeba zarejestrować w providerach i tak też zrobiłem. Trochę zabawnie swoją drogą. Magia wspomagana ręcznie XD

Ale nawet dodanie providera nie wystarczyło. Otóż zgadnijcie co z tym kodem jest nie tak? Czemu appService się wstrzykuje, a mojeService nie?

Szybko zauważyłem, że mojeService zostało zadeklarowane bez `private readonly`, więc eksperymentalnie dodałem też takie adnotacje do swojego serwisu. Nie ma to wiele sensu, ale nic nie tracę.

i co się okazało? Z jakichś dziwnych powodów, żeby się wstrzyknęło, serwisy muszą być albo private albo readonly albo jedno i drugie. Nie ma to wiele sensu, ale tak zrobili. Wyciekająca abstrakcja?


   constructor(
     private readonly appService: AppService, 
     readonly mojeService: MojeService) {}  

Ogólnie więc dziwię się, że ten framework zdobywa taką popularność, ponieważ:

  • wyciekająca magia powodująca WTFy. Taka magia jakby świeżo upieczonego ucznia Hogwartu, który jeszcze nie umie jej kontrolować
  • sprawia wrażenie Angulara (który ma złą opinię, co widać w takich zestawieniach jak State of JS)
  • Sposób pisania trąci myszką, jakbym się cofnął w czasie, robienie rzeczy naokoło, dziwaczne adnotacje. I nie mówcie, że to architektura, wzorce, bo nawet iść we wzorce można bardziej normalnie, a architektura kodu nie polega na używaniu dekoratorów do wszystkiego

Nie zdziwię się więc, jak za jakiś czas Nest.js albo przestanie być popularny (może nie wiem, jacyś Javowcy będą się nim tylko interesować, bo oni lubią takie starodawne podejście do programowania), albo jego twórcy zmienią podejście i zrobią nową wersję w mniej przeinżynierowany sposób.

Jak na razie jednak Nest.js wydaje się zdobywać popularność, więc jak na 2023, to myślę, że warto go poznać, żeby po prostu znać i móc w nim pracować, jeśli będzie taka potrzeba. Chociaż mam wrażenie, że będzie to kolejna technologia, która stanie się szybko legacy (no ew. może programiści Javy będą ją kultywować, bo będą mogli pisać wszystko naokoło i z dekoratorami "tak jak w Javie"). Tak jak to z Angularem jest. Zawsze będzie pewna grupa małowymagających programistów, którzy nie chcą poznawać nowych podejść, tylko chcą pisać tak jak się pisało z 20 lat temu i tak jak zawsze pisali w Javie.

Komentarze

  1. Dosyć odważne tezy stawiasz.
    Właściwie, wbrew opinii większości.
    To bardzo lubiany framework i chyba najbardziej popularny.
    Oczywiście nie twierdzę, że nie masz racji.

    OdpowiedzUsuń
    Odpowiedzi
    1. cóż, myślę, że czas pokaże, czy mam rację. Jak na razie Nest.js pewnie będzie popularny przez jakiś czas, ale jednak podobne rozwiązanie na frontendzie (Angular) zbiera głosy krytyki, więc czemu Nest.js miałby być lepszy?

      Usuń
    2. Wydaję mi się, że Nest jest świetnym rozwiązaniem do dużych projektów, które out of the box dają Ci ustrukturyzowanie dzięki czemu trudniej będzie coś sknocić jeśli chodzi łatwość w odnalezieniu się na projekcie.

      Usuń

Prześlij komentarz

Popularne posty z tego bloga

Dlaczego nie da się nadgonić frontendu

Absurdy Rekrutacji 2023

Przygody juniora (1)