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 chciałbym zwrócić uwagę na
kilka narzędzi, które bez wątpienia już znasz, ale szansa na to, że je
wykorzystujesz w codziennej pracy jest różna.
Doskonałym przykładem tego, o czym mówię jest Docker, który bez wątpienia jest
bardzo rozpoznawalny, ale jednocześnie nawet patrząc na osoby, które programują w moim
otoczeniu, raczej tylko mała część faktycznie z niego korzysta.
I chociażby z tego powodu chciałbym zwrócić na niego szczególną uwagę,
ze względu na to, że w roli Full Stack
przyjdzie Ci rozwijać równolegle wiele różnych projektów.
No i tutaj, jak doskonale wiesz, każdy z tych
projektów może wymagać różnego środowiska uruchomieniowego.
Czasem będzie to inna wersja Node.js, a czasem zupełnie inne zależności, które
mogą wchodzić w konflikt z Twoimi innymi projektami.
Docker jest bez wątpienia najlepszym rozwiązaniem do tego, aby poradzić sobie z
tym problemem, tym bardziej, że w większości przypadków jego konfiguracja
taka na potrzeby developmentu jest raczej stosunkowo prosta.
Tym bardziej, że w wielu przypadkach
przyjdzie Ci pracować z gotowymi obrazami, które zostały dołączone do projektu i
jedyne co musisz zrobić, to po prostu je uruchomić.
Jeżeli chodzi o samo wykorzystanie Dockera
w warunkach developerskich, o tym będziemy sobie jeszcze rozmawiać,
natomiast na ten moment zachęcam Cię do jego instalacji oraz przejrzenia
dostępnych na Eduweb warsztatów na jego temat.
Tymczasem jest jeszcze jeden wątek, który chciałbym poruszyć w kontekście
konfigurowania naszego środowiska developerskiego.
Jest nim ekspozycja naszego localhost do
internetu. I podczas gdy podobnie jak w przypadku Dockera, ta sytuacja również
bardzo często jest po prostu wymagana bądź też ułatwia rozwój aplikacji
tak bardzo rzadko spotykam się z sytuacjami, w której faktycznie ktoś
podejmuje próbę tego
aby faktycznie udostępnić swój lokalny projekt w internecie.
No i teraz coś takiego można zrobić na wiele różnych sposobów.
Jeżeli wiesz co nieco na temat konfiguracji własnych serwerów, to
niewykluczone, że będziesz w stanie skonfigurować sobie swój własny serwer do
tego, aby komunikował się z Twoim komputerem.
Ja osobiście jednak nie korzystam z tego rozwiązania i zawsze sięgam po ngrok .
Jest to niezwykle proste w obsłudze narzędzie, które za chwilę sobie wykorzystamy.
Przejdę tylko do mojego testowego projektu i uruchomię go tak, aby
działał na porcie localhost 3000, więc w momencie gdy przejdę sobie teraz na ten
adres to powinien wyświetli się tutaj napis Hello World.
Faktycznie wszystko się zgadza, ale jeżeli np.
chciałbym wejść na ten adres na moim
telefonie no to naturalnie nie byłoby takiej możliwości.
Jeżeli jednak uruchomimy polecenie ngrok http 3000 to od razu mamy tutaj informacje
na temat bieżącej sesji oraz zewnętrzny adres kierujący do naszej aplikacji.
Zwrócił uwagę, że w tym momencie nie znajduje się na moim localhost,
a jednocześnie też mamy tutaj działającą aplikację.
Podobnie zresztą będzie, gdy wyciągnę
sobie tutaj swój telefon, a następnie udostępnię sobie ekran.
Teraz jeżeli otworzę sobie ten adres na moim telefonie, to być może bardzo tutaj słabo
to widać ale jednocześnie faktycznie mamy
potwierdzenie, że nasz localhost jest publicznie dostępny.
No i teraz jak może sobie wyobrazić taka możliwość udostępnienia swojego localhost
do internetu sprawdzi się w wielu różnych przypadkach.
Czasem będzie to konieczność tymczasowego
wystawienia swojej aplikacji w celu jej wygodnego przetestowania, bądź np.
wystawienia tylko jednego endpointa czy
jakiegoś webhooka, z którym kontaktuje się jakaś zewnętrzna usługa.
Coś takiego w mojej codzienności sprawdza się niesamowicie dobrze i jeżeli jeszcze
nie korzystasz z tej opcji, to bardzo polecam Ci po nią sięgnąć.
Kolejnym analogicznym wątkiem, który może
zdarzyć Ci się w codziennej pracy jest konieczność połączenia się z jakąś bazą
danych i to niekoniecznie lokalną, ale taką dostępną w Internecie.
Z drugiej strony czasem może zdarzyć się
również tak, że na swoje deweloperskie potrzeby potrzebujesz po prostu jakiejś
szybkiej bazy danych i w tej konkretnej sytuacji jest nie do końca uzasadnione to,
aby stawiać jakąś aplikację bądź ręcznie tworzyć taką bazę na swoim komputerze.
Tylko zdecydowanie lepiej jest sięgnąć po narzędzia typu Railway.
W tym przypadku przejdziemy sobie tutaj do
naszego dashboard i utworzymy nowy projekt.
Tym projektem będzie np.
baza danych MySQL.
Po chwili nasz projekt zostanie tutaj utworzony, a my będziemy mogli nie tylko
utworzyć strukturę tabeli, umieścić również w niej dane, ale również połączyć się
z nią z poziomu naszej aplikacji bądź też nawet lokalnego komputera.
Zatem utworzę sobie tutaj tabelę users i
zaznaczę tylko, że oczywiście jeżeli na ten moment praca z bazami danych jest Ci dość
obca, to zaufaj mi tylko, że wiem co robię, a mianowicie dodaję tutaj pole name
typu text, a resztę ustawień pozostawiam bez zmian.
Pojawiła się tutaj tabela users, wewnątrz której możemy
dodać albo dodatkowe kolumny albo pierwszy wiersz.
Załóżmy, że pierwszym z nich będzie Adam, a drugim np.
Michał. I teraz mamy tutaj dwa
rekordy, do których chcielibyśmy się połączyć.
Możemy to zrobić na wiele różnych sposobów, a jednym z nich jest skopiowanie
polecenia umożliwiającego nawiązanie połączenia z poziomu samego terminala.
Tutaj ponownie przejdziemy sobie do terminala i wpiszemy całe to polecenie.
Tutaj na chwilę musiałem zasłonić ekran ze
względu na to, że jest uwzględnione tutaj hasło do mojego konta, ale jednocześnie
jak widzisz połączenie zostało nawiązane, a ja mogę wykonać
proste zapytanie, aby pobrać wszystkie rekordy z tabeli Users.
Rzeczywiście mamy tutaj Adama i Michała.
Wszystko się zgadza.
Połączenie zostało nawiązane, działa i jesteśmy w stanie z niego korzystać.
Co więcej, analogicznie też możemy
nawiązać takie połączenie z poziomu naszej aplikacji lub też co ważne
zdeployować tutaj projekt
pochodzący z naszego
repozytorium, bądź też wykorzystać jakiś starter i
chociażby uruchomić aplikację ExpressJS.
Tutaj szczerze mówiąc, jeżeli chodzi o sam Railway, raczej
wykorzystuję go wyłącznie na potrzeby takiej piaskownicy do tego, aby
testować sobie różne ustawienia.
Raczej nie zdarzyło mi się korzystać z
niego produkcyjnie, w związku z tym nie wiem, czy mogę go polecić w tym celu.
Nie zmienia to jednak faktu, że do
podanych tutaj przykładów sprawdza się mi idealnie.
I teraz kolejnym ważnym elementem jeżeli chodzi o pracę zarówno z punktu widzenia
lokalnego środowiska, ale też produkcyjnego jest tzw.
REPL. W tym momencie znajdujemy się w
dokumentacji Laravela, czyli poruszamy się w technologii PHP, aczkolwiek
analogicznie REPL dostępny jest również chociażby w NestJS
i tylko chodzi mi o to, aby podkreślić, że
REPL nie jest czymś charakterystycznym np.
dla Node.js czy chociażby frameworka
NestJS, ale również jest dostępny w wielu innych przypadkach.
I teraz jeżeli tylko przyjrzymy się o co w
tym wszystkim chodzi, to zwróć uwagę, że jesteśmy w stanie wykorzystywać pewnego
rodzaju interfejs oraz polecenia, aby wchodzić w interakcję z naszą aplikacją.
Przykładowo, jeżeli stworzymy sobie aplikację NestJS, która będzie wystawiała nam
jakieś API, no to przykładowo jesteśmy w stanie
odwołać się do jakiejś metody wybranego serwisu,
o tym będziemy sobie jeszcze rozmawiać, więc jeżeli na tym etapie nie jest to dla
Ciebie jasne, to absolutnie się tym nie przejmuj i w
wyniku wykonania takiej metody
otrzymujemy rezultat w postaci informacji, którą zwraca ta
metoda. No i teraz
pytanie po co w ogóle są potrzebne takie narzędzia?
Ano czasem zdarzają się różnego
rodzaju błędy aplikacji, które należy zdebugować w dość specyficzny sposób.
Wtedy okazuje się, że pewnych rzeczy po
prostu nie widać na pierwszy rzut oka i np.
uruchamiamy sobie aplikację, przepisujemy
ją i wszystko się zgadza, ale jednocześnie np.
jakieś dane wyświetlane są nie tak, jakbyśmy tego chcieli.
W związku z tym jesteśmy w stanie nawiązać połączenie z konkretnymi elementami
naszej aplikacji, a następnie poprosić je o
jakieś konkretne dane i tym samym podejrzeć, na którym etapie pojawiają
się nam błędy.
Drugim przykładem, który w moim przypadku bardzo
często się sprawdza
jest konieczność napisania jakiegoś zaawansowanego zapytania SQL.
Z jednej strony i nic nie stoi na przeszkodzie, aby wykorzystać np.
TablePlus i nawiązać połączenie z produkcyjną bazą danych, napisać
zapytanie, a następnie wyeksportować wyniki.
Również tak robiłem i również to się sprawdza.
Ale jednocześnie w niektórych przypadkach może okazać się, że
coś takiego będzie albo po prostu bardzo trudne lub mało efektywne.
W takich momentach do gry wchodzi właśnie
REPL, który umożliwia nam napisanie kodu, który będzie operował na metodach i
wartościach zwracanych przez konkretne moduły naszej aplikacji czy np.
endpoint.
Oczywiście sam temat jest zbyt rozległy, żeby teraz móc go pokazywać
ale myślę, że jeszcze pojawi
się okazja do tego, aby sięgnąć po takie narzędzie
w momencie, gdy aplikacja, którą będziemy
budować będzie już kompletna i będziemy mieć jednocześnie dane, z którymi będziemy
mogli pracować i tym samym też podłączyć się do aplikacji
za pomocą REPLa.
Teraz jeszcze tylko w tym momencie chciałbym zwrócić uwagę, że w przypadku
Laravel a REPL jest zdecydowanie bardziej rozbudowany, a dodatkowo pojawiło
się narzędzie Tinkerwell, które świetnie obrazuje to, co przed chwilą powiedziałem.
Zwróć uwagę, że jest to tak jakby
dodatkowy edytor kodu, który wspiera różnego rodzaju funkcje, w tym nawet
podpowiadanie składni nawiązujące do kodu źródłowego naszej aplikacji.
No i tutaj mamy przykład
w którym powstaje zapytanie SQL wykorzystujące np.
wbudowane ORM.
Co więcej, tak jak widać, możemy tutaj
pisać nawet różnego rodzaju funkcje, zwracać z nich wartości, a następnie te
wygenerowane wartości przekazywać do aplikacji i pobierać kolejne informacje.
Nie mam wątpliwości, że jeżeli do tej pory
nie korzystasz z takich narzędzi, to zdecydowanie warto się im przyjrzeć i
przynajmniej sięgnąć po nie przy kolejnej okazji.
I w tym momencie, jeżeli chodzi o te
główne narzędzia, które postrzegam jako bardzo istotne w pracy Full-Stack Developera, tak
jest jeszcze przynajmniej jedno, które warto brać pod uwagę.
Mianowicie w momencie, gdy będziesz pracować jako Full-Stack Developer,
niewykluczone, że przyjdzie Ci projektować różnego rodzaju interfejsy
właśnie na potrzeby aplikacji, którą tworzysz, bądź też nawet jakiegoś
prototypu, w przypadku którego nie będziesz mieć dostępu do projektanta,
który będzie w stanie dostarczyć Ci kompletny interfejs, który
będziesz mógł wdrożyć
i w takiej sytuacji świetnie sprawdza się możliwość sięgnięcia np.
Tailwint oraz Tailwind UI oraz
wykorzystanie gotowych komponentów, które łatwo będziesz w stanie skleić ze sobą, a
następnie wykorzystać we własnej aplikacji.
Swoją drogą taki sam scenariusz może sprawdzić Ci się
również w sytuacji, gdy współpracujesz z
osobą przygotowującą interfejs ze względu na to, że w takiej sytuacji
ona również może sięgnąć np. po
komponenty Figmy dostępne w Tailwind UI a następnie ewentualnie dostosować
je do potrzeb Waszej aplikacji.
Coś takiego w przypadku full stack developmentu
sprawdza się genialnie i po prostu bardzo przyspiesza pracę.
Oczywiście jednocześnie to rozwiązanie
nie jest ograniczone do full stack developmentu
jeżeli pracujesz tylko na froncie bądź backend, również możesz z niego korzystać
natomiast zachęcam do tego, aby właśnie korzystać z design systemów
gotowych bibliotek komponentów
oraz ich implementacji w oparciu o różne frameworki frontendowe.
Takie podejście znacząco ułatwia pracę i
jednocześnie narzędzia takie jak Shuffle.dev
jak widzisz ułatwiają prototypowanie takich aplikacji oraz dostosowanie
elementów interfejsu do Twoich
aktualnych potrzeb.
Teraz jeżeli chodzi o same narzędzia wspierające full stack development
to by było na tyle
więc dziękuję Ci za uwagę i zapraszam do kolejnych materiałów.