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.
Dowiedziałeś się już w jaki sposób pracuje się z modułami, czyli jak coś eksportować i
importować na wiele różnych sposobów i to co ci pokazałem jest zawarte
w specyfikacji EcmaScript. Natomiast sam fakt, jak to powinno zostać zaimplementowane
w różnych środowiskach, na przykład przeglądarkach internetowych, już w tej specyfikacji
nie jest zawarty, dlatego przez bardzo długi czas nie było w przeglądarkach
możliwości ładowania w natywny sposób takich modułów. Ja
ci jednak pokazałem, że możemy operować na modułach w przeglądarce i w chwili
kiedy te słowa wypowiadam, to możemy w przeglądarce Safari pracować z modułami bez
problemu. Natomiast w innych przeglądarkach musimy sobie taką opcję uruchomić i
pokazałem ci jak w Chrome Canary możemy uruchomić sobie to za
pomocą właśnie Chrome config czy Chrome flags. No i teraz gdybyśmy
sobie przeszli na stronę Can I use i tutaj wpisali module, to możesz
zobaczyć właśnie, że tylko Safari wspiera te moduły, również na iOS,
czyli na urządzeniach mobilnych. Natomiast w innych przeglądarkach można je uruchomić za
pomocą odpowiedniej flagi. Tak jest tutaj w Internet Explorerze, czyli w zasadzie w wersji
Edge. To już nie jest Internet Explorer. W Firefoxie oraz w Chrome, czyli
możemy sobie to włączyć, aby to przetestować, ale jak widzisz nie jest to jeszcze technologia gotowa
do tego, abyśmy mogli naszą aplikację wstawić do internetu i aby użytkownicy
mogli z nich korzystać, bo tylko jeżeli ktoś będzie korzystał z Safari, to wszystko
będzie działać poprawnie, w każdej innej przeglądarce bez włączenia tych odpowiednich flag, niestety
nie będzie to działać. Ten problem można oczywiście obejść i później zrobimy
to z użyciem webpack'a, czyli będziesz mógł pisać te nowoczesne moduły, tak jak ci pokazałem,
a webpack jest to takie narzędzie, które odpowiednio je wszystkie połączy do
jednego pliku i wszystko będzie okej. Natomiast chciałbym jeszcze kilka słów w
tej lekcji wspomnieć na temat tego, jak dokładnie te moduły działają, w tej specyfikacji
html, czyli w przeglądarce właśnie jeżeli chodzi o ten element o typie module. Być może
oczywiście kiedy ty ten kurs oglądasz tutaj na tej stronie Can I use, wygląda to zupełnie
inaczej i te moduły są już dobrze wspierane. Ja ci tylko pokazałem w lekcji wprowadzącej
do modułów, że możemy sobie dodać i gdybyśmy sprawdzili źródle strony do
skryptu, typ module. Nie jest to typ text ukośnik
JavaScript, ale typ module i wtedy w takim module będzie dostępne słowo
import lub export. Dodatkowo ważne jest to, że te moduły
mogą się pojawiać w różnych miejscach tutaj w naszym kodzie. Mamy w jednym miejscu, ale mogłoby
ich być więcej i ważne jest to, że one się zachowują tak jak skrypty, które
mają atrybut defer. Nie wiem czy kiedykolwiek do skryptu taki atrybut dodawałeś, ale
to oznacza, że przeglądarka wczytując taką stronę, normalnie jeżeli widzi
skrypt, to ona wczytuje cały ten skrypt i blokuje dalsze renderowanie strony. Natomiast
jeżeli zobaczy atrybut defer, to ona tak naprawdę będzie dalej wczytywać stronę, ale
skrypt zacznie pobierać i wykona go dopiero wtedy kiedy wykona
się zdarzenie dom content loaded, czyli tak naprawdę kiedy całe drzewo dokumentu
będzie gotowe, to wtedy taki skrypt się wykona i jeszcze mamy taką pewność,
jeżeli wiele mieliśmy skryptów z atrybutem defer, że one się wczytają czy
wykonają według kolejności. Jeżeli jeden zajmował 5 kilobajtów, a drugi na przykład 100, to
one mogły się w różnej kolejności pobrać, ale z atrybutem defer one się wykonają
w odpowiedniej kolejności. Mówię o tym atrybucie dlatego, że skrypt
o typie module, taki jak tutaj domyślne zachowuje się tak, jakby miał
nadany atrybut defer, czyli nie ważne ile będziemy mieli tych skryptów, one
wszystkie wykonają się dopiero wtedy, kiedy DOM, czyli drzewo dokumentu
będzie już gotowe, kiedy będzie można nim manipulować, a także wykonają
się w odpowiedniej kolejności w takiej w jakiej zostały tutaj umieszczone w kodzie
i teraz chciałem ci pokazać jeszcze tylko jeden przykład. Mamy nasze skrypty
i mamy tutaj w utils array i string, czyli jakieś
funkcje ja w tym naszym skrypcie je sobie importuje. Tym razem w taki sposób,
że importuje sobie wszystko jako arrayUtils i stringUtils. Pamiętasz,
że taki import zaimportuje nam wszystko w formie obiektu, więc później w formie obiektu
mogę do tych poszczególnych metod, które są tutaj się odwoływać i teraz będę
chciał sobie ten kod przenieść do modułu, czyli w mojej aplikacji to
działa tak, że jeżeli tutaj do tego index coś wstawimy, może pamiętasz, witaj. To
nam się na naszej stronie pojawia w tym miejscu, więc jeżeli to
byśmy odświeżyli, to to witaj się pojawiło tutaj i w tym miejscu moglibyśmy też wstawić skrypt,
więc wstawmy sobie tutaj skrypt, który będzie miał typ module i będę
chciał wyciąć wszystko z naszego skryptu, który
był w tym miejscu, czyli już tego modułu nie ma i wstawimy
sobie to tutaj do tego indeksu, czyli zauważ co tutaj się dzieje. Jeżeli teraz to zapiszemy
i odświeżymy, ten moduł pojawił się w tym miejscu, czyli przeglądarka wczytuje tutaj
całą stronę. Jeżeli zobaczy takie importy to ona pobierze sobie dodatkowe pliki. Z
tym, że teraz pojawił by nam się taki problem, że ona będzie chciała te pliki odebrać
relatywnie do tego miejsca w którym to widzi, czyli zauważ że nie
jesteśmy w skrypcie, tylko właśnie w module, czyli tak naprawdę jesteśmy
pod takim adresem i relatywnie do tego adresu przeglądarka będzie ona sobie
pobrać to, co tutaj widzisz i to spowoduje nam tak naprawdę błąd. Po
prostu nic tutaj nie zadziała, gdybyśmy przeszli sobie do Network, zobaczymy.
Sprawdźmy
co tutaj nam zostało pobrane. Jak widzisz, failed to load response data. Ja
mu serwer skonfigurowałem tak, no właśnie tutaj widzimy adres, że jeżeli będziemy
chcieli pobrać sobie niepoprawny plik, to zostajemy przeniesieni tak naprawdę to adresu
początkowego, czyli do 01 tutaj w przykładach. Zobaczymy czy tak nam to zadziała
i tak też się stało. Dlatego te skrypty się nie pobrały poprawnie. Musielibyśmy
tutaj podać poprawną ścieżkę, więc możemy to zrobić w tym przypadku podając
sobie całą taką ścieżkę, czyli to by było 55 i w
tym przypadku naszym byłoby to później start js utils. Zobaczmy
czy teraz to będzie mieć sens, console.log i
teraz wszystko działa, czyli pamiętaj, że te ścieżki tutaj są bardzo ważne i to
co jest jeszcze super ważne to jeżeli chodzi o moduły w przeglądarce, to
one mogą rozpoczynać się tak naprawdę tylko od takiego slash'a. Chodzi
mi o te i ścieżki. Nawet jeżeli mieliśmy to zapisane tutaj w tym skrypcie, gdybym
to cofnął, to jeżeli pracujemy z modułami w przeglądarce, czyli
z tym skryptem o typie module, to poprawny adres tutaj w from
może się zaczynać od slash'a, to znaczy, że od początku chcemy
tak naprawdę tej domeny, tak jak zrobiłem to tutaj, czegoś wyszukiwać, od kropki
i slash'a, to znaczy, że w tym samym katalogu lub na przykład dwukropek to
oznacza jeden katalog wyżej. Tutaj moglibyśmy zrobić drugi katalog wyżej i tak dalej,
czyli nie możemy tutaj napisać na przykład od razu import from array, chociaż
wiesz, że jeżeli na przykład robimy sobie skrypt na stronie, gdybym
tutaj wstawił normalny skrypt, to w src moglibyśmy sobie podać
array js. Tu oczywiście nie byłoby to poprawne. Mam tylko na myśli to atrybucie
src nie musimy podawać czegoś takiego, tylko jeżeli podamy tak, to
znaczy, że ten plik znajduje się w tym samym miejscu co jakby cały ten dokument, który
taki plik wczytuje. Natomiast jeżeli chodzi o moduły, to jest ważne, aby zapamiętać,
musimy tutaj podać ścieżkę, która albo się zaczyna od takiego ukośnika
albo która się zaczyna od kropka ukośnik, dwie kropki
ukośnik lub na przykład, i to jest bardzo ważne, od całego adresu, razem
z protokołem http. Jeśli zatem chciałbyś tutaj załadować sobie jakieś
moduł i miałbyś do niego pełny adres, to również możesz to zrobić właśnie wpisując to
tutaj i na koniec jeszcze jedna bardzo ważna rzecz. Zobacz, że jeżeli ten
skrypt jest ładowany na stronie, w naszym przypadku i podejrzymy źródło strony, to mogłoby
się wydawać, że to co tutaj wpiszemy będzie tak naprawdę też globalne, czyli
gdyby mu otworzył jakąś zmienną, to że ona mogłaby przeciekać do tego globalnego zakresu. Pamiętaj
jednak, że jeżeli skrypt jest o typie module, to na pewno wszystko co w nim jest będzie
prywatne i nie będzie widoczne nigdzie w globalnym zakresie. Wspomniałem
wcześniej, że skrypty o typie module zachowują się tak jakby miały atrybut defer.
Natomiast jeżeli słyszałeś o atrybucie async, który można dodać do skryptu,
to można go również dodać do takiego skryptu o typie module. Gdybyśmy tutaj dopisali
async, to zachowałby się to wszystko tak, że dany moduł
byłby wczytany tak szybko, jak się pobierze z internetu. Byłoby to lepiej
widać w przypadku takiego adresu, bo ten się nawet nie musi pobrać, on jest tutaj od razu wpisany. Natomiast gdybym
tutaj dopisał atrybut async, to mówimy pobierz ten skrypt i wczytaj
go tak szybko, jak to tylko pobierzesz. Natomiast mamy gwarancję, że te moduły, które wewnątrz
byłyby importowane, tak jak na przykład tutaj, też moszą się poprawnie wczytać. Natomiast
gdybyśmy pod spodem mieli drugi skrypt, to nie mielibyśmy już gwarancji, że najpierw się
wykona ten, a potem ten drugi. Natomiast, jeżeli nie dodamy tego async, tylko
tak jak tutaj widzisz, moglibyśmy mieć kilka takich modułów, to na pewno wykonają się one
w odpowiedniej kolejności. Tak jak wspomniałem z atrybutem async można zrobić
tak, że on się wykona kiedy tylko się pobierze, ale nie będzie czekał na inne moduły
załadowane w osobnych plikach, czyli z użyciem script. To
by było zatem tyle, jeżeli chodzi o moduły, będziemy z nim jeszcze pracować z użyciem webpack'a, który
pozwoli nam pisać ten nowoczesny kod i wszystko będzie bundle'ował, czyli składał do
kupy, można powiedzieć, do jednego pliku, który będzie można podłączyć w przeglądarce i wtedy
nie będziemy martwić się o to, czy przeglądarka wspiera moduły czy nie.