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.
na zakończenie pracy z naszą biblioteką pokażę ci jak przetranspilować jej kod
do es5 i skorzystać z tak zwanych universal module definition czyli
umd zobaczysz o co w tym chodzi natomiast ten przykład troszeczkę sobie zmodyfikowałem
nasza biblioteka jest w stanie niezmienionym od poprzedniej lekcji natomiast strukturę
katalogów trochę zmieniłem mamy tutaj w start js nasz test na
podstawie którego sprawdzimy później czy nasza biblioteka działa poprawa natomiast mam
osobny katalog equery w którym do katalogu src wstawiłem całą naszą bibliotekę
dodatkowo mamy tutaj plik package json w którym są zależności które już
widziałeś kilka lekcji temu kiedy transpilowaliśmy kod do es5 i dodatkowo
mamy jeszcze plik webpack config bo z niego będziemy korzystać tutaj nic na razie nie
zmieniałem oprócz ścieżki dlatego że ten przykład jest ustawiony tak gdybyśmy podejrzeli
źródło strony że nie korzystamy już z tych modułów es6 w przeglądarce czyli
script o typie module module tylko tutaj ładuje normalne skrypty
chciałbym najpierw załadować skrypt equery js który na razie nie istnieje to
będzie ta przetranspilowana wersja i później nasz skrypt test js czyli
żebyśmy w teście mogli korzystać z equery teraz gdybym zajrzał do konsoli to będzie
błąd że equery jest niezdefiniowane bo tamten skrypt nie istnieje co widać tutaj przez
404 okej zatem skoro wiemy że ten equery który
przed momentem w źródle strony ci pokazałem ma być w katalogu js tutaj to
w webpacku musiałem sobie zmienić ścieżkę skoro plik webpack config jest tutaj to
chcę się odwołać 1 katalog wyżej i następnie javascript więc zrobię to w
ten sposób tutaj 1 katalog wyżej JavaScript tutaj proszę mi utworzyć plik
on name a tym name będzie to co jest podane w tym miejscu czyli equery z pliku
main js relatywnie do tego webpack config
czyli tutaj wejdziemy sobie do src i tutaj jest main od tego będzie webpack zaczynał
budowanie całego drzewa zależności okej czyli w tym pliku mamy
na razie tyle no i będziemy mogli sobie to teraz przetranspilować zobaczmy
zatem czy nam to wszystko by zadziałało przejdziemy do terminala i ważne żebyś
był w tym katalogu 76 i na początek mamy tutaj plik w
equery jeszcze przejdziemy ls mamy
tutaj plik package json więc tutaj napiszemy npm install żeby zainstalować wszystkie
zależności z tego pliku i spróbujemy sobie wykonać bundle od
razu ci pokażę że w tym pliku package json mamy utworzony skrypt bundle
dlatego będziemy mogli wpisać npm run bundle i wykona się webpack poczekajmy
aż to wszystko się zainstaluje i zaraz przetestujemy okej udało się wpiszmy
npm run bundle i zobaczmy taki
bundle powinien się wykonać tak też się stało i w katalogu js tutaj pojawiło
się equery zobaczmy tutaj jest cały przetranspilowany kod i na
przykład weak maps z której korzystaliśmy nie powinna tutaj nigdzie być bezpośrednio jak
widzimy jest okej dzięki temu że nie korzystałam z metod na prototypie na przykład starts
with dla stringu pamiętasz jak ci to pokazywałem tylko skorzystałem z char at
to tutaj nie mamy żadnego problemu bo wszystko będzie działać poprawnie te
rzeczy które były globalne tak jak set weak set one są zamienione tutaj przez
ten runtime poprawnie jeżeli tego nie pamiętasz to wróć sobie do lekcji gdzie pokazywałem
w jaki sposób transpilujemy kod do es5 tam gdzie korzystaliśmy z
babel polyfill i właśnie tego pluginu który nazywa się transform runtime natomiast
teraz pytanie czy nasza biblioteka zadziała odświeżmy sobie tutaj wyślijmy
zapytanie i okazuje się że wszystko działa poprawnie czyli nasza biblioteka działa teraz
już jak należy natomiast chciałbym teraz sprawić żeby ona mogła współpracować
z modułami umd jeżeli byś zajrzał sobie do kodu źródłowego jquery
możemy teraz przejść na stronę jquery com i tutaj byśmy wybrali uncompressed
version chcielibyśmy do niej zajrzeć to jeśli ją otworzę w edytorze to zauważ
że tutaj u góry jest coś takiego jak global czy factory i tutaj takie dziwne zapisy
na przykład czy type of module to jest object czy zawiera w sobie exports
i tak dalej jest tutaj kilka takich różnych zapisów i one dzięki temu
sprawiają że można jquery odpowiednio inkludować czyli pokazywałem ci
kilka lekcji temu że w webpacku na przykład mogliśmy sobie zrobić import jquery
i wszystko działało poprawnie z tego powodu że jquery tutaj korzysta właśnie
z definicji modułów i ja chciałbym teraz skorzystać z takiej uniwersalnej definicji modułów
dla naszej biblioteki która nazywa się umd i sprawi że nasza biblioteka
będzie działać poprawnie w przeglądarce ale gdyby ktoś chciał ja sobie pobrać i
zaimportować kiedy pracowałby na przykład z webpackiem to również mógłby
to zrobić czyli w dowolnym swoim pliku mógłby sobie napisać tak jak my to robiliśmy
import na przykład import i powiedzmy że chciałby to nazwać dolarem
from equery wtedy by zrobił i pod dolarem miałby całą naszą
bibliotekę więc możemy to zrobić dlaczego teraz nasza biblioteka działa poprawnie
w przeglądarce pomimo tego że jest zawarta w modułach co tutaj widać właśnie
z tego powodu że w pewnym momencie do window przypisywaliśmy equery pamiętasz
jest to w tym miejscu nie chcemy tego robić zrobiliśmy to wcześniej tylko żeby nam się z
tym dobrze pracowało w przeglądarce w przypadku modułu natomiast chcemy się teraz tego
pozbyć i przejdźmy sobie do katalogu src do main i tutaj gdzie
to przypisaliśmy chciałbym to wyrzucić a stąd chciałbym eksportować sobie
po prostu defaultowo tę funkcję init czyli chciałbym napisać export
default init czyli jeżeli ktoś zaimportuje naszą bibliotekę tak jak przed momentem pokazałem
na przykład z tym dolarem to chciałbym żeby domyślnie była to
funkcja init wtedy będzie to działać oczywiście poprawnie na to samo kierowaliśmy poprzez
window kropka equery natomiast teraz jeżeli byśmy wykonali sobie bundle zróbmy
sobie npm run bundle to nasza biblioteka zobaczysz za moment
że przestanie działać odświeżmy ją sobie tutaj i jak widzisz equery
teraz nie jest zdefiniowane czyli teraz to nie działa dlatego musimy dodać sobie jeszcze definicję
modułów umd i wtedy wszystko będzie okej ciekawe jest to że
w przypadku webpacka jest to dosyć proste wystarczy że przejdziemy do
webpack config i tutaj musimy dodać sobie kilka rzeczy dokładnie będzie
to tutaj gdzie mamy output będę chciał dopisać coś takiego jak library i
napiszemy equery to będzie nazwa naszej biblioteki następnie
library target i to jest ważne że w dokumentacji webpacka znalazłbyś
że tutaj może być na przykład amd albo common js common js to są takie
moduły które można za pomocą require tak jak to robimy w node js inkludować
a ja chcę zrobić to w standardzie umd który łączy wszystkie te trzy standardy
czyli środowiska które wspierają require js lub na przykład amd
będą mogły naszą biblioteka sobie podłączyć a jeżeli wstawimy ją bezpośrednio do
przeglądarki to też wszystko będzie działać poprawnie i teraz na końcu
jeszcze można dodać coś takiego jak when the name defined tutaj
powinno być jeszcze then name defined damy true to za moment zobaczysz dokładnie
co się stanie to sprawi że ten moduł będzie po prostu nazwany spróbujemy sobie
teraz wykonać build run bundle zobaczymy
wszystko się udało w przeglądarce niestety to nie działa ale zaraz ci powiem jak ten problem
rozwiązać natomiast jeżeli teraz przejdziemy tutaj zauważ że na początku
naszej biblioteki jest takie oto sprawdzenie czyli jeżeli exports to jest object
i zawiera w sobie module to wtedy robimy module exports czyli
tak jak zrobiliśmy tutaj module exports w webpacku jest plik node js a node js
korzysta właśnie z common js czyli require i module exports więc
tutaj jest jedno takie sprawdzenie czyli jeżeli ktoś by zaimportował naszą bibliotekę w node to
działałaby ona poprawnie natomiast następne sprawdzenie jest takie czy mamy
do czynienia z modułami amd i to co podaliśmy tutaj
czyli umd named defined true sprawia że w tym miejscu
ten moduł jest nazwany normalnie byłby tutaj pusty ciąg albo w ogóle by tego
nie było natomiast nie ma to większego znaczenia ale jeżeli znowu jakieś środowisko
korzysta z modułów amd to dokładnie ta sama biblioteka zadziała jak
widzisz poniżej mamy jeszcze jedno sprawdzenie dla środowiska które korzysta z exports ale to
co nas interesuje jest troszeczkę niżej jeżeli nasza biblioteka zostanie załadowana w przeglądarce
to wtedy wykona się ta linijka kodu mógłbyś to sprawdzić wpisując sobie
tutaj jakiś console log ale wtedy ten else musielibyśmy opleść w odpowiedni sposób
na te dwie linijki nie będę tego robił ale warto wiedzieć że tak to wygląda i tutaj root co
może być pod root otóż właśnie na samym dole tej funkcji tutaj będą pewne rzeczy przekazywane
gdzie ona jest wywoływana właśnie tutaj są te parametry no i na tej
podstawie wiadomo w jakim jesteśmy środowisku tak zatem działają moduły umd
tylko teraz ciekawe jest to że w przeglądarce nam to nie chce działać z jakiegoś powodu zauważ
że tutaj do root equery i to jest super ważne że pisaliśmy tą nazwę
tutaj dzięki temu do root czyli tak naprawdę do window jest
dodawany equery na funkcje factory czyli to sprawia że faktycznie nie
przypisujemy już window equery równa się ale jest tutaj dostępny equery tylko
że jest to obiekt w którym dopiero mamy default i jest to nasza init
czyli teraz w całej naszej bibliotece musielibyśmy pisać equery default
i dopiero wtedy moglibyśmy na przykład wyszukać elementów li zauważ że
wtedy by nam to zadziałało natomiast żeby się tego pozbyć a jest to problem z babel
babel w ten sposób to generuje do tych modułów to możemy dodać sobie jeszcze jeden plugin
który nazywa się babel plugin add module exports i będę chciał go teraz
zainstalować więc tutaj wpiszemy npm install save dev babel
plugin add module exports zainstalujmy
go sobie i za moment będziemy mogli z niego skorzystać wystarczy
tylko tyle że w pliku webpack tutaj idziemy pluginy dla babel pierwszy był
to transform runtime podamy sobie ten drugi czyli add module exports
okej i teraz spróbuję wykonać sobie znowu webpacka
npm run bundle poczekajmy
chwilę udało się to wygenerować i teraz jeżeli sobie zajrzymy tutaj do equery
to już to tutaj wygląda troszeczkę inaczej chociaż w zasadzie może ten zapis
jest taki sam ale gwarantuje ci że działa inaczej i możemy to po prostu potwierdzić wyślij
zapytanie powinno nam to zadziałać no i jak widzisz wszystko wczytało się poprawnie
i teraz poprawnie to działa gwarantuję ci że teraz moglibyśmy naszą bibliotekę equery
udostępnić komuś i on mógłby sobie pracując na przykład z webpackiem zrobić
import i bez problemu ta biblioteka u niego by działała czyli w dowolnym pliku
mógłby sobie właśnie napisać import na przykład equery albo jakąś inną nazwę
from equery i mógłby dzięki temu pracować lokalnie
tylko w takim module więc jak widzisz działa to w tym momencie poprawnie
natomiast dodamy sobie jeszcze jedną rzecz otóż ten plik nie jest minifikowany ale
gdybyśmy do webpack config czy w zasadzie do package json tutaj przy webpack dodali
sobie flagę p production to wtedy będzie to wszystko zminifikowane
więc spróbujemy sobie raz jeszcze wywołać tutaj w tym
miejscu npm run build i zobaczymy jak
to będzie teraz wyglądać może nie build tylko w naszym przypadku było to bundle okej webpack minus p jak
widzimy pojawiło się takie polecenie powinno to zostać fajnie wygenerowane sprawdźmy i
teraz jeśli przejdziemy do equery mamy zminifikowaną gotową bibliotekę którą
możemy też przetestować na naszej stronie czy wszystko działa poprawnie wyślij zapytanie
jak widzisz tak a zobaczmy czy na pewno podłączona jest zminifikowana
wersja okazuje się że tak i teraz na koniec już pracy z tą biblioteką chcę
ci jeszcze tylko pokazać że ona poprawnie zadziała w internet explorerze w wersji
11 które w ogóle nie wspiera es6 więc przejdziemy sobie teraz na wirtualną
maszynę windowsa i to przetestujemy okej jesteśmy w systemie windows
przeglądarce internet explorer 11 i tutaj możemy sobie spróbować wysłać zapytanie
natomiast na pierwszy rzut oka widzę w konsoli że mam błąd składni i on wynika
jedynie z tego że my nie transpilowaliśmy w żaden sposób naszego testu czyli w tym
teście skorzystaliśmy tutaj jak widzisz zapisu arrow function więc nam to nie
działa ten test jest wyłącznie właśnie w celach testowych więc po prostu zamienimy
to na poprawny zapis czy na normalne funkcje niech tutaj będzie data
i w ten sposób nie będzie błędu
będziemy mogli się przekonać czy nasza biblioteka sama w sobie działa poprawnie tutaj
zróbmy function error też niech to będzie normalna funkcja
w ten sposób przynajmniej to nam udowadnia
że internet explorer rzeczywiście nie wspiera zapisu es6 zapiszę
to i wrócimy tutaj odświeżę nie mamy już tego błędu który
był i spróbuj mi wysłać zapytanie to będzie chwila prawdy dla naszej biblioteki jak
widzisz działa a więc zpolifillowaliśmy nawet promisy i wszystkie inne rzeczy które
robiliśmy dzięki temu nasza biblioteka nie tylko może być inkludowania
w różnych środowiskach przez ten zapis modułu w umd ale dodatkowo jak
widzisz działa w przeglądarkach które zupełnie nie wspierają ecmascript 6 a my
możemy nad nią pracować bardzo wygodny sposób jeżeli zatem
chodzi o nasz projekt to już wszystko ja gorąco zachęcam cię do tego żebyś spróbował do
niego dodać pewne funkcjonalności zauważ że nasza biblioteka nie jest kompletna na
przykład nie dodaliśmy niczego co pozwalało by nam wstawiać elementy na stronę
dlatego mógłbyś teraz spokojnie w library tutaj gdzie mamy content dodać
sobie coś takiego albo nowy plik na przykład nazwać go insert czy
insertion i później tak samo jak już do tej pory ci pokazywałem ładowałbyś
sobie tutaj i rozszerzał byś tę mixinę dzięki czemu dodawał byś do prototypu
kolejne metody więc bardzo serdecznie zachęcam cię do tego abyś po eksperymentował
spróbował sobie dodać trochę metod bo po pierwsze poćwiczysz pracę z ecmascript
6 czy z webpackiem a po drugie możesz poćwiczyć swoją wiedzę
z zakresu dom api czyli tego w jaki sposób pracować z tymi
api dostępnymi w przeglądarce jak wstawiać elementy na stronę jak je usuwać i tak
dalej mam jednak nadzieję że ten projekt pokazał ci jak można zacząć tworzyć
taką bibliotekę i jak wygodnie pracuje się w es6 nie
mieliśmy tego wcześniej w ecmascript 5 dlatego musieliśmy korzystać z różnych
narzędzi które w jakiś sposób te moduły pozwalały nam tworzyć jak widzisz teraz w
es6 jest to dostępne jak to się mówi out of the box czyli
bez żadnych innych narzędzi aczkolwiek tutaj korzystamy z webpacka po to żeby to
wszystko ładnie zbundlować a także przetranspilować natomiast pamiętaj że
w dowolnym momencie jeżeli chciałbyś tę bibliotekę utworzyć również do jednego pliku bo
chciałbyś ją komuś udostępnić ale nie musi ona wspierać starszych przeglądarek to
wtedy wystarczy w tym webpacku cały ten module, który tutaj zrobiliśmy że
po prostu go wyłączysz i jeżeli go włączysz to nie będziemy
transpilować kodu do kodu es5 natomiast samą bibliotekę
również utworzymy bo webpack zajmie się łączeniem wszystkich tych importów jeżeli
jednak nie wszystko dobrze zrozumiałeś to polecam ci krok po kroku ten kod przepisać razem
ze mną w lekcjach tak jak to pokazywałem jestem przekonany że jesteś w stanie wszystko zrozumieć
gdybyś nie rozumiał jakieś konkretnej konstrukcji to po co są lekcje właśnie wcześniej żebyś
mógł do niej wrócić na przykład destructuring promise czy arrow function a ten
projekt pokazał jak większość tych elementów połączyć w jedną całość