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 omówimy jak działają moduły ESM, czyli tzw.
ECMAScript Modules.
To jest coś, co jest wspierane w przeglądarkach internetowych, ale od wielu
lat było wykorzystywane w ten sposób, że pisaliśmy kod używając tych modułów
mimo tego, że przeglądarki ich nie wspierały, a następnie z użyciem bundlerów
kodu, te moduły były tak zamieniane i tak pakowane, że przeglądarka otrzymywała plik
JavaScript, gdzie tych modułów po prostu nie było.
One były spakowane w jeden plik, który przeglądarka rozumiała.
Natomiast to co Ci pokazałem w lekcji
poprzedniej pokazuje Ci, że tak naprawdę przeglądarki rozumieją już te moduły
a mówiąc o modułach mam na myśli to, że możemy coś importować i eksportować
i jak to robić chcę Ci pokazać w tej lekcji.
Mamy tutaj przykład, który zaczerpnąłem sobie z lekcji o odczytywaniu i formatowaniu daty.
Czyli mamy jakieś trzy funkcje i następnie za ich pomocą formatujemy sobie datę.
Podłączyłem sobie ten plik oczywiście do
strony tutaj zwyczajnie i otworzyłem z użyciem Live Serwera.
Mamy tę stronę i mamy tutaj tą sformatowaną datę.
Niech Cię nie zmyli to, że mamy tutaj package.json i pliki snowpack.
Na razie snowpack tutaj nie ma żadnego udziału w tym co robimy,
to zwykły skrypt podłączony do strony.
I teraz, gdybyśmy chcieli sprawić, żeby
ten kod był modułowy, podzielić go sobie na moduły, czyli wyciągnąć te funkcje np.
do innego pliku, to moglibyśmy tutaj w js
powiedzmy utworzyć plik taki jak utils utilities i np.
helper.js.
I teraz możemy zrobić tak, że te funkcje,
które tutaj są wytniemy do takiego właśnie pliku helpers.
Dzięki temu będziemy mogli je
zaimportować, ale także w innych plikach moglibyśmy spokojnie z nich korzystać.
Wstawiamy je zatem tutaj,
ale to sprawi, że wszystko przestanie działać, bo przeglądarka ma podłączony
tylko ten jeden plik, no i w tym pliku widzi odwołanie do addZero
czy convertMonth, tych plików czy tych funkcji nigdzie nie znajdzie.
Zatem musimy z takiego pliku wyeksportować te funkcje
i robi się to w tych modułach ESM z użyciem takiego słowa export.
Możemy przy takiej funkcji, ale nie tylko
przy funkcjach o czym jeszcze później napisać export
i to oznacza, że z tego pliku one będą
eksportowane. Co jest fajne, to nie wszystko musimy eksportować.
. Np.ta funkcja tutaj korzysta z getMonths, które
jest definiowane wyżej i tylko tę funkcję chcę wyeksportować,
żeby z niej można było skorzystać z tych dwóch w innym pliku
a mogę uznać, że to getMonths nie będzie
można tego zaimportować i z tego korzystać gdzieś indziej,
że to będzie prywatne dla tego modułu.
To jest właśnie fajne, że nie wszystko musimy eksportować.
Skoro eksportuje tylko te dwie funkcje to
mogę je zaimportować tutaj na samej górze wpisując import i żeby
zaimportować takie eksporty muszę podać ich nazwy czyli addZero i convertMonth
i robi się to w taki sposób.
To wygląda trochę jak Destructuring Obiektów.
Więc napiszemy addZero i po przecinku można
podać kolejne, które chcemy z tego modułu zaimportować np.
convertMonth i tutaj musimy powiedzieć from czy i skąd to chcemy zaimportować.
Więc musimy podać ścieżkę relatywnie do pliku, w którym jesteśmy czyli main.js,
musimy wejść do utils i podać helpers.js
A więc podajemy to w ten sposób.
To oznacza ten sam katalog, następnie utils i następnie plik helpers.js
jak zrobimy coś takiego to do tego pliku zaimportujemy tę funkcję.
Ale w przeglądarce jak widzisz, to nie będzie działać z tego powodu, że nie
możemy używać słowa import w pliku, który nie jest modułem.
Jak podłączymy to do strony w ten sposób to nie jest to modułem
musimy dodać tutaj specjalny atrybut type module.
Ten atrybut sprawia, że przeglądarka wie,
że jest to moduł i można tam korzystać właśnie z takich importów.
I teraz w przeglądarce jak widzisz wszystko działa jak należy.
Czyli można powiedzieć, że przeglądarka
zobaczyła sobie ten plik jak go zaczęła wczytywać, zobaczyła
importy i tą ścieżkę utworzyła sobie relatywnie do tamtego pliku
i zobaczymy to w panelu Network,
po prostu pobrała ten dodatkowy plik helpers.
Widzimy to w tym miejscu.
Wspomniałem o tym, że możemy eksportować
jeszcze inne rzeczy z dowolnego pliku, tu też możemy mieć
jakieś inne importy z których korzystamy itd.
Otóż możemy na przykład utworzyć sobie stałą, którą nazwalibyśmy PI i
przypiszemy tutaj Math.PI, czyli po prostu liczba PI.
I załóżmy, że chcemy to wyeksportować.
Albo można od razu napisać export const, albo można na końcu takiego pliku zrobić
eksport i wtedy w takich nawiasach trzeba podać to co chcemy wyeksportować czyli np.
PI.
Zatem jeżeli zrobimy coś takiego to tutaj będziemy mogli to zaimportować
pisząc po prostu PI i wyświetlając to console.log PI.
Zobaczmy.
Tutaj po odświeżeniu jak widzisz ta liczba
się wyświetla, więc można różne rzeczy sobie eksportować.
No i teraz chciałbym jeszcze powiedzieć o
tym, że eksporty mogą być nazwane tak jak te.
Czyli jak wyeksportowaliśmy funkcję, która ma
nazwę addZero to musimy przy importowaniu podać ją w takich nawiasach.
Aczkolwiek można by było tutaj zmienić jej nazwę, czyli np.
padZero.
To można zrobić tak zaimportuj addZero as padZero
i wtedy w całym tym pliku tu gdzie mieliśmy addZero napisali byśmy padZero.
Czyli można też zrobić coś takiego.
Działa to dokładnie tak samo,
natomiast możemy również importować domyślne exporty.
I co jest domyślnym eksportem?
Otóż to co wyeksportujemy z użyciem słowa default
np export default
function albo w przypadku liczby PI moglibyśmy powiedzieć export default PI
i tylko jeden domyślny export może znajdować się w całym pliku, czyli tu
eksportuje te dwie funkcje po nazwie, a domyślnie eksportuje liczbę PI.
Tutaj nie ma to sensu w naszym
przykładzie, ale chcę Ci to pokazać dlatego, że jak eksportujesz coś jako export
domyślny to jak to importujesz i nie podajesz tego tutaj w tych nawiasach
tylko robisz to w ten sposób import PI
tutaj można podać przecinek i zaimportować
kolejne rzeczy. I wtedy będzie to działać dokładnie tak samo,
ale to co jest ważne jeżeli eksport jest
domyślny, to nie musisz go importować po takiej samej nazwie.
Możesz tutaj sobie napisać np.
piNambur w ten sposób i tutaj podstawić piNumber, zobacz.
Zadziała to dokładnie tak samo.
A zatem jeżeli eksport jest domyślny i
taki może być tylko jeden, to importujemy go bez takich nawiasów.
Oczywiście gdybyśmy nie chcieli
pozostałych rzeczy, to wyglądałoby to tylko tak,
i wtedy pod tą stałą, bo to będzie taka
stała otworzona, znajdzie się to, co było domyślnie eksportowane.
Natomiast jeżeli eksporty są takie jak tutaj, że nie piszemy export default
function, bo tak można byłoby też napisać tylko samo export function, to
eksportujemy po nazwie i wtedy importując trzeba to zawrzeć w takich nawiasach i
podać dokładną nazwę, którą jednak podczas importu można zmienić na inną.
Jak zatem widzisz przeglądarki radzą sobie bez problemu z takimi modułami, ale jak
pokazałem w lekcji poprzedniej, jeżeli będziemy mieli po prostu bardzo wiele tych
modułów, to przeglądarka musi pobrać wiele plików.
Dlatego mimo wszystko na dzień dzisiejszy
dobrym pomysłem jest to, aby podczas developmentu pracować w ten sposób, ale
podczas budowania aplikacji do produkcji zbundlować to wszystko do jednego pliku.
I właśnie w tym celu mam tutaj Snowpacka skonfigurowanego tak jak w lekcji
poprzedniej i dzięki niemu będziemy mogli sobie to wszystko zbundlować,
ale muszę przejść do katalogu,
zobaczmy moduły i następnie zainstalować z użyciem npm
install wszystkie zależności, żeby pojawił się katalog node_modules i wtedy będziemy
mogli skorzystać z tego Snowpack. Jak sobie tutaj odświeżyłem explorer
pojawi się node_modules
i skrypty, które wstawiliśmy w lekcji poprzedniej tutaj takie jak Snowpack build pozwolą
nam zbudować tą aplikację wpisując npm run build, ona się cała zbuduje,
pojawi się w katalogu build zobacz i teraz wszystko będzie zawarte w jednym pliku.
Nie będzie już wielu osobnych.
Możemy sobie ten plik uruchomić.
Przejdźmy do build.
Jak widzisz wszystko działa tak samo, ale przeglądarka musiała pobrać wyłącznie
jeden plik, bo do niego zbundlowaliśmy to wszystko.
Podsumowując możesz korzystać z importów i z eksportów, w dowolnym pliku
możesz sobie coś wyeksportować, w innym pliku to zaimportować i z tego korzystać,
natomiast jak importujemy rzeczy podając taką relatywną ścieżkę to wiemy, że
importujemy rzeczy, które gdzieś tutaj mamy w katalogach.
Natomiast jeżeli podajemy nazwę tak jak robiliśmy wcześniej np.
import mieliśmy tam dateTime
from luxon, to jeśli tutaj nie ma właśnie na początku żadnej kropki, żadnej
ścieżki relatywnej to przeglądarka tego nie zrozumie,
ale takie narzędzia jak Snowpack
będą potrafiły to wyciągnąć z katalogu node_modules i w odpowiedni sposób podstawić tak
aby przeglądarka już wiedziała skąd taki plik ma zaciągnąć.