Nowy Standard JavaScript
10 godz. 43 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperNa początku dowiesz się jakie nowości pojawiły się w języku, jeśli chodzi o tworzenie zmiennych i stałych. Poznasz dwa nowe słowa let i const, a także dokładnie omówimy ich różnice, względem znanego nam do tej pory słowa var. Następnie poruszymy temat obiektów. Zobaczysz jak nowy zapis pozwoli znaczenie ułatwić nam pracę i sprawić, by kod był bardziej czytelny. W kolejnym rozdziale porozmawiamy o zmianach w funkcjach. Poznasz tzw. arrow functions wraz z poradami, kiedy z nich korzystać, a także z konsekwencjami ich użycia. Zobaczysz również, jak korzystać z domyślnych parametrów. Następną nowością będą operatory rest i spread, które znacząco uproszczą pisanie kodu dla funkcji i tablic. Chwilę później rzucimy okiem na bardzo ciekawy temat, mianowicie na tzw. destructuring. To nowa funkcja języka, która pozwala w łatwy sposób wyciągnąć odpowiednie dane z tablic i obiektów, nawet jeżeli te posiadają kilkupoziomową, zagnieżdżoną strukturę. Zmian doczekały się również ciągi znaków. Poznasz nowy zapis, tzw. template string, a także możliwość wykorzystania funkcji tagujących.
ES6 wprowadza do języka JavaScript zapis klas. I choć na początku wydaje się, że to duży krok w stronę klasycznych obiektowych języków programowania, to jak się przekonasz, jest to w dużej mierze tzw. syntactic sugar, a więc zupełnie nowy, prostszy zapis, a prawie identyczne jak wcześniej działanie, oparte na dziedziczeniu prototypowym. W kursie poruszymy również temat Symboli oraz tego jak z nimi pracować, a chwilę później poznasz iteratory. To konstrukcje ułatwiające iterację, które znacząco upraszczają pracę z kolekcjami danych. Wraz z iteratorami poznasz również generatory, które ułatwiają z kolei tworzenie tych iteratorów. Istotną nowością w ES6 są również natywne Promise. To sposób na rozwiązanie problemu asynchroniczności, który znamy od bardzo dawna w postaci różnych bibliotek. Od teraz jednak Promisy znajdują się bezpośrednio w języku. Nowymi konstrukcjami, które pozwalają pracować z kolekcjami danych, są Map i Set. Dowiesz się jak z nich korzystać, a także do czego są przydatne. W jednym z rozdziałów rzucimy też okiem na tzw. Proxy API. To mechanizm języka, który pozwala na dość niskopoziomowy dostęp do różnych operacji. I choć być może nie jest to coś, z czego będziesz korzystał nad wyraz często, to warto wiedzieć, jakie są nowe możliwości tego API.
Jedną z najlepszych nowości, która zawitała do języka JavaScript wraz z ES6 są moduły. To możliwość dzielenia kodu na wiele plików, z których można pewne wartości wyeksportować, a następnie zaimportować je w innych modułach. Tutaj dowiesz się wszystkiego, co z modułami związane. Zobaczysz wiele sposobów na eksport i import, a także jak pracować z modułami w przeglądarkach internetowych. Kurs skupia się na omówieniu wszystkich najważniejszych nowości w ES6, dzieląc je na rozdziały. Jeden z nich natomiast, poświęcony został omówieniu mniejszych zmian, które znalazły się w specyfikacji. Poznasz w nim np. nowe metody tablic czy ulepszoną współpracę z Unicode.
Specyfikacja EcmaScript 2015 wprowadziła naprawdę bardzo wiele zmian, ale jej twórcy założyli, że od tego czasu każda kolejna wersja specyfikacji będzie pojawiać się co roku. Oznacza to przede wszystkim, że nie będziemy na raz bombardowani aż tak wieloma zmianami, jak w 2015 roku. W tym kursie nie zabrakło zatem omówienia nowości ze specyfikacji ES2016 oraz 2017, gdzie poznasz np. nowe metody dla stringów czy funkcje asynchroniczne.
Kiedy będziesz już uzbrojony w solidną wiedzę z zakresu nowości w ES6, dowiesz się jak w praktyce pracuje się dzisiaj z tym standardem. W jednym z rozdziałów omówimy nowoczesny workflow z użyciem npm i wykorzystamy popularne narzędzie webpack, do pracy z modułami, a także do transpilowania kodu ES6 do wersji ES5. Dzięki temu nowoczesny kod, który napiszemy, będzie mógł być uruchamiany również w starszych przeglądarkach, które nie wspierają najnowszego standardu. Dowiesz się na co zwrócić uwagę, by wszystko działało bez zarzutu.
Zwieńczeniem tego kursu będzie praktyczny projekt, w którym od podstaw wykonamy swoją własną bibliotekę do pracy z Obiektowym Modelem Dokumentu. Będzie ona w działaniu nieco podobna do znanej chyba wszystkim biblioteki jQuery. Na tym przykładzie postaramy się wykorzystać jak najwięcej wiedzy z zakresu ES6 zdobytej wcześniej. Stworzymy metody do pracy z drzewem dokumentu, a więc do wyszukiwania elementów, do tworzenia nowych, do przypisywania im klas, atrybutów czy styli CSS. Nie zabraknie również modułu odpowiedzialnego za współpracę z Ajax. Cały kod utworzymy oczywiście w sposób modułowy, aby bibliotekę można było łatwo rozwijać w przyszłości. Na koniec projekt ten przetranspilujemy do kodu ES5 z użyciem Babel i przetestujemy w starszej przeglądarce Internet Explorer 11, aby upewnić się, że nasza biblioteka działa poprawnie.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i czują się w pracy z nim swobodnie. Jeśli zatem chciałbyś pracować z nowoczesnym kodem JavaScript, to ten kurs jest zdecydowanie dla Ciebie. A może masz zamiar poznać framework Angular lub bibliotekę React? Tam również wykorzystywany jest najnowszy zapis ES6, więc wiedza ta będzie naprawdę pomocna. Z solidną wiedzą z zakresu EcmaScript 6, bez trudu pozostaniesz na bieżąco z każdą kolejną edycją tej specyfikacji.
W tej lekcji porozmawiamy o tym, czym są promise i w jaki sposób działają.
EcmaScript 6, można powiedzieć, że wprowadza natywne promise'y, bo
jest to koncepcja, która od wielu lat była dostępna w środowisku JavaScript'owców,
dlatego, że można to było spokojnie napisać w kodzie EcmaScript 5 No
i właśnie w ten sposób to powstało, ale, że promisy są bardzo popularne, to zostały
też dodane w specyfikacji i możemy z nich korzystać w natywny sposób, więc pokażę
ci teraz na czym one polegają. Na początek przygotowałem sobie taki kod, w razie
czego sobie zapauzuj i prześledź, Co tutaj się dzieje, aczkolwiek nic tutaj nowego nie zrobiłem,
czego jeszcze mógłbyś nie znać, czyli generalnie stworzyłam sobie tylko metodę
pomocniczą, która pozwoli mi wyszukać na stronie elementy, bo będę to robił kilkukrotnie. D
odatkowo to, co jest ważne. stworzyłem metodę get json. Podaje
jej adres URL i ona tworzy nowy obiekt Ajax'owy. Otwiera
go, przypisuje zdarzenie, że jeżeli uda się wszystko pobrać to wyświetlimy sobie
odpowiedź w konsoli. Jeżeli będzie błąd, to chcemy ten błąd wyświetlić, też
w konsoli i na onerror gdyby jakieś problemy sieciowe na przykład były też
wyświetliły błąd na końcu to wysyłamy i teraz po kliknięciu na przycisk który sobie pobieram
właśnie tą metodą pomocniczą, chcę wykonać funkcje get json,
przekazując jej adres, czyli ona otrzyma adres. Wyślę zapytanie kiedy
ono powróci, poprawnie to na przykład będziemy mieli wykonaną tą linijkę.
Kliknijmy pobierz dane, zapytanie się wysłało i dane zostały wyświetlone
tutaj, więc jak widzisz nie ma tutaj żadnej magii, ale teraz pokażę
ci na tym przykładzie jak wykorzystać promise. Generalnie promise,
czyli tak zwane obietnice są stworzone do tego, aby pracować z asynchronicznym
kodem i wiemy, że ajax jest idealnym przykładem asynchroniczności, aczkolwiek takiej
asynchroniczności możemy oczekiwać czy możemy ją znaleźć również
w środowisku takim jak Node.js, bo tam na przykład otwierając jakiś
plik z dysku też podajemy funkcje callback mówiąc kiedy uda ci się
odczytać ten plik, to wykonaj tą funkcję i to zawsze chwilę trwa. Oczywiście
zazwyczaj nie jest to zauważalne, ale nie mniej jednak nie jest to synchroniczny kod dlatego promise'y tam
też są bardzo przydatne i teraz co by było gdybym ten kod, który jest tutaj
chciał zamienić w taki sposób i być może już to widziałeś na przykład korzystając
z biblioteki jQuary, która ma podobny obiekt deffered. Chciałbym napisać get
json i móc później napisać then, czyli kiedy uda ci się pobrać te
dane, to wykonaj funkcję którą tutaj przekażę przekazując mi te dane na przykład
pod parametrem json. Ja bym te dane chciał wstawić na stronę, ale znamy
już zapis arrow function, więc skorzystajmy tutaj z uproszczonego zapisu. Tworzę
funkcję, która przyjmie parametr json i kiedy go otrzymam, to chciałbym sobie na
stronie znaleźć element pre-39, jak na przykład. Znajdziesz
go tutaj w html'u i do niego będę chciał poprzez textContent przypisać
sobie json, czyli znasz już taki zapis arrow function tylko, że teraz mi to nie zadziała, bo
łatwo się domyśleć, czytając ten kod, że get json nic nie zwraca,
czyli zwraca domyślnie undefined i ja na tym undefined próbuję zrobić then. Oczywiste,
że to musi wygenerować błąd po kliknięciu w przycisk. No i tak też się stało, błąd
się pojawił, bo then na undefined nie jest dostępne, czyli musimy zwrócić sobie
z funkcji get json, coś, co będzie zawierało metodę then. No i
właśnie będzie to promise. Teraz sobie taką promiskę będę chciał utworzyć i zrobimy,
to na przykład w tym miejscu, napiszę let p równa się new promise, w taki
sposób w EcmaScript 6 tworzymy promise i podajemy jej zawsze funkcję, która
otrzyma dwa parametry. Pierwszy z nich jest to resolve. Możesz
go nazwać inaczej oczywiście, bo to ty definiujesz funkcję w tym miejscu, ale zazwyczaj
nazywamy go jako resolve, a następnie jako reject i interpreter JavaScriptu,
kiedy będzie wykonywał ten kod umieści pod tymi dwoma parametrami
odpowiednie funkcje, więc resolve i reject, to są funkcje, które możesz
wywołać w dowolnym momencie i teraz resolve wywołujesz jeżeli
wszystko było okej, a reject jeżeli wystąpił z twojego punktu widzenia
jakiś błąd. Dlatego teraz będziemy chcieli sobie zrobić coś takiego, że
przypiszemy zdarzenie onload tutaj i w momencie
kiedy uda się nam wszystko wczytać, ta linijka dla mnie oznacza
sukces, to wykonam sobie funkcję, którą mi przekaże JavaScript'owy
resolve. Zauważ, że mogę jej coś przekazać i powiem ci od razu, że
kiedy wykonujemy resolve, zauważ, że od nas zależy kiedy to wykonamy. To
wtedy wykona się to, co ktoś dopisał do then. Tylko, że na końcu,
bo cały czas o tym mówię, że get json musi coś zwracać, taki promise musimy
zwrócić, więc zaraz jeszcze dokończymy pozostałe rzeczy, ale zróbmy sobie return p,
czyli jeszcze raz promise zwraca nam jakiś nowy obiekt,
który my zwracamy z tej funkcji. Ten nowy obiekt zawiera w sobie między innymi
metodę then, dlatego mogę z niej skorzystać. Po wywołaniu get json i tej metodzie then, jako pierwszy
parametr przekazuje się funkcję, która się wywoła wtedy, kiedy
wewnątrz tej promisy wykonamy resolve. Może to być nawet za 10
sekund, mógłbyś sobie tutaj timeout ustawić, zamiast korzystać na przykład z ajax'a. Wiemy
jednak, że ajax jest asynchroniczny, więc wykona się po jakimś czasie. Kiedy
wywołuje sobie resolve, to mogę przekazać co mi się podoba i to będzie wtedy
tutaj, czyli kiedy przepisuje jeden, mówię wywołaj tą
funkcję z parametrem json, a tymże parametrem jest właśnie to. Natomiast
drugi parametr to then, dlatego może zróbmy tutaj trochę miejsca. Jest
to druga funkcja. Jeżeli dla ciebie bardziej czytelne są te zwykłe funkcje, możesz je tak wpisać. Ja
wpiszę arrow function, czyli drugi parametr do then jest to funkcja, która się wykonana na reject,
czyli na ewentualny błąd. Będę chciał,
żeby ona przyjmowała jakiś parametr, który nazwę error i znowu będę chciał sobie wyszukać na
stronie ten pre-39 i jego textContent ustawić
na error message. Czyli z punktu widzenia mojego
kodu, w tym miejscu będę miał błąd, więc
wykonam sobie reject i przekaże tam nowy obiekt błędu, dzięki
temu będzie on pod error i będę mógł skorzystać error message i również
tutaj z punktu widzenia mojego kodu jest błąd, więc
też wykonam sobie reject, okej. Jak
zatem widzisz, jeżeli uda się wczytać Ajax'a, to wykona się tylko resolve i wtedy tylko
nasza funkcja, która jest tutaj, powinna wykonać, więc spróbujmy sobie kliknąć
teraz przycisk i zobaczmy. Dane się wczytały, a to oznacza, że
po pobraliśmy dane z serwera i wykonała się funkcja resolve. Nigdy nie wykonała się
funkcja podana tutaj, ale spróbujmy zepsuć ten adres. Pobierz
i mamy wystąpił błąd. Dlatego, że tak naprawdę nasz Ajax wywołał tę
funkcję onerror, a w niej wykonujemy reject, czyli kiedy wykonujemy reject, to
oznacza wykonaj wszystkie za kolejkowanie tutaj funkcje,
bo ich będzie mogło być więcej, o czym przekonasz się w lekcji kolejnej, więc w tej lekcji
to wszystko, mam nadzieję, że taką podstawową koncepcję promise zrozumiałeś. Po
prostu promise wywołane w ten sposób, zwraca nam jakiś obiekt, do którego można
później przepisywać poprzez then i jeszcze kilka innych metod, takich handler'y,
które się mają wykonać kiedy wykonamy funkcję resolve albo reject.