Dwa błędy

Ten post został napisany ponad 2 lata temu, do wszystkich porad technologicznych w nim zawartych lepiej będzie podejść z dużą rezerwą, bo bardzo możliwe że tego rodzaju informacje są już nieaktualne.

Opublikowano: 16.03.2021

Ostatnia modyfikacja: 07.02.2024

javascript

programowanie

unbundled

Pomysł wydawał się na pierwszy rzut oka przedni - poćwiczę sobie parę rzeczy, robiąc przy okazji jakiś projekt edukacyjny. Na backendzie to miał być asynchroniczny Python, na frontendzie unbundled + TypeScript. O ile backend poszedł gładko i z co najwyżej drobnymi przeszkodami, to na froncie wpakowałem się w niezły szajs.

B-Cz

Plan był taki, żeby przećwiczyć na raz 2 rzeczy: unbundled (czy jak to niektórzy mawiają buildless) i TypeScript. Wydawałoby się, że jak coś jebnie, to jedno z dwóch i się bez ceregieli wygrzebię, ale okazało się, że jebły oba aspekty i nagle znalazłem się w otchłani.

No dymanic

Po pierwsze, nie leży mi TypeScript. Sądziłem początkowo, że będzie to miły dodatek, jak annotations w Pytągu, ale nie. Jest co prawda fajna wartość dodana w edytorze ze wsparciem (jak np. w VS Code), czyli mam informację o spodziewanych typach argumentów i zwracanych wartości, ale nie jest to opcjonalne. Inaczej mówiąc, TypeScript robi z JavaScriptu język typowany całkowicie statycznie. Nie opcjonalnie, nie w formie sugestii, tylko po prostu wymusza deklarację typów wszystkiego naokoło (czasem wymusza zaniechanie adnotacji, ale z dokładnie tą samą manierą). Dla człowieka który od kilkunastu lat z upodobaniem używa dynamic dispatch jest to po prostu niezrozumiałe, jak można z tego zrezygnować na własne życzenie.

Nie mam nic przeciwko statycznemu typowaniu, jestem nawet w stanie zaakceptować brak odzwierciedlania, jak w Darcie. Tylko nie w JavaScripcie. Bo TS tak naprawdę jest wciąż tym samym JavaScriptem, tylko z nałożonym zespołem kagańców. Komu to pasuje? Doskonale wiadomo komu - wielkim korporacjom piszącym miliony linii kodu miesięcznie, w których każda godzina jest płatna setkami dularów, tiko że nie nie jestem jednym z nich. Jako człowiek robiący dla siebie mam inne priorytety, a najważniejszy z nich jest fun. TypeScript is no fun. Nawet jeżeli miałoby to przynieść jakiś walor edukacyjny.

Bundle it, FFS

TypeScript był porażką mentalną, ale to co wyszło ze Snowpacka, to jest porażka technologiczna po całości.

Co jest najważniejszym narzędziem programisty? Tak, wiem, napisałem kiedyś, że klawiatura, ale teraz chodzi mi o coś innego - co jest najważniejsze przy pisaniu programów?

Najważniejszy jest debugger. Ten mały programik, który pozwala po podłączeniu się do wykonywanego procesu zobaczyć, co tak naprawdę się w nim dzieje pod maską. W Pytągu jest PDB (i jego usprawnione klony), nawet do JavaScriptu jest taki, co pozwala podłączyć się do procesu wykonującego kod JS w przeglądarce (Chrome, Firefox).

Tylko że on - jak się używa Snowpacka - nie działa. Jak sprawdziłem, tak samo nie działa również z Vite. Można się zaczaić w devtoolsach przeglądarki, ale to co przeglądarka wykonuje to zupełnie nie jest to, co żeśmy napisali. Ani żaden człowiek. Czyli mówiąc krótko, przy unbundled (przynajmniej przy użyciu Snowpacka lub Vite) debugger nie działa w sposób, który byłby użyteczny dla programisty. Nie ma czarniejszej dupy ponad to. Rozumiem co się tam dzieje, i rozumiem też dlaczego tak się dzieje - każdy kod który nie jest natywny musi ostatecznie do przeglądarki zostać wysłany jako natywny, dlatego narzędzia takie jak Snowpack czy Vite muszą jednak przetłumaczyć ten JSX na zwykły JavaScript. To co widać w debuggerze to jest efekt tego tłumaczenia, bardziej lub mniej czytelny, ale jednak nie to co zostało napisane przez programistę.

Way out of this mess

I teraz jakoś należałoby się z tego wygrzebać, ale tak, żeby nie pogrążyć całego projektu, bo oprócz aplikacji webowej są jeszcze dwa kawałki, które warto byłoby zrobić. A jeden z nich jest nawet fajniejszy niż cała reszta razem wzięta.

Najpierw pozbędę się TypeScriptu. Mam na tę chwilę jako-tako działający kod, który tylko trzeba lekko przerobić, by stał się prawilnym JavaScriptem. Możnaby do tego dodać wyłączenie kompilatora TS, ale to nie ma sensu, bo ostatecznie i tak go nie będzie. Dlatego tylko zmienię rozszerzenia plików, włączę dopuszczalność żywego JS w tsconfig.json i będziemy nad tym zagadnieniem pracować dalej.

Dopiero potem zacznę się wygrzebywać ze Snowpacka. Myślę, że żeby nie pogrzebywać od razu całego projektu, to po drodze mogę spróbować jakiegoś jeszcze innego unbundlera, np. WMR. Ma on co prawda kilka mankamentów, które jednak w przypadku tej aplikacji nie będą jakoś mocno przeszkadzać. A jeżeli z tym się nie uda, to postaram się wrócić do Webpacka 4, czyli zwykłego uruchomieniowego środowiska programistycznego dla Preacta.

I tak zapewniłem sobie hobbistyczne zajęcie na następne 2 tygodnie. W końcu czy nie o to właśnie chodzi?