Przegląd i Konfiguracje narzędzi
3 godz. 49 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykAktualnie trudno wyobrazić sobie pracę w ekosystemie JavaScriptu bez terminala. W pierwszym rozdziale kursu nie tylko dowiesz się o dostępnych na rynku narzędziach oraz rozszerzeniach ale także o sposobach ich konfiguracji, uwzględniających przykłady z codziennej pracy, w tym wykorzystanie GPT-3 do łatwiejszej obsługi terminala.
Dla osób, które programują, IDE (Integrated Development Environment) niemal zawsze stanowi najważniejsze narzędzie pracy. Pomimo tego, że na rynku dostępny jest bardzo dobry Visual Studio Code, w tym kursie poznasz bliżej płatne narzędzia firmy JetBrains, które w wielu przypadkach sprawdzą się nieporównywalnie lepiej. Dobrze skonfigurowane IDE potrafi "zrozumieć" Twój kod na tyle, aby skutecznie Ci pomagać w pisaniu kodu, pracy zespołowej czy debugowaniu aplikacji.
Poza narzędziami bezpośrednio związanymi z programowaniem, istnieje szereg aplikacji które pomagają w codziennej pracy. Mowa o pracy koncepcyjnej, sandboxach, organizacji wiedzy, zadań, kalendarza, poczty czy nawet sięganie po narzędzia no-code / low-code. W tym kursie znajdziesz przegląd tych, które mają duży sens z punktu widzenia full-stack'a, aczkolwiek pamiętaj że każde z nich posiada też różne alternatywy, które mogą bardziej przypaść Ci do gustu.
Kolejnym niezbędnym elementem w programowaniu, są różnego rodzaju zależności projektu oraz narzędzia instalowane na komputerze czy serwerach, w celu ułatwienia pracy lub wręcz jej umożliwienia. Poza tym poruszymy też temat własnych skryptów a nawet tworzenia CLI w Node.js na własne potrzeby.
Tworzenie aplikacji w JS charakteryzuje konieczność wykorzystywania różnego rodzaju narzędzi, umożliwiających m.in. transpilowanie oraz optymalizację kodu. Obecnie jednym z najlepszych wyborów jest Vite i to na nim skupimy się najbardziej, łącząc go nie tylko z samym JavaScriptem ale także frameworkami CSS (konkretnie Tailwind CSS).
Ten kurs powstał z myślą o osobach pracujących w ekosystemie JavaScriptu. Jest to szybkie przegląd dostępnych na rynku narzędzi oraz przykładów ich praktycznego wykorzystania w codziennej pracy. Jeżeli szukasz inspiracji, nowych narzędzi lub sposobów usprawnienia codziennych zadań — w tym kursie je znajdziesz.
W tej lekcji załóżmy już, że mamy naszą aplikację skonfigurowaną w sposób, który w
pełni odpowiada na nasze developerskie potrzeby.
Jednocześnie mamy tutaj komfort pracy wynikający z tego, że np.
zmiany odzwierciedlane są natychmiast i
dodatkowo różnego rodzaju narzędzia wspierają nas w pisaniu kodu.
Jednocześnie prędzej czy później nadchodzi
czas, w którym nasza aplikacja musi zostać opublikowana i w takiej sytuacji mamy
potrzebę jej zbudowania, czyli zasadniczo wygenerowania specjalnej wersji
pozbawionej wszelkich developerskich elementów oraz jednocześnie
zoptymalizowanej właśnie pod kątem produkcji.
I teraz w tym kontekście jest przynajmniej
kilka elementów, o które musimy zadbać, a jednocześnie dobra wiadomość polega tutaj na
tym, że w przypadku Vite i polecenia build mamy tutaj w zasadzie
większość elementów, o które może nam chodzić na produkcji.
Czyli tak jak widzisz teraz nasza
aplikacja została zbudowana i wersja dist pojawiła się w naszym katalogu.
Oznacza to, że wszystkie assets są zminifikowane, odpowiednio
zoptymalizowane oraz dodatkowo pojawiły się tutaj zmodyfikowane nazwy plików.
Tutaj muszę szczerze przyznać, że
osobiście spędzałem wiele godzin nad tym, aby doprowadzić do podobnego efektu Webpacka
i wielokrotnie męczyłem się z jego konfiguracją, aby zadbać o wszystkie takie
detale, jak chociażby wspomniane modyfikowanie nazw plików.
Swoją drogą, jeżeli nie wiesz dlaczego tak się dzieje, no to w skrócie chodzi o to,
że większość plików takich jak CSS oraz JavaScript są przechowywane w pamięci
podręcznej przeglądarki i kluczem jest tutaj nazwa tego pliku.
Oznacza to, że jeżeli za każdym razem serwujemy plik indx.js użytkownikowi,
to w ramach domeny naszej aplikacji ten plik właśnie trafia do pamięci podręcznej
i dzięki temu za każdym razem użytkownik nie musi go pobierać.
Jednocześnie w momencie, gdy udostępniamy nową wersję naszej aplikacji, to jego
przeglądarka o tym nie wie i tym samym dochodzi do sytuacji, w której np.
backend różni się od tego, co mamy na froncie
a to generuje problemy, ponieważ niektóre
funkcje przestają działać, a innych po prostu nie ma.
W takiej sytuacji często zdarzane są, że są błędy, których w praktyce nie ma, a i tak
trzeba poświęcić czas na obsłużenie takiego zgłoszenia.
Z tego powodu Vite rozwiązuje ten problem właśnie modyfikując nazwy plików.
Jednocześnie tak jak wspomniałem, mamy tutaj ich zoptymalizowane wersje i to samo
tyczy się obrazków i wszystkich innych dodatkowych assetów.
Dodatkowo nawet takie małe elementy jak
chociażby ten, że w naszych assetach mógłby pojawić się np.
drugi obrazek i w tym przypadku po prostu zduplikujemy sobie ten, który już mamy, a
następnie zaimportujemy go do naszej aplikacji w tym miejscu
no to oczywiście w momencie zbudowania, pojawi on się w katalogu wyjściowym.
Jednocześnie jeżeli już przestaniemy go
wykorzystywać w naszej aplikacji, czyli nie będzie potrzebny, a my ponownie ją
zbudujemy, to zwróć uwagę, że ten obrazek zniknął już w katalogu dist.
Jeżeli wydaje Ci się to oczywiste, to takie właśnie jest
ale jednocześnie w przypadku starszych
narzędzi, takich jak chociażby Gulp, już nie do końca takie było.
Musieliśmy ręcznie zadbać o właśnie takie
detale, jak chociażby czyszczenie katalogu wyjściowego po to, aby nie zawierał on
zbędnych elementów, które pochodziły z wcześniejszych buildów.
I teraz co ciekawe, prawdopodobnie
kojarzysz sam fakt, że nawet takie proste elementy jak zbudowanie skryptu, który
usuwa zawartość wybranego katalogu w tym przypadku dist nie jest takie oczywiste
szczególnie w momencie, gdy mówimy o wielu platformach.
Niemal w każdym projekcie spotykałem się z sytuacjami, w którym skrypt budujący
aplikację działał na Macu czy Linuxie, ale jednocześnie na Windowsie już nie.
W tym celu trzeba było wykorzystać konkretne biblioteki lub też upewnić się,
że wybrany przez nas sposób po prostu dba o zachowanie tej multi platformowości.
W każdym razie to, co próbuję Ci tutaj powiedzieć, to fakt, że nowoczesne
narzędzia, takie jak chociażby Vite dbają o wiele różnych szczegółów, w przypadku
których musieliśmy wcześniej zadbać samodzielnie.
Jest to jeden z najważniejszych elementów,
który wpływa na to, że jeżeli korzystasz ze starszych narzędzi,
no to dobrym pomysłem będzie to, aby sięgnąć po nieco nowszy zestaw.
Oczywiście nie zmienia to faktu, że w niektórych sytuacjach konieczne będzie
dostosowanie sposobu, w jaki jest budowana aplikacja przez Vite.
W związku z tym przejdziemy sobie tutaj znowu przez dokumentację, aczkolwiek
zwrócę uwagę na pewnego rodzaju elementy, które powtarzają się bardzo często.
Pierwszym z nich jest katalog podstawowy
naszej aplikacji. Czyli inaczej mówiąc jest to główny katalog.
Jego ustawienie jest o tyle istotne, że w
niektórych sytuacjach nasza aplikacja może składać się z wielu większych modułów
i takim klasycznym przykładem jest podział na panel administracyjny, bądź też w ogóle
moduł administracyjny oraz moduł dedykowany samemu użytkownikowi końcowemu.
W takiej sytuacji potrzebne jest albo
zbudowanie dwóch oddzielnych aplikacji, albo zdefiniowanie dwóch plików
wejściowych, o czym za chwilę sobie jeszcze powiemy.
W każdym razie w takiej sytuacji musimy
odpowiednio ustawić ten base URL, który oczywiście tak jak tutaj pokazaliśmy, może
zależeć też od aktualnego środowiska, w jakim uruchamiana jest nasza aplikacja.
Kolejnym elementem są już również mocno specyficzne ustawienia dla
konkretnej aplikacji i mowa tutaj właśnie
o procesie jej budowania oraz chociażby optymalizacji
ponieważ w przypadku większości aplikacji domyślne ustawienia jak najbardziej będą
wystarczające, ale w momencie, gdy jej objętość będzie rosła, to niewykluczone,
że będzie konieczność sięgnięcia po bardziej zaawansowany Chunking Strategy
czyli zasadniczo podział naszej aplikacji
na części, dzięki czemu klient nie będzie musiał od razu ładować całej aplikacji, w
tym również modułów oraz komponentów, z których niekoniecznie będzie korzystać.
No i tutaj poniżej mamy jeszcze ustawienia dotyczące obserwowania zmian w naszym
projekcie i również uruchamiania w tym przypadku całego procesu buildu
i coś takiego może przydać Ci się w niektórych sytuacjach, w których
faktycznie chcesz podglądać katalog wyjściowy, bądź też po prostu od razu
przeładować aplikację w momencie, gdy zmienią się jakieś pliki.
W każdym razie myślę, że najważniejsze
jest po prostu to, aby wiedzieć, że taka możliwość istnieje.
I tutaj mamy wspomniany przed chwilą
przeze mnie motyw dzielenia naszej aplikacji na różne części, które
zasadniczo się od siebie różnią i różnią się do tego stopnia, że mają różne pliki
wejściowe i dokładnie tak jak tutaj jest w dokumentacji opisane
w trybie deweloperskim będzie działać to
bez problemu, a w trybie produkcyjnym zacznie nam działać tylko wtedy, jeżeli
precyzyjnie określimy pliki wejściowe do poszczególnych części.
I tutaj poniżej są jeszcze bardziej
zaawansowane opcje, z których ja osobiście nigdy nie korzystałem, ponieważ raczej nie
zdarzało mi się budować bibliotek i wydaje mi się, że ta wiedza jest dość
specyficzna, aby w tej chwili się jej przyglądać.
Tak czy inaczej wróćmy jeszcze do IDE,
ponieważ chciałbym zwrócić uwagę na pewną rzecz.
Mianowicie, tak jak zapewne wiesz, w momencie gdy wysyłasz swoją aplikację do
repozytorium, to zawsze ignorowane są tutaj pewne pliki.
Jednym z nich jest node-modules, ale również dist.
A to oznacza, że do samego repozytorium nie wysyłasz w ogóle tego katalogu.
Wspominam o tym, ponieważ jest to jeden z
częściej popełnianych błędów jaki widzę w momencie, gdy pracuję z jakimiś
zewnętrznymi aplikacjami, gdzie developerzy umieszczają ten katalog
właśnie w repozytorium i próbują opublikować go na serwerze.
Coś takiego zasadniczo nie ma sensu, chociażby z tego powodu, że możemy mieć
potrzebę wykorzystania tutaj różnych zmiennych środowiskowych, które w
przypadku produkcji po prostu będą się różnić.
Dodatkowo przechowywanie też takiego
buildu aplikacji w przypadku repozytorium utrudnia pracę z nim ze względu na to, że
załóżmy, że usuniemy sobie teraz ten katalog, a
następnie zainicjalizujemy tutaj repozytorium Gita, a następnie dodamy wszystkie pliki i
zobaczymy sobie diff przechowywany w pamięci podręcznej.
Okazuje się, że poza tutaj oczywiście tymi początkowymi zmianami,
mamy tutaj pełno śmieci, które musimy przeglądać za każdym razem, ponieważ będą
się zmieniać za każdym razem w momencie, gdy np.
robimy Code Review. Coś takiego
moim zdaniem nie ma uzasadnienia i powinno
zostać wyeliminowane już na etapie developmentu.
No i teraz skoro nie będziemy wysyłać tego
katalogu do repozytorium, to pytanie jak on znajdzie się na serwerze?
Otóż tak samo jak przed chwilą po prostu zostanie wygenerowany poleceniem bądź też
skryptem odpowiedzialnym za budowanie naszej aplikacji.
Co więcej, takie budowanie odbywa się zwykle z pomocą narzędzi takich jak
GitHub Actions, a to oznacza, że cały ten proces wykonywany jest automatycznie.
Oczywiście to w jaki sposób konkretnie to
konfigurować i wykorzystywać w praktyce będziemy omawiać sobie jeszcze później
natomiast teraz tylko chciałbym raz jeszcze zwrócić uwagę na to, aby po
pierwsze dostosować to, w jaki sposób budowana jest nasza aplikacja na potrzeby
produkcyjne i aby wykorzystywać tutaj możliwie najnowsze narzędzia, które
rozwiązują wiele różnych problemów, a dodatkowo też absolutnie tej zbudowanej
wersji nie dodawać do naszego repozytorium i budować aplikację bezpośrednio na
serwerze produkcyjnym w procesie deploymentu, który powinien zostać zautomatyzowany.
Tymczasem jeżeli chodzi o sam ten element
budowania aplikacji, na ten moment byłoby to na tyle same praktyczne elementy
będziemy uwzględniać sobie jeszcze w kolejnych lekcjach przy okazji
konfigurowania naszego serwera produkcyjnego.
Tymczasem dzięki za uwagę i do usłyszenia w kolejnej lekcji.