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, że klasa promise ma również pewne
metody statyczne, z których możemy skorzystać i zaczniemy sobie od jakiego przykładu jak
już mieliśmy wcześniej, czyli funkcja get json. W momencie kiedy kliknę przycisk pobierzemy
dane jsonem i wyświetli menu ja na stronie, więc zobaczmy klikam
pobierz i dane się wyświetliły. Natomiast co się dzieje jeżeli kliknąbym pobierz
drugi raz. Jeżeli w konsoli zaznaczysz sobie opcje LogXMLHttpRequest
to będziemy widzieć wszystkie wysłane zapytania, więc jeżeli tutaj bym sobie
kliknął pobierz dane, to widzimy, że raz jeszcze wysłaliśmy zapytanie do serwera
i te dane raz jeszcze tutaj wstawiliśmy. Natomiast chciałbym zrobić taką opcję,
że jeżeli dane zostały już pobrane, to chcę je zapisać pamięci podręcznej. Natomiast
nie chciałbym musieć modyfikować tego kodu, który korzysta z then i catch. Dlatego
utworze sobie na samej górze naszego zakresu stałą jak
pamięć podręczna. Pamiętaj, że wszystko co tutaj tworzymy to są
globalne funkcje, bo nie ograniczyłem tego zakresu, ale robię to wyłącznie dla czytelności naszego
przykładu w kursie. Normalnie warto byłoby, żeby coś takiego jak catch nie
było widoczne na całej stronie, ale będzie to taki oto obiekt i teraz będę
chciał zrobić tak, że na samym początku kiedy wywołujemy get json, chciałbym
sprawdzić czy w tym obiekcie cashe znajduje się już
pod kluczem adresu URL coś, czyli jeżeli wywołamy get json
z jakimś adresem URL drugi raz, to powinno coś być w tym catch, bo zaraz pogadamy, czyli
jeżeli to nie jest równe undefined to
będę chciał coś zrobić i konkretnie będę chciał wtedy zakończyć
i napisać tutaj jeszcze zwracam
dane z pamięci podręcznej. Natomiast
na razie nam to wygeneruje błąd, ale o co chodzi. Wyobraźmy sobie, że wywołujemy
ten get json przekazując URL. Sprawdzimy czy tutaj URL
to nie jest undefined. To będzie wartość undefined, bo nic tutaj nie ma, więc pominiemy ten blok kodu. Chodzi
mi o to, że w momencie kiedy pobiorą się te dane i przekażemy je do resolve, to
żeby zrobić sobie cashe url równa się xhr responseText, czyli
po prostu chcę cały ten tekst pobrany z serwera zapisać sobie w tym obiekcie, więc
sprawdzimy czy rzeczywiście nam się to uda. Pobierz dane wszystko działa
poprawnie, ale spróbujmy raz jeszcze sobie wywołać tę funkcję klikając
i teraz będziemy mieli zwracam dane z pamięci podręcznej i pojawił się błąd, bo
nie zwróciliśmy promise. No właśnie zwróciłem tutaj return, czyli
zwykłe undefind, więc do tego nigdy nie doszliśmy i dlatego then nam nie zadziałało,
ale z pamięci podręcznej coś możemy zwrócić i teraz chcę ci pokazać co. Otóż
mamy na klasie promise, czyli nie muszę tworzyć nowego obiektu poprzez new promise,
ale od razu promise, coś takiego jak metodę resolve i reject i to nam
zwraca promise, która od razu jest w stanie resolve. Mówiłem ci
poprzedniej lekcji, że taka nowa promise utworzona zanim wykona się resolve, czyli że
reject ma status pending. Natomiast tutaj od razu tworzymy promise,
która od razu jest resolved i mogę jej przekazać dane tak jak przy resolve, czyli chcę
przekazać to co mamy w tym CACHE i chcę to zwrócić.
Mam nadzieję, że ma to dla ciebie sens, czyli jeżeli już raz takie zapytanie było wysłane
to nie chce wysyłać go raz jeszcze, tylko tym return zakończyć całą funkcję,
ale żeby nasz kod działał poprawnie, to on tutaj oczekuje, że then i catch będzie
działać, czyli oczekuje promise. Dlatego można zrobić promise resolve i przekazać
dane, które mają być pod resolve i to zostanie zwrócone, a więc tylko then
nam się wtedy wykona, ale wszystko powinno działać tak samo, więc zróbmy sobie tutaj Pobierz
dane. Udało się i teraz spróbujemy raz jeszcze. Przy okazji gdybyś
międzyczasie wyświetlił obiekt cache, to widzimy, że pod kluczem do tego adresu URL
te dane są. Spróbujmy raz jeszcze dać Pobierz dane i nie mamy
żadnego błędu, one zostały tutaj znowu wstawione i mamy zwracam dane w pamięci podręcznej. W
ten zatem sposób możesz korzystać z metod statycznych, na
przykład żeby zrobić sobie pamięć podręczną, natomiast co jest ciekawe, one są
potrzebne głównie po to, że jeżeli mamy jakiś kod, który oczekuje promise,
że tam będzie then i catch, to możemy dowolnie ten kod sobie
napisać, ale wystarczy że w którymś jego momencie będziemy robić promise
resolve, zwracać ją w takim, w takiej formie, bez tworzenia nowego obiektu,
czyli tak naprawdę synchronicznie, a nie asynchronicznie i to co jej przekażemy
będzie później obsłużone w then albo w catch. Co ciekawe również mam
metodę reject liczbę, która w moim przypadku się nie przyda, ale załóżmy, że chcielibyśmy
powiedzieć, że drugi raz nie możemy pobierać takich danych, więc jeżeli one się tutaj
znajdują, to moglibyśmy zwrócić promise reject, czyli od
razu ją odrzucić i tutaj zrobić new error i napisać
nie można pobierać tych samych danych
po raz kolejny i to z kolei sprawi, że promise
zostanie zwrócona od razu w stanie rejected i catch się na tym wykona. Zobaczmy. Teraz
pobieramy dane, jest wszystko w porządku, ale próbuję to zrobić drugi raz i mamy
komunikat, że nie można pobierać tych samych danych po raz kolejny, czyli ta
funkcja się nam wykonała. Ja jednak na końcu zostawię to w takiej
formie, bo jest to przynajmniej coś to jest praktyczne. Możemy w ten sposób zasymulować
sobie pamięć podręczną.