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.
W tej lekcji powiem Ci czym są bundlery kodu i skorzystamy z jednego z nich.
Na początek pokażę Ci jaki mamy problem.
Mam stronę w html do której podłączyłem sobie plik main.js
taki jak już wcześniej widzieliśmy.
Czyli mam tutaj pobrane z użyciem npm luxon,
chciałbym sobie to zaimportować i z tego skorzystać.
I w lekcji poprzedniej skorzystaliśmy z tego z użyciem Node.js, natomiast teraz
chciałbym to samo wykonać w przeglądarce internetowej.
No i tutaj będziemy mieli pewien problem.
Natomiast na początek musimy zrobić jedną rzecz.
Otóż mamy w tym pliku package.json, wylistowany ten luxon i będę chciał
sobie to zainstalować, żeby faktycznie pojawił się tutaj katalog node_modules.
Więc będąc w terminalu wpiszemy ls albo dir na windowsie żeby wyświetlić katalogi
i to ważne żeby przejść do tego katalogu bundlery kodu.
Tutaj teraz mamy plik package.json i katalog src gdzie umieściłem naszą
stronę i wpiszemy po prostu npm install i to polecenie sprawi, że pojawi się katalog
node_modules, więc mamy pewność, że ten luxon na pewno się zainstalował.
I teraz jeżeli z użyciem live servera otworzę sobie tę stronę,
przejdę do src, to zobacz mamy taki błąd, że require is not defined.
I to właśnie jest ta różnica środowisk.
Jeżeli będziemy chcieli taki plik wykonać w przeglądarce to przeglądarka uzna, że
nie wie co to jest funkcja require, że takiej funkcji nie posiada.
Natomiast środowisko Node.js
ta funkcja jak widziałeś była i ona
potrafiła znaleźć w tym katalogu node_modules to czego szukamy i odpowiednio nam to
zwrócić, aby dalsza część naszego kodu mogła z tego korzystać.
Co zatem musimy zrobić?
Są dwie rzeczy, które trzeba zrobić i ja Ci je teraz pokażę.
Po pierwsze musimy sobie tutaj do tego
skryptu dodać taki typ type module i o tym dokładnie powiem w kolejnej lekcji
także na razie nie będziemy tego dokładnie
omawiać, bo chcę skupić się na czymś innym.
I następnie tutaj musimy skorzystać nie z require, ale z importu z użyciem tzw.
ESM, czyli ECMAScript modules
to też będę omawiał w kolejnej lekcji.
Czyli robi się to tak, że piszemy import,
następnie tutaj trzeba będzie powiedzieć DateTime, czyli tak jakby zrobić taki
destructuring from luxon. W ten sposób to trzeba będzie
zrobić i wtedy bezpośrednio na tym DataTime będziemy mogli z tego korzystać.
Zapiszę to i zobaczmy w przeglądarce.
I teraz już mamy zupełnie inny błąd.
Chodzi tutaj o to, że nie podaliśmy
poprawnej ścieżki, bo takie moduły, które są dostępne w przeglądarce oczekują, że
jak ten plik się wczytuje i tutaj mówimy, że importujemy luxon
to, że podamy tutaj jakąś relatywną
ścieżkę do pliku, który gdzieś się tutaj znajduje.
Przeglądarka nie jest w stanie po takiej
nazwie stwierdzić, że ma tego gdzieś szukać w katalogu node_modules itd.
Więc do tego właśnie potrzebujemy tak zwanego Bundlera kodu, który ten kod tak
zamieni, aby przeglądarka mogła wszystko poprawnie sparsować.
Czyli można powiedzieć, że potrzebujemy
takiego programu, który po uruchomieniu przeczyta sobie to co tutaj jest, znajdzie w node_modules
w ten luxon i w taki odpowiedni sposób go wyciągnie do osobnego pliku
i zmodyfikuje ten plik, że w przeglądarce ten plik.
Jeżeli zerkniemy na źródło strony, jeżeli przeglądarka ten plik będzie
wczytywać to tutaj musi mieć ten zapis import troszkę inny, właśnie taki przeprocesowany.
I w tym celu skorzystamy z bundlera kodu, który nazywa się Snowpack.
Wybieram właśnie ten bundler, chociaż mamy
wiele innych popularnych takich jak Webpack czy Parcel,
dlatego, że Snowpack jest bardzo, bardzo szybki, jest bardzo dynamicznie rozwijany
i ja sam osobiście z niego korzystam, więc
tego snowpacka musimy sobie zainstalować aby wykonał za nas tą pracę, o której
powiedziałem przed momentem. Czyli klikamy sobie tutaj
i jak widzisz można go zainstalować z
użyciem npm, ale zrobimy npm install i dopiszemy tutaj taką flagę save-dev
i to sprawi, że on się zainstaluje normalnie
tutaj do node_modules, ale zostanie dodany
do pliku package.json w takim kluczu devDependencies a dependencies.
Działać to będzie identycznie, ale dobrze jest oddzielać te zależności, które są jakby
potrzebne do naszego kodu źródłowego programu
o tych zależności, które są potrzebne w czasie developmentu, bo później możemy np.
odpowiednim poleceniem zainstalować sobie tylko te zależności, które są tak jakby produkcyjne,
albo wszystkie zależności również z tymi developmenckimi.
Niemniej jednak działać to będzie tak
samo, jeżeli ten Snowpack znalazłby się również tutaj.
No i teraz w node_ modules oprócz luxon powinniśmy mieć jeszcze Snowpacka,
może to po prostu odświeżę, ok, w ten sposób.
I teraz tutaj jak widzisz mamy luxon, ale
mamy również jeszcze inne zależności, bo Snowpack się zainstalował, ale on też ma
różne swoje zależności, które zostały tu zainstalowane.
W zasadzie co jest w tym katalogu nie musi nas interesować.
I teraz musimy odpowiednio uruchomić tego
Snowpacka i wskazać mu jakby gdzie jest nasz główny katalog
ten src po to, że jak uruchomimy serwer,
który on nam oferuje, to ten plik zostanie odpowiednio przeprocesowany.
I teraz jeżeli Snowpacka zainstalowaliśmy to
możemy skorzystać z takiego polecenia npx, które się zainstalowało razem z node i npm i
ono pozwala nam uruchamiać paczki, które znajdują się w katalogu node_modules.
Czyli jeżeli wpiszę npx snowpack
w ten sposób to uruchomię właśnie moduł Snowpack, który zainstalowaliśmy i który
znajduje się w tym katalogu. I Snowpack oferuje nam coś takiego jak dev server
i w zasadzie jeśli przejdziemy sobie tutaj Get Started i do Dev Server widzimy, że jest
polecenie snowpack dev, więc my to musimy poprzedzić tym npx żeby snowpacka
uruchomić i on nam uruchomi taki serwer na porcie
jak może zobaczyć localhost 80 80. OK.
Od razu możemy zobaczyć jakieś błędy
i jak widzisz nie do końca nam to działa.
Właśnie z tego powodu, że ja naszą aplikację umieściłem w katalogu src
żeby się nie mieszała z tymi plikami to musimy stworzyć taki plik konfiguracyjny
dla Snowpacka i powiedzieć mu gdzie ta aplikacja jest.
Więc w terminalu nacisnę control C, żeby
to wszystko zatrzymać i sobie wyczyszczę i uruchomimy tutaj,
czy utworzymy teraz tutaj nowy plik, który nazwiemy snowpack.config.js
i jest to taki plik modułu node.js, którym możemy coś wyeksportować pisząc module.exports
i z tego pliku eksportujemy taki obiekt konfiguracyjny.
Snowpack w odpowiedni sposób sobie go znajdzie.
Nie ma tutaj problemu.
I tam wpiszemy coś takiego
jak mount, to można znaleźć w dokumentacji
i mówię, że mój katalog src, bo tak go nazwałem więc tu też podaję src
chce jakby zamontować do głównego serwera do tej głównej ścieżki.
Jeżeli zrobimy coś takiego i jeszcze raz
uruchomimy snowpack dev, to tym razem powinno już to wszystko działać.
Jak widzisz strona się uruchomiła
i uruchomił się nam taki serwer developmencki,
ten mieliśmy tutaj na porcie 5500,
to był ten live serwer z VS Code, a tutaj to
właśnie ten Snowpack uruchomił nam serwer do pracy.
Jak sobie otworzę konsolę to możesz
zobaczyć, że wszystko teraz działa poprawnie. Czyli nasz kod się poprawnie
wykonał, a zatem taki import z katalogu node_modules zadziałał.
No i zastanówmy się co tak naprawdę zrobił Snowpack.
Otóż Snowpack nam tą stronę wyświetlił, czy w
zasadzie udostępnił na serwerze i w momencie jak przeglądarka wczytuje sobie
ten plik i dochodzi do main.js wysyła zapytanie po ten plik, snowpack
wtedy to zapytanie przechwytuje i ten plik
tak modyfikuje żeby przeglądarka go rozumiała.
Zauważ co on zrobił.
Mieliśmy oryginalnie tutaj import DateTime
from loxon i przeglądarka nie wie gdzie to luxon znaleźć, bo tutaj trzeba podać ścieżkę
dokładną do katalogu, w którym coś takiego się znajduje.
A Snowpack zrobił coś takiego,
że utworzył i my tego tu nie widzimy, bo to jest utworzone w pamięci.
Nawet jak odświeżę to tego tutaj nie ma,
ale Snowpack utworzył sobie właśnie z tego
luxona osobny katalog, który nazywał _snowpack pkg luxon.js i
podmienił tutaj ścieżkę w tym naszym pliku i w momencie jak przeglądarka wczytuje ten
plik to ta ścieżka jest już poprawna i ona potrafi ją znaleźć.
Tak jak wspomniałem my tego tutaj nie
widzimy, bo Snowpack uruchomił sobie taki serwer gdzie to wszystko trzyma.
Niemniej jednak jak najbardziej to teraz
działa. I w ten sposób możemy sobie pobierać z internetu i instalować tutaj do package.json
z użyciem npm najróżniejsze paczki,
następnie w naszym kodzie możemy normalnie je importować właśnie w ten sposób
i za nas właśnie ten Snowpack będzie dbał o to, żeby to tak przetranspilować i tak
pozmieniać, żeby przeglądarka to rozumiała.
Tutaj skorzystaliśmy z takich importów w ES6,
o których jeszcze będę chciał powiedzieć w lekcji kolejnej, ale powiem
Ci, że nie zawsze dobrym pomysłem jest, żeby wszystko było importowane jakby z
osobnych plików, bo to działa w ten sposób, że jak przeglądarka
co możemy tutaj podejrzeć w panelu Network,
odświeżamy sobie,
w momencie jak przeglądarka wczytuje tę stronę to musi wczytać plik main.js
w tym pliku znalazła ten import,
właśnie ten import do luxon i zauważ, że tego luxona też musiała pobrać.
A gdyby w luxon były jeszcze inne importy to
przeglądarka musiała by pobrać bardzo wiele plików.
I czasami lepiej jest żeby te wszystkie pliki zbundlować,
właśnie dlatego mówimy o bundlerach kodu i wstawić do jednego pliku.
Czyli można powiedzieć, że chcielibyśmy tego luxona jakby wyciągnąć, wstawić go
tutaj do naszego pliku i potem dodać do tego nasz kod.
I to również można zrobić z użyciem innych bundlerów, takich jak np.
Webpack
ale Snowpack pozwala nam również na taką operację, kiedy tworzymy tzw.
build produkcyjny.
Jak ten build wygląda będę chciał Ci pokazać w kolejnej lekcji.