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 pokażę ci, w jaki sposób możemy łączyć promise'y w taki sposób łańcuchowy,
czyli przypisywać odpowiednie handler'y, mamy tutaj przykład identyczny, jak w lekcji poprzedniej, więc
jeżeli bym tej odświeżył kliknął przycisk pobierz dane, to są one poprawnie pobierane
i nie ma tutaj nic nowego. Pokazywałem ci, że do promise, do tego
obiektu zwróconego tutaj, możemy za pomocą metody then przypisać handler'y,
czyli takie funkcje, które się mają wywołać na reseolve albo na reject i pierwszy
parametr do then oznacza, że jest to funkcja na resolve, a drugi
na reject. Natomiast nie musimy nawet tego zapisywać w taki sposób, możemy
zrobić to trochę inaczej, otóż mamy metodę i to sobie zapiszę
może w takiej formie. Tutaj nawet nie jest potrzebny ten nawias, okej
mamy jeszcze jedną metodę, którą chcę ci teraz pokazać,
więc tutaj nie mogę mieć średnika na końcu i jest to metoda catch. Oczywiście
wszystkie te nowe znaki, które ja tutaj robię, czyli na przykład enter. One
w JavaScripcie nie mają znaczenia, więc tylko dla czytelności i teraz o ile metoda
then przyjmuje jako pierwszy parametr funkcji na resolve, a drugi na reject, to metoda catch przyjmuje
jeden parametr i jest to właśnie ta druga funkcja, którą można było przekazać do then,
czyli ta funkcja na reject. Zapiszmy ją sobie sobie zatem tutaj i sprawdzimy
czy efekt byłby taki sam. Pobierz dane jest wszystko
okej. A jeżeli zmienimy adres na niepoprawny, pobierz dane wystąpił
błąd, więc możemy łańcuchowo to łączyć właśnie z tego powodu, że metoda then
gdzieś tam wewnętrznie dalej zwraca ten obiekt promise, więc dalej do niego
możemy przepisywać catch. Chciałbym ci teraz jednak pokazać, że możemy
łączyć również kilka zapisów then. Co się dzieje tutaj, gdybyśmy
sobie sprawdzili czym jest json są pobrany z serwera. Jest to zwykły string i teraz
zazwyczaj taki json chcemy zamienić na obiekty JavaScript'owe za pomocą
json parse, więc gdybym tutaj chciał napisać kolejny then i chciałbym,
żeby on otrzymywał już dane w formacie właśnie JavaScript'owym,
więc napiszę sobie na przykład obj, bo będzie to jakiś obiekt i chciałbym żeby
on go przyjął i żeby go wyświetlił na początek może w console.log'u. No
to zobaczymy, co tutaj się wydarzy. Okaże się, że mamy
błąd, bo jeszcze tutaj musimy poprawić sobie http, ale
jak widzisz otrzymaliśmy zwykły
string. Czyli co tutaj się wydarzyło. Mianowicie na początek udało
się wszystko poprawnie pobrać i wstawić do tego elementu pre, ale
później kiedy dodałem następny then to automatycznie te same dane zostały
mi przekazane tylko tutaj nazwałem inaczej parametr, więc cały czas jest to string. Ale
w ten sposób mogę sobie łańcuchowo połączyć kilka wywołań, w konsoli ten string się wyświetlił,
ale żeby to był JavaScript'owy obiekt, to okazuje się, że można zrobić tak i zapisze tą
funkcję może w takim formacie, żeby ona dla nas była bardziej czytelna. Okazuje
się, że można z jednego handler'a do dodanego do then coś
zwrócić i to co zwrócisz będzie w kolejnym then pod zmienną,
którą sobie tutaj zdefiniujesz. Jeżeli zwrócę jeden, to tutaj będę miał jeden. Sprawdźmy czy
tak by się stało. Pobierz dane. Widzimy 1. Czyli
jeżeli nic nie zwrócisz, to te same dane są przekazywane dalej, a jeżeli zwrócisz
coś. To to się pojawia tutaj. Dlatego skoro tutaj ten tekst wstawiłem sobie na
stronę, to chciałbym go zamienić na obiekt JavaScript'owy metodą parse
na obiekcie json i zwrócić i to już zwraca utrata prawdziwy JavaScript
obiekt, który tutaj pod Object powinien się pojawić. Sprawdźmy. Okazuje
się, że jak najbardziej i teraz mógłbym sobie z nim coś zrobić i na przykład jakoś jego dane
wyświetlić. Takich wywołań then może być oczywiście więcej.
Natomiast to co jest ciekawe, to jeżeli wystąpi błąd to ominiemy wszystkie
then i wywołamy tylko catch. Zauważ, jeżeli tutaj sobie popełnimy błąd, w ten
sposób. Spróbuję to wysłać. Od razu mamy Wystąpił błąd. Dlatego dobrym
pomysłem jest dodawanie sobie catch gdzieś na końcu. Jeżeli błąd się pojawi, to
tutaj można go przechwycić. Natomiast mam dla ciebie jeszcze jedną ważną wiadomość. Otóż nie
tylko, jeżeli tutaj zrobimy reject, to wywoła się catch, catch się wywoła
również wtedy, kiedy w dowolnej funkcji przypisanych do tych handler'ów pojawi
się błąd, czyli gdybym na przykład w tej funkcji chciał zrobić console.log,
w ten sposób. Może ją zapiszmy tak, ale
dodatkowo zrobiłem throw new error, wystąpił
inny błąd, to zauważ co się stanie. Przejdźmy
tutaj, pobierz dane i mamy wystąpił inny błąd. Czyli catch przechwyci
nam również błędy, które pojawią się wewnątrz funkcji obsługujących właśnie,
na przykład sukces, czyli nie tylko wtedy jest catch kiedy wykonasz reject. Warto
o tym pamiętać, chociaż na razie to wykomentuje i na koniec tej lekcji jeszcze
jedna bardzo ważna rzecz. Pokazałem ci, że w takiej promise możesz coś zwrócić, na przykład
json i to będzie po kolejnym parametrem, w kolejnej funkcji then, ale okazuje
się, że możesz z takiej funkcji zwrócić również kolejną promise i dopiero kiedy
ona będzie miała status resolve, czyli zostanie na niej wykonana funkcja resolve,
dopiero wtedy wykona się kolejny then, do którego to co ona będzie mieć w resolve,
zostanie przekazane. Jak zatem możemy to zasymulować, otóż zróbmy
sobie tutaj return get json i podajmy ten sam adres, ale
żeby on wrócił troszeczkę inne dane, to możemy do niego dodać parametr shuffle. Na
serwerze tak to zrobiłem, że jeżeli podamy shuffle 1, to one będą po prostu pomieszane, to
będą troszeczkę inne dane i teraz zastanówmy się co ja zwracam, wywołuje get json, a
ta nasza metoda zwraca promise i to jest super ważne, więc
ja zwracam nową promise z tego zapisu i okazuje się, że dopiero kiedy ona
będzie miała status resolve, bo na samym początku, kiedy tworzymy nową promise ma ona
status pending, a kiedy się już uda zrobić resolve albo reject to ma
status resolve albo rejected, więc kiedy
ona będzie miała resolve dopiero wtedy wywoła się ten then i do niego zostanie przekazany
to, co ona przekazywała, więc to już nie będzie ten json parse tylko znowu zwykły
string. Zobaczmy czy faktycznie ma to sens okazuje się, że tak
natomiast gdyby z kolei w niej pojawił się jakiś błąd, bo ona miałaby niepoprawny
adres, wtedy wywoła się on error i zrobimy w niej reject, to
jest jakby zupełnie nowa promise, to wykona się też nasz catch, sprawdźmy.
Widzimy wystąpił błąd, tak zapamiętaj sobie, że po pierwsze możesz tak
kaskadowo łączyć wszystkie te then'y i jak z jednego coś zwrócisz to w drugim już możesz
na tym pracować, ale dodatkowo możesz zwrócić nową promise i dopiero
od jej resolve albo reject należy czy dalej wykona się twoje then
i z jakimi danymi czy wykona się funkcja przypisana do catch.