od Podstaw
9 godz. 20 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperJavaScript to język programowania, który napędza niemal wszystkie strony internetowe. Dopełnia on technologie HTML i CSS, za pomocą których tworzymy strukturę i wygląd dokumentu. Co jednak w sytuacji, gdy chcemy po kliknięciu w wybrany przycisk wyświetlić powiększone zdjęcie lub wczytać dodatkowe dane z serwera? To właśnie w takich sytuacjach przydaje się język JavaScript i tzw. DOM API, dostępne w przeglądarce. Jak się przekonasz, możliwości nowoczesnych przeglądarek w połączeniu z tym językiem są naprawdę ogromne.
Język JavaScript może być używany nie tylko na stronach internetowych. Z tego powodu, w kursie omówimy najpierw najważniejsze konstrukcje tego języka, które są niezależne od platformy uruchomieniowej. Dzięki temu zbudujesz fundamenty niezbędne do tego, by wykorzystać ten język np. w środowisku Node.js. Krok po kroku omówimy sposoby tworzenia zmiennych, dostępne typy danych i operatory. Następnie zobaczysz jak tworzyć tablice i obiekty, z jakich instrukcji warunkowych i pętli możesz korzystać, a także jak tworzyć własne funkcje. Przekazywana wiedza uwzględniać będzie nowości, które pojawiły się w języku wraz z rewolucyjnym standardem EcmaScript 6 (ES6).
Sam język JavaScript to nie wszystko, by tchnąć ducha w strony internetowe. Z tego powodu, przeglądarki internetowe udostępniają tzw. DOM API. To interfejs, który z użyciem języka JavaScript pozwala na manipulację treścią i wyglądem strony. W kursie bardzo dokładnie omówimy czym jest Obiektowy Model Dokumentu, a także jak z nim pracować. Zobaczysz jak tworzyć nowe elementy HTML i wstawiać je na stronę, jak modyfikować ich treść, atrybuty, style czy klasy CSS. Poznasz sposoby na odczytywanie położenia elementu na stronie i jego wymiarów, które będą niezbędne w wielu sytuacjach. Dowiesz się także, jak przypisywać obsługę zdarzeń w przeglądarce, by np. wywołać własną funkcję, gdy ktoś kliknie w wybrany przez Ciebie przycisk.
JSON to popularny format wymiany danych, a Ajax to potoczna nazwa dla asynchronicznych zapytań HTTP, które wysyłać możemy z poziomu kodu JavaScript. Dziś niemal każda strona internetowa wykorzystuje te technologie. W niektórych przypadkach jako dopełnienie podstawowej funkcjonalności witryny, a w innych jako główny motor napędzający stronę. Jeśli kiedykolwiek widziałeś, jak na stronie internetowej jakaś treść "doczytuje" się np. podczas przewijania - widziałeś w praktyce Ajax. W jednym z rozdziałów kursu zobaczysz, jak pracować z tym formatem, a także jak wysyłać wspomniane zapytania do serwera.
Choć kurs który masz przed sobą, jest kursem dla początkujących, to aby zrozumieć jak działa język JavaScript i jak z nim się współcześnie pracuje, omówimy dwa ważne tematy - zarządzanie zależnościami i bundlowanie kodu. Dowiesz się czym jest npm i jak z jego pomocą pobierać paczki gotowego kodu z internetu, a także jak sprawić, by bez trudnu dołączać je do własnego kodu. W tym celu skorzystamy z narzędzia snowpack, które pozwoli nam także na optymalizację kodu przed jego wypuszczeniem w świat. Na tym etapie omówimy również jak działają moduły ESM, pozwalające dzielić kod na mniejsze części.
Kurs podzielony został na możliwie krótkie lekcje, do których w każdej chwili możesz wrócić. Jeśli zatem zapomnisz jak odczytywać wymiary elementu na stronie, szybko odnajdziesz odpowiednią lekcję. Czym jednak była by sama teoria i proste przykłady, bez pokazania, jak połączyć je w całość i wykorzystać w praktyce? Dobra wiadomość jest taka, że w kursie stworzymy aż 5 praktycznych projektów, wykorzystujących zdobytą wcześniej wiedzę. Najpierw napiszemy program losujący Dużego Lotka, następnie dynamiczny pasek postępu przeczytania artykułu, dymek pojawiający się nad elementem po najechaniu na niego myszą, wygenerujemy tabelkę w użytkownikami na podstawie danych JSON, a na koniec tworzymy prosty odtwarzacz wideo, z możliwością pauzowania i przewijania filmu.
Kurs ten jest dla wszystkich osób, które znają już podstawy HTML i CSS i chciałyby przejść poziom wyżej i dodać do swoich stron dynamiczności. Żadna wcześniejsza wiedza z zakresu JavaScript nie jest wymagana, ale zalecana jest podstawowa wiedza z zakresu samego programowania (czym są zmienne, pętle, funkcje itd.). Materiał ten będzie również świetnym odświeżeniem i usystematyzowaniem wiedzy dla osób, które już z tym językiem miały do czynienia. Po przerobieniu tego kursu będziesz gotowy, by poznawać język JavaScript dalej i zacząć korzystać z nowoczesnych frameworków.
Pod koniec poprzedniej lekcji wspomniałem,
że będziemy korzystać często z bloku try catch wszędzie tam, gdzie korzystamy z
jakiś bibliotek trzecich. To znaczy napisanych przez innych programistów.
I tacy programiści mogą zgłaszać w pewnych miejscach w kodzie tak zwane wyjątki,
które sprawią, że nasz program przestanie działać.
I wtedy, żeby taki wyjątek obsłużyć musimy skorzystać z bloku try catch.
Więc ja będę chciał Ci pokazać w tej lekcji, w jaki sposób można zgłaszać
właśnie takie wyjątki czy własne błędy wszędzie tam, gdzie np.
nie mamy informacji niezbędnej do tego, żeby nasz program mógł działać.
Więc wyobraźmy sobie znowu taką hipotetyczną funkcję, którą nazwiemy
searchInDb, czyli szukaj w bazie danych i my tworzymy taką funkcję tutaj w środku
gdzieś byśmy z jakiś sterowników korzystali np.
w Node.js
do tego, żeby się podłączyć do bazy,
niemniej jednak to co jest kluczowe to
nasza funkcja przyjmuje parametr query.
I ten parametr będzie potrzebny, żeby wyszukiwać w bazie danych.
To jest oczywiście tylko założenie,
ale to również można przełożyć na taki przykład, powiedzmy z transakcjami jakimiś
internetowymi płatniczymi, gdzie często korzystamy z różnych tokenów i może być
tak, że będziemy mieli funkcję, gdzie ktoś musi przekazać token.
Jak go nie przekaże to wszystko przestaje działać.
No i właśnie my jako programiści czasami
musimy podjąć w naszym kodzie taką decyzję, że jeżeli coś nie jest podane lub
coś się nie zgadza, albo nie jest w odpowiednim formacie, to po prostu my
zgłaszamy taki błąd i mówimy radź sobie z tym.
Musisz u siebie wykonując nasz kod
zobaczyć, że wystąpił taki błąd i to oznacza, że zrobiłeś coś nie tak.
Czyli my jako programiści możemy
się przed takimi sytuacjami zabezpieczyć.
No i co ja bym chciał zrobić? Chciałbym powiedzieć, że jeżeli not query,
czyli jeżeli ktoś tego query nie podał, to ja nie chcę zwracać np.
pustych wyników, bo tak też można byłoby zrobić.
To jest tylko nasza decyzja.
Tutaj moglibyśmy powiedzmy wyszukiwać w bazie danych, ale jeżeli ktoś wywoła naszą
funkcję, nie poda query, to mu zwracamy null.
Tylko, że on wtedy nie będzie wiedział w zasadzie od razu gołym okiem, że gdzieś ma
błąd w kodzie, przez który nie podał query.
Zobaczy, że otrzymał null i może to
potraktować jako fakt, że nic nie zostało znalezione w bazie danych.
Więc jeżeli my na tym etapie tutaj uznamy, że jednak nie powinniśmy zwracać null, ale
dać komuś znać, że jego kod jest wadliwy, bo skorzysta z naszej funkcji i nie
przekazał nam tego parametru, a uważamy, że on jest wymagany,
swoją drogą w niektórych językach programowania wystarczyłoby taki parametr
tutaj zdefiniować i gdyby ktoś go nie podał to już byłby błąd.
W JavaScript jest tak, że jak ktoś
wywoła naszą funkcję i nie poda parametru, to on przyjmie wartość undefined.
Więc ja nie chcę tutaj zwracać null, tylko
chcę zgłosić własny błąd. I w języku JavaScript robi się to takim słowem throw.
I tu możemy zwrócić co chcemy.
Moglibyśmy napisać na przykład podaj frazę
wyszukiwania w ten sposób i to throw działa podobnie jak
return, to znaczy nie wykona się już żaden kod, który jest poniżej, ale to też nie
jest to samo co return, bo to sprawi, że program przestanie działać.
Niemniej jednak dużo popularniejszym jest zwracanie instancji nowego błędu.
Czyli zamiast zwracać taki string to utworzymy za pomocą new Error,
to jest dostępne globalnie, taki właśnie błąd
i dzięki temu ktoś otrzyma obiekt, który będzie miał właściwość message taką jak w
lekcji poprzedniej Ci pokazałem i tam będzie ten tekst, który podaliśmy.
Czyli moglibyśmy powiedzieć tutaj na przykład albo zwrócić return wyniki
wyszukiwania dla frazy i tutaj dodamy frazę, którą ktoś podał.
Natomiast jeżeli fraza nie będzie podana, to wyrzucimy za pomocą throw własny błąd.
No i teraz zobaczmy jak to działa
w praktyce. Wygląda to tak, że jeżeli ktoś
będzie chciał skorzystać z naszej funkcji searchInDb i nic nie poda,
a tutaj byśmy sobie zrobili coś takiego jak dalsza część programu,
zakładamy, że ten kod od od tego momentu
tutaj to jest cudzy koszt, powiedzmy, a to jest nasza funkcja, którą napisaliśmy, ona
może być w osobnym pliku, jakoś zaimportowana itd.
Jeżeli ktoś zrobi coś takiego, zauważ ten nasz błąd, zostanie wyrzucony
i tutaj jest podaj fraza wyszukiwania, ale dalsza część programu się nie wykonała,
czyli program mówiąc brzydko się wykrzyczył.
A zatem my możemy jako programiści w ten
sposób sprawić, że program przestanie działać.
I teraz osoba korzystająca z naszej funkcji gdzieś by to zobaczyła i
stwierdziła by, że na podstawie różnych warunków, jeżeli może
naprawić swój program tak, że zawsze ta fraza będzie podana to ok.
Ale może też być tak, że to jakiś użytkownik programu będzie musiał wpisać
tą frazę i my wtedy nie wiemy czy ona zawsze będzie czy jej nie będzie,
wystarczy, że wtedy do bloku try wstawi naszą funkcję,
to sobie zostawimy tutaj
i jeżeli wystąpi błąd to może go przechwycić w catch i tutaj pod e
zostanie dokładnie podstawiony ten new Error, który będzie miał pod e.message
to co tutaj napisaliśmy. Więc ktoś będzie mógł sobie zrobić coś takiego console.log
i tak jak robiliśmy wcześniej wystąpił błąd i tutaj podali byśmy e.message.
Tutaj jeszcze to zmodyfikujemy tak, że
będziemy chcieli przechwycić jaby te wyniki wyszukiwania i wyświetlić je w konsoli.
I teraz zobaczmy co się stanie.
Nasz program będzie działał w ten sposób.
Wystąpił błąd Podaj frazę wyszukiwania i mamy działającą dalszą część programu.
Natomiast jeżeli tutaj ta fraza zostanie poprawnie podana np.
powiedzmy ktoś wyszukuje laptopa, czyli
laptop, zobacz to będziemy mieli wyniki wyszukiwania dla frazy laptop.
A zatem wykonał się ten kod, ten throw się
nie wykonał, więc zwróciliśmy poprawne wyniki.
I to jest kolejna z tych rzeczy, które przychodzą wraz z doświadczeniem.
To znaczy tworząc jakiś kod na pewnym etapie może być tak, że ty zdecydujesz, że
nie jesteś pewny, czy ktoś korzystający z tego kodu np.
poda jakąś frazę wyszukiwania i jeżeli Ty wiesz, że ona jest kluczowa,
bez niej po prostu Ty nie jesteś w stanie
kontynuować tego kodu, który napisałeś, to możesz zgłaszać własne błędy za pomocą
throw i najlepiej tutaj robić new Error podając tutaj komunikat.
Aczkolwiek jak widziałeś na początku tu można za pomocą throw wyrzucić wszystko.
Jeżeli byśmy wyrzucili sam string to pod tym e znalazłby się string i wtedy nie
mielibyśmy odwołania do e.message, tylko samo e byłoby już tym string.
Dlatego najlepiej tworzyć tutaj nową instancję z takiej klasy error.