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.
Wiesz już w jaki sposób działają moduły, mniej więcej, że można coś eksportować
i w innym module importować. Natomiast w tej lekcji pokażę ci praktycznie wszystkie
możliwe sposoby eksportu i importu. Dlatego, że będziesz mógł, w zależności
od tego co będzie dla ciebie wygodniejsze, różnie importować i różnie
eksportować, więc warto znać wszystkie te sposoby, więc przejdźmy sobie
od razu do kodu i zauważ co ja tutaj zrobiłem. Otóż w katalogu js mam
katalog config i katalog utils i tutaj sobie zrobiłem różne moduły.
W katalogu config mamy pewnego rodzaju stałe. Chciałbym mieć
w osobnym pliku, a w utils mamy metody takie dla stringu, jakieś pomocnicze,
to są zwykłe funkcje i w katalogu array jakieś funkcje do pracy
z tablicami i chciałbym móc sobie je eksportować i importować pracując
na pliku scripts. Podobnie jak w lekcji poprzedniej zrobiłem tak, że ten plik scripts
automatycznie mamy ładowane na stronie z typem module, czyli
przeglądarka, kiedy go będzie wczytywać, będzie potrafiła sobie znaleźć również pozostałe skrypty. No
więc teraz co będziemy chcieli zrobić. Chciałbym móc sobie skorzystać z metody
sort, która jest dostępna tutaj. Mamy taką metodę, jak
widzisz, w array, metoda sort. Chciałbym sobie
ją zaimportować, więc jeżeli nie zrobisz tutaj żadnego eksportu,
to nic nie można zaimportować. Dlatego zróbmy tak jak w wersji poprzedniej export
default sort i powiem ci dlaczego. Przejdziemy tutaj i będę
mógł napisać import sort from i podamy sobie
ścieżkę. Zauważ, że teraz będzie inne. Mamy scripts i tutaj jest utils, więc muszę
napisać utils i dopiero teraz array js, czyli z
tego pliku zaimportowałem sobie sort i spróbujemy sobie zrobić coś takiego console.log
sort array. Czy to będzie poprawne? Okazuje
się, że tak. Tablica została posortowana. Czemu natomiast pisałem
coś takiego jak export default. Jeżeli chcesz w dowolnym
innym module zaimportować sobie coś z tego modułu i wpisywać to w ten sposób sort
from, czyli takim zapisem, to musisz to wyeksportować jako domyślną
wartość pisząc właśnie default. Co ciekawe nie muszę tej nazwy mieć tutaj takiej samej,
a tutaj eksportuje funkcję, bo eksportuje po prostu nazwę. Natomiast tu mógłbym napisać
import s i tutaj skorzystaj z tej funkcji jako s, bo
zaimportowałem sobie tę jedną funkcję, nie ma problemu. Natomiast to właśnie o to tutaj chodzi, że
jeżeli tą nazwę chce nazwać sobie tak dowolnie i nie korzystać z innego zapisu, o
którym za moment, to wtedy musimy eksportować coś jako wartość domyślną,
w tym przypadku to tak wygląda i default'owy może być tylko jeden. Jeżeli
natomiast chciałbym sobie zaimportować jeszcze remove duplicates, to też muszę
go wyeksportować i teraz jak to zrobić. Eksportów może być wiele w takim module,
więc mogę napisać export remove duplicates, ale
jeżeli tak zrobię to nam to nie zadziała dlatego, że jeżeli eksportujesz coś i nie oznaczasz
tego jako default, czyli jeżeli tego słowa default nie ma, to musisz to zawrzeć
w takich oto nawiasach klamrowych. Nie musi tutaj być tych spacji. Może to
wyglądać tak. Ja preferuję w takim zapisie. Nie jest to obiekt, chociaż
wygląda jak obiekt, ale zapewniam cię, że to nie jest obiekt. Mógłbyś pomyśleć, że jest
to obiekt w takim skróconym zapisie skoro nie napisałem tutaj remove duplicates drugi
raz, to że jest to właśnie taki obiekt skrócony. Nie jest to obiekt, po prostu
tak to wygląda. Czyli jeżeli nie eksportujesz domyślnej wartości, to musisz
ją wyeksportować w taki oto sposób. Co ciekawe możemy od razu wyeksportować
sobie removeFalsyValues podając je po prostu po przecinku
albo osobny export albo możemy zrobić to w jednym takim jakby
obiekcie, chociaż nie jest to obiekt i teraz ten moduł właśnie eksportuje zarówno
sort jak i te dwie funkcje, czyli wszystko co w sobie zawiera i jeżeli
teraz przejdziemy do scripts i będę chciał sobie zaimportować którąś z
tych rzeczy, która jest eksportowana. Nie muszę wszystkich, to mogę napisać import
na przykład remove duplicates from i
tutaj znowu muszę podać ścieżkę, ona jest identyczna, więc ją podamy stąd. Natomiast, co jest
ciekawe, nie mogę tego napisać bez tych nawiasów, bo to nam wygeneruje błąd,
zobaczymy. Co prawda nie jest to błąd, ale pod remove
duplicates. No
nie mogę tego podejrzeć dlatego, że wspominałem ci że moduły są jakby zawarte same w sobie. Nie
jest tutaj globalne, ale powiem ci dlaczego nie ma błędu. Jeżeli tak zrobiliśmy, to
pod remove duplicates będę miał dokładnie to samo, co miałem pod sort.
No bo domyślną wartość sobie tutaj tylko pobrałem. Mówiłem ci wcześniej, że
zamiast sort mogę napisać s i daje mi to domyślną wartość, więc
jeżeli napiszę remove duplicates, to będzie dokładnie to samo co zostało wyeksportowane
w tym miejscu pod default, ale jeżeli oplotę sobie to takimi nawiasami, to
wtedy już zaimportuje sobie dokładnie to, co jest tutaj wyeksportowane, czyli
teraz pod remove duplicates będę miał to co mnie interesuje i będę chciał
wykonać sobie to na tej tablicy, czyli posortowaliśmy ją, to
zróbmy sobie jeszcze remove duplicates i przekażmy
też tam całą taką tablice i powinniśmy się pozbyć zduplikowanych liczb. Zobaczmy.
Wszystko działa jak należy. Czyli znowu podsumowując sobie ten nasz kolejny krok. Jeżeli
importujesz coś tutaj bez takich nawiasów, to znaczy, że importujesz wartość domyślną,
czyli moduł musi eksportować coś pod default. Natomiast
jeżeli chce wyeksportować więcej rzeczy, to może je wyeksportować w takich oto
nawiasach klamrowych, podając ich nazwy i wtedy przy imporcie musisz podać w
takie same nazwy i też zrobić to w takich nawiasach. Gdybyś chciał dodatkowo
zaimportować removeFalsyValues, to podasz to tutaj po prostu po przecinku i
wtedy dwie takie funkcje zostaną tutaj zaimportowane, czyli te nazwy,
to będą jakby lokalne tutaj zmienne, a tak naprawdę będą się zachowywać jak
stałe, z których możesz korzystać tak jak zobaczyłeś to tutaj. Teraz
wrócimy sobie raz jeszcze do tego array. Gdybyś nie chciał pisać export default sort. Możesz
w ogóle nie mieć domyślnego eksportu, to znaczy, że wtedy ten sort, żeby zaimportować,
to musielibyśmy po tej stronie napisać import i w takich nawiasach podać sort, ale
jeżeli chcesz mieć jakiś domyślny, a nie chcesz pisać tego dwa razy, to możesz tutaj zrobić
coś takiego, że napiszesz sort as default i podamy
przecinek. To sobie wykomentujemy i dokładnie tak samo to będzie działać, ale
będzie tylko jeden export. Jak widzisz nie ma żadnego błędu, wszystko działa tak jak należy. Kolejną
rzeczą, którą możemy zrobić jest inne nazywanie tych funkcji, czyli tutaj ona się nazywa
remove duplicates, ale jeżeli chcę ją wyeksportować pod inną nazwą, to
mogę napisać as na przykład rmDuplicates,
w ten sposób i kiedy ją będę importował tutaj, to muszę
ją zaimportować jako właśnie rm, czyli tak jak została wyeksportowana
i tutaj oczywiście musiałbym skorzystać z dokładnie takiej samej nazwy.
Zauważ, że cały czas wszystko jest okej. Nie ma żadnego błędu, czyli
przy eksporcie możesz podać inną nazwę, za pomocą takiego słowa kluczowego as. Co
ciekawe to działa też w drugą stronę, jeżeli tutaj eksportujemy removeFalsyValues
i chciałbym sobie zaimportować tutaj, ale pod inną nazwą, to mamy
removeFalsyValues, mogę napisać as rm falsy values, tutaj
zróbmy sobie rm, czyli ten moduł wyeksportował
to pod nazwą remove falsy values. Ja importując to musiałem znać tą nazwę,
ale mówię zaimportuj mi to, ale wewnątrz mojego modułu chcę żeby
to się znajdowało pod taką nazwą, czyli gdybym chciał skorzystać z funkcji remove falsy values
będzie błąd, ale rmFalsyValues już nie powinno żadnego
błędu generować. Gdybyśmy to jeszcze chcieli przez tę i tak już długą funkcję
przepuścić, nie powinniśmy mieć błędu, bo jak widzisz ta operacja również
się udała. Jeszcze jednym ciekawym zapisem może to sobie wykomentujemy
i to również, byłby taki zapis, że to skopiuję i wkleję poniżej,
że chciałbym sobie zaimportować wartość domyślną, to mógłbym
tutaj napisać import sort, ale tutaj wcześniej default
as sort, następnie rm duplicates
i remove falsy values as rm falsy values, czyli teraz
chcę zaimportować to, co tam było domyślne. Sprawdźmy co to było, sort był domyślny. Nazwę
sobie nazwałem sort, ale mogę nazwać inaczej, jeżeli bym chciał. Natomiast w ten sposób mogę
zaimportować też domyślne, czyli wcześniej bez tych nawiasów wyglądało to tak. Wtedy
pod tą nazwą będzie to co domyślnie było wyeksportowane. Natomiast można
w takich nawiasach napisać zaimportuj default'owy i nazwij go sort dla
całego tego modułu, ale jeszcze można to zrobić inaczej. Chcę ci jak najwięcej przykładów
pokazać. Możemy zrobić to przed całym
tym zapisem, czyli tak jak u góry mieliśmy samo sort from, to możemy napisać sort
i przecinek i podać coś takiego. To oznacza, że ten który
nie jest w tych nawiasach, to będzie domyślny, a pozostałe chcemy już pobrać
z tego eksportu, które były tutaj wyeksportowane, czyli
przy domyślnym nie musi być tych nawiasów. Jeżeli są, to wtedy musimy napisać default as sort. Sprawdzimy. Znowu
nie ma błędu, znowu wszystko działa jak należy. Teraz pokażę ci jeszcze jedną ciekawą rzecz,
bo cały czas importujemy sobie tylko te metody z array js, ale
zauważ, że mamy tutaj również string i nic stąd jeszcze nie wyeksportowaliśmy. Więc
tutaj pokażę ci inny sposób eksportu. Co prawda moglibyśmy na samym dole napisać export. Nie
robić domyślnego, tutaj wyeksportowalibyśmy wszystko, toUpper. Po
prostu wypisać wszystkie te funkcje po przecinku byłoby okej, ale okazuje się, że można
od razu eksportować wartości, które są nazwane. Czyli jeżeli jest to zmienna
lub na przykład funkcja, mogę przy niej od razu napisać export. Jeżeli ktoś
nie chce eksportować, ma być widoczna tylko tutaj, to nie muszę tego pisać, ale
jeżeli zrobimy to w ten sposób, to też wyeksportujemy wszystkie te funkcje i
import będzie wyglądał dokładnie tak samo jak pokazałem ci wcześniej. Natomiast
ich nazwy będą dokładnie takie jak są w tym miejscu, tylko nie będę sobie tego importowal tutaj,
chociaż mógłbym. Pokażę ci, że możemy w array wyeksportować
jeszcze wszystko co zaimportujemy ze string. Bo chcę ci jak
najwięcej tych przykładów pokazać, jeżeli to idzie za szybko to na spokojnie sobie drugi
raz tą lekcję obejrzyj i to przerób, więc możemy tutaj zrobić export star,
czyli gwiazdka, wszystko from i tutaj możemy
podać. Jesteśmy na tym samym etapie, czyli
względem array js mamy string js. Mógłbym tutaj
oczywiście sobie zaimportować pewne rzeczy i później je wyeksportować z tego stringu, ale
możemy również napisać wyeksportuj wszystko ze string js, tylko
żeby to mogło działać, tam nie może być domyślnego, bo domyślny jest już tutaj. Zobaczmy. Jak
widzisz żaden nie ma default, czyli nie jest domyślny, więc nie ma żadnego problemu. Natomiast gdyby
był domyślny, to nie moglibyśmy z kolei tutaj mieć domyślnego, ale jeżeli
chcesz jakieś moduł tutaj załadować i wszystko wyeksportować, można to zrobić w ten sposób i
okazuje się, że teraz kiedy zaimportujemy array, to będą w nim też wszystkie
metody, które są tutaj, więc spróbujmy na przykład metodę trim, sobie w
tym miejscu pobrać właśnie z array js. Napiszę
zatem tutaj trim i zrobimy sobie może
po prostu console.log trim Piotr. Powinno to
działać, także usunie białe znaki, które tutaj się znajdują na początku. Sprawdźmy. Nie
ma żadnego błędu. To również nam poprawnie zadziałało. Okej w takim razie
jeszcze pokażę ci jedną rzecz. Przejdziemy sobie do config, tutaj do constants
i mamy tutaj kilka różnych zmiennych i znowu możemy je wyeksportować
na wiele sposobów, na przykład pisząc przed nimi od razu export i też
wszystkie z nich zostaną wyeksportowane, ale możemy to cofnąć i
możemy sobie je wyeksportować pisząc export i podając tutaj
je po kolei, na przykład URL, min length i max length. Do
czegokolwiek one mogłyby nam służyć. Możemy w ten sposób sobie je z tego pliku wyeksportować
i co ciekawe możesz eksportować wszystko, co ma jakąś nazwę, czyli const
ma nazwę, na przykład tutaj. Tak samo funkcje mogliśmy eksportować,
bo mają nazwę. Możesz wyeksportować coś co jest zapisane w let, czyli mógłbyś
napisać export let variable równa
się zero, też będzie okej. Natomiast jeżeli chciałbyś wyeksportować coś
co nie ma nazwy czyli na przykład export function, w ten sposób. To to zadziała
wyłącznie wtedy, jeżeli to będzie default'owy export. Czyli jeżeli napiszesz
export default i taka funkcja, to będzie okej, bo wiesz już jak można te
default'owe importować po drugiej stronie. Okej, chciałbym zatem
tutaj sobie wszystko wyeksportować z constants i pokazać ci ostatni zapis,
który pozwala nam na import, czyli tutaj robiliśmy import w taki sposób,
zaimportujemy sobie natomiast wszystko. Możemy napisać import
gwiazdka. To znaczy wszystko as, musimy napisać
jak to się ma nazywać, na przykład config from i względem
naszego skryptu, w którym jesteśmy to mamy katalog config i tam
jak widzisz jest constants js. Jeżeli
sobie zaimportujesz gwiazdkę i nazwiesz to jak config, to tutaj pod config
będziesz miał obiekt, w którym będą wszystkie wyeksportowane rzeczy, więc
zobaczmy sobie w konsoli, co się nam tak naprawdę znajdzie w tym config'u. Zobacz,
będzie to taki oto obiekt, który będzie miał wszystkie wyeksportowane
rzeczy pod swoimi kluczami, czyli gdybyśmy w ten sam sposób chcieli zaimportować
sobie coś z array to też moglibyśmy napisać import star
as na przykład array methods from i tutaj array i
mielibyśmy taki oto obiekt, czyli tutaj w tym config'u mogę się teraz odwołać na przykład
to url i będę miał taki oto adres. Pokazałem
ci zatem chyba wszystkie możliwości importu i eksportu. O jednej
jeszcze będzie w lekcji kolejnej i jak widzisz tak to wygląda. Polecam ci żebyś sobie z tym poeksperymentował. Natomiast
często możemy robić tak, że tworzymy sobie jakieś funkcję od razu i eksportując lub
później na przykład na samym dole eksportując zmieniając im na przykład nazwy na inne. Podobnie
przy imporcie, możemy coś zaimportować, jeżeli chcemy, ale wcale nie musimy. Importując
to możemy z kolei zmienić nazwę, na przykład, tak jak zrobiłem to w tym miejscu. Dodatkowo
widzisz, że możemy wszystko zaimportować z jakiegoś modułu i zapisać
sobie to pod taką stałą. Mówię, że to jest stała, bo gdybyś spróbował napisać tutaj
config równa się i to nadpisać, to zobaczysz błąd, ale o tym powiemy sobie jeszcze później.