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.
pod koniec poprzedniej lekcji zobaczyłeś że o ile kod es6 był transpilowany
do es5 przez babel o tyle mamy problem bo nie są transpilowane
wbudowane typy czyli cały zapis a więc syntax był zamieniony ale
kiedy utworzyłem sobie new set to nie zostało to poprawnie zamienione na żadną
inną konstrukcję czyli w przeglądarce która nie wspiera es6 po prostu by to
nie działało tak to wyglądało w kodzie na końcu sobie zrobiłem po prostu new set i const
zostało zamienione na var ale samo new set już nie w tej lekcji
pokażę ci jak ten problem rozwiązać na dwa sposoby pierwszym z nich będzie babel polyfill
który można znaleźć pod takim adresem musimy sobie zainstalować
tak jak tutaj widzimy babel polyfill dlatego przejdę do terminala i tutaj
jestem już z katalogu start właśnie w przykładzie 67 i
mamy tutaj plik package json od razu sobie może sprawdźmy co tam było
wersji poprzedniej jak widzisz takie zależności i najpierw je sobie zainstalujmy
bo nie ma tutaj katalogu node modules który usunąłem a więc npm install
kiedy to się zainstaluje to zainstalujemy sobie również babel polyfill
i pokażę ci jak z tym pracować z użyciem webpacka okej
mamy wszystko i teraz npm install save bo jest to zależność
w tym momencie nie dewelopmencka ale taka normalna którą do strony będziemy
dodawać zaraz zobaczysz babel polyfill kiedy
nam się to pobierze okej to możemy sobie przejść tutaj zobaczymy że
mamy babel polyfill i przejdziemy sobie do pliku z webpackiem i powiem
ci co musimy zmienić podawaliśmy webpackowi jako entry tutaj że chcemy aby zaczynał
kompilowanie od pliku scripts js natomiast teraz będziemy mieli kilka
entrypointów i żeby ci uświadomić dlaczego to przejdźmy sobie najpierw
do pliku index tutaj w tym pliku linkowaliśmy sobie dist bundle
natomiast będziemy musieli podlinkować sobie jeszcze polyfille które chcemy żeby
zostały wygenerowane dlatego tutaj sobie plik nazwę polyfills i musimy
go też wygenerować do katalogu dist dlatego wróćmy do package json
czy w zasadzie tutaj do webpack config i entry zamienimy na klucz w
ten sposób i dzięki temu możemy podać tak zwane multiple entry point
podajemy tutaj jako klucz nazwę czyli chciałbym żeby to się nazywało
na przykład app i dodatkowo tutaj podamy sobie polyfills i zamiast
podawać ścieżki skoro zainstalowaliśmy babel polyfill do katalogu node modules to
po prostu wtedy dodajemy tutaj babel polyfill i webpack
wie że musi to znaleźć w node modules że to zostało pobrane bo nie podałem tutaj żadnej
relatywnej czy absolutnej ścieżki tylko że teraz będzie kolejny problem bo
powiedzieliśmy że bundle ma się nazywać bundle js a teraz będą tworzone dwa
niezależne piki więc tutaj tę nazwę chciałbym móc zdynamizować
i można tutaj wstawić placeholder jak name dzięki czemu będziemy
tworzyć pliki które będą miały tutaj podstawione polyfill lub app
które widzisz w tym miejscu okej i spróbujemy tak zrobić nic więcej nie musimy tutaj
robić przypominam ci że w pliku package json mamy skrypt bundle
który uruchomił webpacka więc wpiszmy npm run bundle no
i zobaczymy co zostanie dla nas wygenerowane czekamy sobie chwilkę jak
widać się udało i teraz przejdziemy sobie do dist i jak widzisz mamy tutaj app nasza
aplikacja oraz polyfill tutaj będą wszystkie polyfille i
zostało to podłączone do indeksu więc uruchommy sobie ten przykład z użyciem
też przypomnę http server które mamy tutaj więc
piszemy sobie npm run server i taki serwer
się uruchomi skopiuję sobie jego adres i sprawdźmy tutaj jak
to wygląda w konsoli widzimy
że tutaj jakiś błąd się pojawił widzimy że mamy źle podlinkowane jakieś
pliki więc zobaczmy okej tutaj od razu widzę że powoli polyfill powinienem
nazwać z ską na końcu okej więc możemy
sobie to zmienić tutaj będzie to polyfills i jeszcze zrobiłem
jeden błąd dlatego że musimy w tym pliku index bundle zamienić
na app bo przecież zmieniłem tego nazwę więc raz jeszcze przejdziemy do terminala
control c zatrzymam serwer i zrobimy npm run bundle poczekamy
chwilkę i uruchomimy sobie serwer od nowa okej czyli npm run server
i teraz odświeżmy widzimy że aplikacja działa poprawnie i
zobaczmy co w tym bundlu się pojawiło w miejscu gdzie mieliśmy
użycie tego set tutaj musimy sobie jeden z tych plików usunąć
okej i przejdźmy sobie do app i mieliśmy
coś takiego jak new set zauważ że to zostało to dokładnie taki sam sposób ale
dzięki temu że do strony dołączamy tutaj bibliotekę polyfills to taki set będzie
dostępny i teraz spróbujemy sobie w przeglądarce Internet Explorer 11
która nie wspiera es6 uruchomić kod pod jakim adresem a
dokładnie ten adres mamy pokazany tutaj czyli tutaj mam adres w lokalnej
sieci dlatego teraz na wirtualnej maszynie windowsa w tym miejscu sróbuję
sobie tą stronę odświeżyć zobaczmy udało się odczytać i przejdźemy
sobie do sprawdź element żeby zobaczyć konsole przejdę
do konsoli i odświeżę
raz jeszcze zobaczmy czy cały nasz kod działa jak widzimy działa czyli
aplikacja napisana w es6 działa tutaj poprawnie nie ma żadnego błędu i
nawet set będzie dostępny gdybym tutaj wpisał set żeby sprawdzić co to jest
zobaczmy okaże się że jest jakaś
funkcja chociaż tutaj pokazuje native code to nie jest to kod natywny zapewniam
cię że normalnie set nie byłoby tutaj następne mamy pewny pewien problem
jednak i teraz chciałbym ci go pokazać gdybyśmy sobie przeszli do scripts
i tutaj gdzie robiliśmy employee say hello chciałbym napisać repeat
czyli skorzystać z metody na stringach w es6 i napisałbym
że chciałbym to powtórzyć 3 razy to przejdźmy sobie teraz tutaj i może
otworzę nową kartę tak żeby nie zatrzymywać serwera i wpisz npm run bundle
chciałbym od nowa wygenerować nasz bundle i pokazać ci jedną
rzecz mianowicie coś się znajdzie teraz w dist w app zobaczymy
repeat też jest tutaj dostępne czyli też to nie zostało zamienione w żaden
sposób a normalnie repeat nie jest dostępne tutaj zanim odświeżę
internet które że to spróbujmy napisać string prototype repeat
i zobaczmy okej funkcja się zwróciła
ale to dlatego że te polyfille były tutaj już przed momentem chodzi mi o to że jeżeli
wykomentujemy sobie polyfilld i odświeżymy tutaj po pierwsze mamy
błąd tutaj jak widzisz bo niema metody repeat czyli
nawet nie muszę ci pokazywać że nasz string to tutaj repeat jej nie ma czyli innymi słowy kiedy
ładujemy te polyfille to do globalnych konstruktorów takich jak na przykład string dodawane
są wszystkie potrzebne metody czyli teraz jeżeli odświeże to w konsoli
zobaczymy powtórzone kilka razy nazywam się Jan Kowalski i tak dalej więc
wydaje się że wszystko jest okej bo ta przeglądarka nie wspiera es6 a mogliśmy sobie
to zasymulować natomiast problem jest taki że jeżeli tworzylibyśmy jakąś bibliotekę gdzie
nasz kod komuś udostępnimy to my wrzucamy mu do globalnego zakresu wszystkie
polyfille czyli po pierwsze dodaliśmy coś takiego jak na przykład set po drugie dodaliśmy
na przykład do prototypu stringu metodę repeat i jeszcze bardzo bardzo wiele
innych metod razem z tym plikiem polyfills js jeżeli tworzymy aplikację
nad którą mamy kontrolę w całości nie jest to żadnym problemem natomiast jeżeli będziemy
tworzyć bibliotekę co będziemy robić jeszcze w tym kursie to jeżeli ktoś załaduje naszą
bibliotekę to nie powinien razem z nią jakby zaśmiecać sobie tego
globalnego zakresu i dodawać tam nowych rzeczy dlatego możemy ten problem
po części obejść nie korzystając z polyfills więc wykomentuje sobie
tę linijkę przejdziemy sobie tutaj wykomentuje również tę czyli
nie chcemy tworzyć takiego pliku i będziemy chcieli skorzystać z czegoś co nazywa się
transform runtime więc teraz gdybyśmy na tej stronie zobaczyli znajdź
o tym informacje niżej zobaczmy dokładnie tutaj
jest napisane że gdybyśmy nie chcieli modyfikować globalnych zmiennych
globalnych obiektów to powinniśmy skorzystać z transform runtime więc tutaj
sobie można kliknąć i zobaczyć i będziemy chcieli teraz tym rantem sobie zainstalować
a wygląda to tak jak tutaj widzisz skopiuję to przejdę
do terminala i tutaj napiszemy npm install save i
właśnie babel plugin transform runtime kiedy on się zainstaluje to
będę chciał go dodać po prostu do pluginów a jest to bardzo proste przejdziemy sobie w
to miejsce gdzie mieliśmy presets pliku webpack config js i dodamy
sobie coś takiego jak plugins i też jako tablice podamy transform runtime
okej zapiszmy to sobie i teraz
jeszcze raz będę chciał tutaj uruchomić npm run bundle poczekamy
sobie chwilę wszystko się wygenerowało i przy okazji pokażę ci jedną ważną
rzecz jeżeli teraz przejdziemy do dist app tutaj gdzie mieliśmy new
set zauważ że już tego nie znajduje więc napiszmy
sobie samo var set żeby to znaleźć gdzieś
była ta nasza zmienna okej tutaj ich
jest tak dużo że będzie trudno znaleźć więc po prostu przejdźmy sobie na sam dół i gdzieś
to powinniśmy zobaczyć tutaj gdzie ten set tworzyłem powinienem
go gdzieś znaleźć nie jest to teraz takie proste więc
może wyszukajmy sobie metody repeat okej i widzimy że jest to w tym miejscu tak
mi się to udało znaleźć i sam set został teraz zamieniony na coś takiego no
to oznacza że nie będziemy już zaśmiecać globalnego zakresu i dodawać tam na przykład set
więc sprawdźmy teraz jakby to działało tutaj w Internet Exploerze okaże
się że teoretycznie działa ale znowu nie mamy metody repeat i teraz
wygląda to w ten sposób że mamy coś za coś albo dodajemy polyfill i zaśmiecamy
globalny zakres ale też rozszerzamy prototypy albo możemy zrobić
transform runtime wszystko to jest tutaj zamienione ale oprócz metod na prototypach
dlatego że to nie jest takie proste aby to zmienić i nie jest to realizowane
czyli metoda repeat tutaj została nietknięta i dlatego jeżeli chcemy korzystać
z transform runtime to nie możemy korzystać z tych nowych metod na prototypach
tylko musimy to zrobić inny sposób a więc musimy już wcześniej o tym pomyśleć i
teraz jak można byłoby to zrobić w inny sposób przejdźmy sobie scripts
i tutaj gdzie skorzystałem z repeat musimy sobie zaimportować odpowiedni
moduł i skorzystać z repeat inaczej czyli wtedy wykluczam to trochę
korzystanie z tych natywnych modułów w przeglądarce muszę od razu wiedzieć
że będę to wszystko teraz transpilował natomiast do tej pory działało nam to w przeglądarce a później
mogłem też to przetranspilować więc to repeat muszę usunąć i tutaj na górze
musimy sobie coś zainkludować dokładnie będzie to taki oto import
który wykona sobie oczywiście webpack napiszemy core from i tutaj
napiszemy core js jest to biblioteka która się załadowała
do node modules razem z babel z babel core i napiszmy
sobie tutaj library i dzięki temu będę
mógł na core korzystać z różnych metod i tutaj będę miał na przykład core string
repeat i w ten sposób mogę z tego skorzystać okej
zróbmy sobie raz jeszcze npm run bundle wszystko
się powinno wygenerować poprawnie i teraz jeżeli przejdziemy do Internet Explorera i odświeżę
poczekajmy sobie chwilę teoretycznie
wszystko powinno zadziałać z jakiegoś powodu widzimy że nie działa
okej dlatego że jeszcze tutaj kiedy podałem string do repeat który chce powtórzyć powinienem
powiedzieć ile razy chciałbym go powtórzyć więc raz jeszcze zróbmy sobie tutaj bundle i
raz jeszcze odświeżmy i teraz powinno nam to wszystko już działać zobaczmy
okej i widać teraz w konsoli że wszystko jest okej i gdybyśmy
sobie sprawdzili string prototype i tutaj
napisali repeat i widzimy że mamy tutaj wartość undefined
w ten właśnie sposób możemy pracować z polyfillami czyli jak widzisz możemy
bez problemu sobie wszystko spolyfillować jeżeli wiemy że nasza aplikacja będzie w całości
przez nas zarządzana i możemy sobie dodać te rzeczy do globalnego zakresu natomiast w
przeciwnym wypadku lepiej skorzystać z transform runtime ale wtedy warto wiedzieć
że metody na prototypach nie tylko stringu ale także na przykład tablic nie będą nam
działać poprawnie i musimy wtedy korzystać z takiego zapisu jak tutaj
widzisz czyli zaimportować sobie core i tam będziemy mieli metody dla array string
i tak dalej czyli wszystkie nowości w formie takich polyfilli ale dzięki temu
nie będziemy rozszerzać globalnych prototypów okej w tej lekcji to
by było wszystko a od kolejnej lekcji zaczniemy sobie tworzenie naszego finalnego praktycznego
projektu jakim będzie biblioteka dom