od Podstaw
7 godz. 6 min · Vue.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperAby zacząć korzystać z Vue, wystarczy dodać do strony jeden element <script> i zacząć rozszerzać HTML o nowe możliwości prezentacji danych, które w całości kontrolujemy z poziomu kodu JavaScript. Najlepsze jest jednak to, że gdy dane się zmienią, Vue odzwierciedli wszystkie zmiany na stronie. Koniec zatem z odwoływaniem się z poziomu kodu JavaScript do elementów z drzewa DOM i "ręczną" ich manipulacją!Czy łatwość użycia Vue oznacza, że jest to framework prosty i nienadający się do budowania ambitnych aplikacji internetowych? Absolutnie nie! Jeżeli potrafisz korzystać z workflow opartego na webpacku, znasz nową składnię ES6 i chcesz swoje projekty dzielić na wiele uporządkowanych plików - możesz w ten sposób pracować. Jeśli jednak przy innych frameworkach przytłoczyły Cię wszystkie dodatkowe narzędzia i nie potrafiłeś się skupić na najważniejszym, czyli poznawaniu frameworka, to tutaj tego problemu nie doświadczysz.
W kursie tym krok po kroku poznasz ten lekki, acz potężny framework. Zaczniemy od instalcji i obowiązkowego projektu "Hello World!". Dowiesz się czym jest "Virtual DOM" i dlaczego Vue z niego korzysta. Następnie zobaczysz jak kontrolować wybraną część strony internetowej za pomocą metod, właściwości i dynamicznych atrybutów. Aby zrozumieć reaktywność Vue, przyjrzymy się konstrukcjom języka JavaScript, które ją umożliwiają.
Aby aplikacja mogła być interaktywna, nie może być obojętna na działania użytkownika. Z tego powodu zobaczysz, jak przypisywać obsługę zdarzeń, takich jak np. kliknięcie, jak do funkcji przekazywać parametry oraz jak korzystać z natywnego obiektu Event. Nie zabraknie również informacji o tym, jak modyfikować obsługę zdarzeń tak, by np. przechwycić jednoczesne wciśnięcie wybranej kombinacji klawiszy.Jak się przekonasz, dyrektywy Vue pozwolą Ci na manipulację nie tylko zachowaniem, ale i wyglądem elementów HTML. Omówimy dokładnie jak kontrolować przypisywane klasy CSS, a także liniowe style. Wszystko to oczywiście na praktycznych przykładach! Poznasz również sposoby warunkowego wyświetlania elementów, a także iteracji. Już na tym etapie będziesz gotowy do stworzenia swojego pierwszego, praktycznego projektu. Będzie do Counter, a zatem licznik odliczający od 10 do 0. Jeśli kiedykolwiek korzystałeś z biblioteki jQuery, zobaczysz totalnie inne podejście - proste i czytelne.
W jednym z rozdziałów kursu omówimy dokładnie techniki pracy z formularzami. Zobaczysz jak przechwytywać wpisywane przez użytkownika dane, na wszystkich rodzajach pól, jakie oferuje język HTML. Abyś wszystko jak najlepiej zrozumiał, spróbujemy wspólnie zaimplementować tzw. dwukierunkowe wiązanie danych, które Vue oferuje za pomocą jednej dyrektywy.Z kursu dowiesz się także czym są oraz jak tworzyć własne filtry, jak odwoływać się do elementów z drzewa DOM, gdy jest to konieczne, a także co oferują nam własne dyrektywy.
Jedną z największych zalet frameworka Vue.js jest możliwość tworzenia komponentów. Są to własne elementy HTML, które możemy umieszczać w wybranych miejscach naszej aplikacji. Element taki to jednak nie tylko wygląd, który definiujemy za pomocą szablonu, ale także (a może i przede wszystkim) logika, kontrolowana z poziomu kodu JavaScript.Zobaczysz jak zarejestrować własny komponent lokalnie oraz globalnie, jak sprawić, aby był reużywalny, przyjmując różne dane oraz jak komunikować się pomiędzy komponentami, by aplikacja pozostawała w synchronizacji. W tym celu omówimy dwa kierunki komunikacji, najpierw rodzic-dziecko, a później dziecko-rodzic. Na tym etapie wykonamy bardzo ciekawy, praktyczny projekt. Będzie to tabela napędzana danymi. Każdy wiesz tabeli prezentował będzie dane jednej osoby, a kliknięcie ikony kosza pozwoli na jej usunięcie. Ikona edycji zaś, zamieni wiesz w pola input, za pomocą których zaktualizujemy dane. W projekcie tym wykorzystamy niemal całą wcześniej zdobytą wiedzę!
Vue.js oferuje możliwość animowania elementów, kiedy są one pokazywane lub ukrywane. I omówienia tego tematu nie mogło również zabraknąć w tym kursie. Poznasz sposoby na animowanie elementów w użyciem CSS, zobaczysz jak animować podmianę jednego komponentu na drugi, a także jak uzyskać taki efekt dla listy elementów. Mając już wiedzę z zakresu tworzenia własnych komponentów, stworzymy wspólnie element, który pozwoli na animację innych, zawartych w nim elementów. W tym celu zintegrujemy nasz komponent z biblioteką animate.css.
Przez większą część kursu pracować będziemy pisząc kod JavaScript w standardzie ES5, a więc tym najpopularniejszym. Nie będziemy również korzystać z żadnych skomplikowanych narzędzi. Wszystko to po to, abyś mógł jak najlepiej zrozumieć sedno Vue.js, a nie zastanawiać się, który zapis jest specyficzny dla tego frameworka, a który to część nowego standardu JavaScript lub syntactic sugar dodany przez narzędzie uruchamiane z poziomu terminala.Nie oznacza to jednak, że z Vue nie da się pracować w sposób nowoczesny! Oczywiście jest taka możliwość i doskonale się o tym przekonasz. W jednym z rozdziałów kursu omówimy narzędzie vue-cli, które pozwoli nam przygotować startowy projekt nowej aplikacji, a także środowisko skonfigurowane z użyciem webpack'a, które umożliwi nam wydajną pracę. Na tym etapie zobaczysz, że komponentu Vue można tworzyć w zupełnie oddzielnych plikach z rozszerzeniem .vue, gdzie umieścimy zarówno szablon jak i logikę komponentu, a także (opcjonalnie) jego style CSS.Kurs ten zwieńczymy stworzeniem nowoczesnej aplikacji, wykorzystując najnowszy zapis ES6 i workflow stworzony z użyciem vue-cli. Projektem tym będzie Slideshow, a więc galeria zdjęć. Stworzymy od podstaw kilka komponentów, dodamy własny preloader obrazów, a także możliwość pobierania listy obrazów z serwera. Do tego celu wykorzystamy popularną bibliotekę axios, która umożliwia łatwe wykonywanie zapytań HTTP. Pod koniec dodamy do naszej aplikacji również routing, aby na pasku adresu odzwierciedlać aktualnie wyświetlany obraz, a także umożliwić nawigację za pomocą przycisków "Wstecz" i "Do przodu" dostępnych w przeglądarce internetowej. To zadanie ułatwi nam bardzo popularny plugin dla Vue, który nazywa się vue-router. Zobaczysz jak go zainstalować, a także skonfigurować. Następnie omówimy dynamiczne parametry, które odczytamy w komponencie. Finalnie zaktualizujemy adres URL z poziomu kodu JavaScript.Ostatnim krokiem jaki wykonamy, będzie stworzenie builda produkcyjnego naszej aplikacji, który gotowy będzie do na stronę internetową.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i sposoby na pracę z Obiektowym Modelem Dokumentu. Aby go rozpocząć, nie jest wymagana znajomość innych frameworków, ale taka wiedza na pewno nie zaszkodzi, a pomoże lepiej zrozumieć te zagadnienia, które są dla nich wspólne. Nie jest również wymagana wiedza z zakresu EcmaScript 6 czy webpack'a, lecz na pewno będzie pomocna w ostatim rozdziale tego kursu. Nieważne zatem czy Vue.js będzie pierwszym frameworkiem, który poznasz, czy będzie to odskocznia od React'a czy Angulara - na pewno to narzędzie Cię zaskoczy!
Vue.js 2.5.x
W tej lekcji pokażę ci jak do naszej aplikacji dodać Vue Router, ale jeszcze jedno sprostowanie
niewielkie, bo tutaj zauważyłem, że po odświeżeniu nie do końca wygląda to tak jak
powinno. Ten obrazek trochę dziwnie wskakuje, a kiedy wczytaliśmy ten pierwszy obrazek,
robiliśmy this loaded równa się true i zapomniałem zmienić jednej rzeczy. Tutaj
v-if, zamiast image jest length, czyli pokazujemy to wtedy, kiedy się nam ta tablica
wczyta. Powinniśmy to byli zamienić na loaded, czyli jeżeli loaded ma
wartość true, tylko wtedy to chcemy pokazywać i zobacz będzie różnica,
teraz ten obrazek będzie wskakiwał dopiero kiedy on na pewno będzie wczytany, więc
taka mała zmiana. Przejdźmy teraz na stronę Vue Router. Jest
to dosyć zaawansowany plugin do Vue, który nie jest częścią samego framework'a
Vue, ale za jego pomocą można komponować sobie swój własny framework,
dodawać różne rzeczy, z użyciem axios jak widziałeś bez problemu można pobierać dane,
a Vue Router służy nam do podmiany tutaj na pasku adresu url'i
w taki sposób, żeby one odzwierciadlały gdzie jesteśmy w naszej aplikacji. Będziemy
chcieli ten Vue Router sobie teraz zainstalować przy robieniu tej templatki
Vue init webpack pytał nas o to czy chcemy, wtedy powiedzieliśmy, że nie, ale
teraz jeżeli tutaj zatrzymam serwer i wpiszemy npm install minus d Vue Rauter,
to będziemy go mogli zainstalować i zaimportować. Zrobimy
to tutaj w głównej naszej aplikacji, czyli main. Importujemy tutaj
Vue i chciałbym również zrobić import vue router from
vue router. Będziemy
go tutaj mieli już się zainstalował, więc uruchomię sobie serwer żebyśmy byli pewni,
że wszystko działa i teraz będziemy musieli ten router tutaj skonfigurować.
Po pierwsze musimy sobie utworzyć taką tablice routes
i możemy to zrobić tak, jest
to tablica w której będziemy podawać obiekty, ale ja nie chcę zaśmiecać tej głównej aplikacji, dlatego
ja to chcę wyeksportować do innego pliku. W naszym katalogu 57 src
chciałbym sobie utworzyć katalog, który nazwę routes
i tam będzie plik, może
z wielkiej litery, routes.js i niego chcę zrobić export default
i właśnie tutaj będzie taka tablica, okej
i w niej to będziemy sobie wszystko mogli ustawić, a tutaj sobie to zaimportujemy, po
prostu. Chciałbym zrobić tutaj u góry import routes from
i tutaj będziemy musieli podać katalog, w którym jesteśmy aktualnie następnie
routes i plik routes.js, czyli js
nie muszę podawać. Tylko po to, żeby w tym pliku tego nie wpisywać, zrobiłem to
tak. Ten plik z wielkiej litery tutaj nazwałem i będziemy to mieli w tym miejscu i
teraz route, które mogą utworzyć, to jest taki obiekt, może ich tutaj
być dowolnie wiele i tworzymy sobie path, czyli możemy
tutaj powiedzieć, że jeżeli adres znasz to jest ukośnik, czyli jakby strona główna,
to coś ma się wydarzyć. Natomiast ja chcę najpierw przypisać adres dla
slide i następnie możemy dynamicznie sobie tutaj przypisać parametr,
bo będę chciał zrobić taki adres, że jeżeli będziemy zmieniać te slajdy, to tutaj
będzie napisane slide na przykład 1, 2 i tak dalej, więc
ten dynamiczny parametr można tutaj zbindować za pomocą takiego dwukropka
i nazwę go index, a tutaj musimy podać jaki komponent ma być wtedy wczytywany.
No właśnie. Chciałbym wczytać komponent
slideshow, więc muszę go sobie tutaj zaimportować, dlatego zrobiłem to
w osobnym pliku, żeby po prostu było wygodniej, więc napiszemy import slideshow from
i zobaczmy w jakim jesteśmy miejscu. Muszę wyjść jeden katalog
do góry, do components i slideshow.
To mi zaimportuje ten nasz component slideshow, będzie
przekompilowane odpowiednio i w tym routes będę mógł powiedzieć, że jeżeli przejdziemy
pod path slide cokolwiek, to chce wczytać komponent slideshow, czyli do
niego tutaj trzeba przekazać referencje, a nie tylko podać jego nazwę. Okej, to jednak
nie wszystko, bo ten plik routes teraz sobie tutaj za importowaliśmy, ale
musimy pewną rzecz jeszcze zrobić. Musimy stworzyć nowy router z użyciem
new vue router i jemu przekazać
routes, taki klucz i następnie routes, ale skoro
to tutaj się nazywa tak samo to w ES6 można ten zapis skrócić w ten sposób i to
jeszcze nie wszystko, bo do naszej głównej aplikacji musimy przekazać teraz router
na wartość router, czyli dokładnie na to, co mamy tutaj. Znowu skrótowo
można zapisać to w ten sposób, pamiętając tutaj o przecinku. Prawie
wszystko działa, ale jeszcze nie wszystko, bo żeby to mogło działać to my tutaj powiedzieliśmy,
że po przejściu pod taki adres chcielibyśmy wczytywać ten komponent, ale pytanie
brzmi gdzie. No właśnie. Musimy przejść do naszej aplikacji i w
miejscu w którym wczytywaliśmy slideshow i przekazywaliśmy mu images, zamienimy to
teraz na taki specjalny element, który się nazywa router Vue
i tutaj go zamknę w ten sposób. Mogę również
mu przekazywać różne rzeczy i one wtedy będą przekazane do tego komponentu, czyli tutaj zostanie
wstawiony ten slideshow, to działa podobnie jak komponent ease,
które ci w tym kursie pokazywałem i w tym miejscu właśnie to będzie wstawione, a pozostała
struktura będzie tutaj bez zmian. Okej, no i sprawdźmy
czy to ma sens. Odświeżam, widzimy, że są jakieś błędy, więc sprawdźmy co jest
nie tak, okej. Widzimy, że ten komponent nie został odpowiednio
rozpoznany, jeszcze jednej rzeczy zapomnieliśmy. Tutaj musimy jeszcze zrobić jedną
rzecz, vue use, w ten sposób mówimy, że vue ma korzystać z jakiegoś plugin'u. W
lekcji poprzedniej pokazywałem ci axios, w którym mówiłem, że można również skonfigurować
z użyciem właśnie plugin'u, który się nazywa vue axios. Wtedy też byśmy
robili vue use. Tu musimy powiedzieć vue use vue router, czyli
żeby Vue wiedziało, że w ogóle ma z czegoś takiego korzystać i wtedy będzie rozumiało, co
to znaczy, że do instancji zostało przekazane coś takiego. Teraz nam działa i zauważ,
że taki hash się tutaj dodał. Wszystkie nasze route'y będą za takim hash'em, aczkolwiek
można to zmienić w ten sposób, żeby tutaj było HTML5 History API, ale
ja już tego nie będę robił. Jest to temat na kolejny materiał, tak naprawdę, czyli
budowanie bardziej złożonych aplikacji. Ważne, że ten router będzie działał,
tylko że będąc na stronie głównej nic nam się nie wczytało, bo my powiedzieliśmy,
że ten nasz komponent ma się wczytać jeżeli jesteśmy pod takim adresem, więc
jeżeli to zmienimy na slajd na przykład 1, to wtedy nam się to
powinno czytać. Jak widzisz, coś tutaj się dzieje, powinno to
zadziałać. Jeżeli nie, to tutaj odświeżmy, zobaczymy czy wtedy to się wczyta. Wczytało
się, natomiast chciałbym dla naszej konkretnej aplikacji z uwagi na fakt, że nie będziemy
mieć kilku różnych widoków, to chciałbym zrobić przekierowanie, że
jak wyjdziemy na stronę główną, to żeby przekierowało do pierwszego slajdu i można
to łatwo zrobić tutaj stawiając drugi obiekt konfiguracyjny, czyli
osobną ścieżkę, mówię, jeżeli ktoś wejdzie na stronę główną to zrób redirect
do i tutaj chcę zrobić slajd 1,
czyli do pierwszego slajdu. Zapiszmy i zobaczmy. Jak
widzisz automatycznie nas przekierowało i teraz to wszystko działa poprawnie. Natomiast zanim
jeszcze dokończymy tą aplikację to chciałbym ci powiedzieć co możesz zrobić z użyciem Vue
Router, gdybyś był ciekaw. Chodzi o to, że my za moment
będziemy nawigować z punktu widzenia JavaScriptu, ale Vue Router pozwala
ci generować linki, czyli jeżeli tutaj przejdziemy, to
możesz dodać sobie taki element router link tu i tutaj podawać ścieżkę, a
tutaj tekst i Vue Router wtedy wygeneruje ci link a i w
tym linku jeżeli go klikniesz, to będzie się podmieniał ten adres, więc w ten sposób można tworzyć
linki. Moglibyśmy zrobić router link to, ukośnik slide. Natomiast
nie będę tego robił, dlatego że ja będę zmieniał ten adres z poziomu kodu
JavaScript, a nie z poziomu tej templatki HTML'owej, ale warto o tym wiedzieć jeżeli
chciałbyś się pobawić z Vue Router'em. Teraz chcemy zrobić kilka rzeczy. Po
pierwsze, nie ma żadnego znaczenia, że tutaj wpiszę 2, 3 i tak dalej. Nasz slider
na to nie reaguje, ale chciałbym ten parametr zczytać. Nie bez powodu go tutaj podaliśmy
jako dwukropek index. Można go oczywiście odczytać i można
go odczytać właśnie w komponencie, który jest tutaj przypisany, czyli slideshow, zatem przejdźmy
w to miejsce i przejdziemy sobie tutaj i skąd
możemy wiedzieć, że zmieniło się coś tutaj na tym pasku, że ta dwójka zmieniła się na
trójkę. Jeżeli byśmy sobie tutaj kliknęli ten nasz komponent slideshow. Przy
okazji widzisz, że jest wstawiony przez Reuter Vue i świetne to narzędzie jest i
wszystko nam pokazuje, to jeżeli go zaznaczę pod dolar vm0 go
mam, to możemy tam się odwołać do route i zobacz
co jest w środku. Wewnątrz będziemy mieli params i w
params jest index 3, dlatego index, że w routes nazwaliśmy
to dwukropek index, czyli jeszcze raz vm0, czyli u nas
to będzie this dolar route params index i tutaj mamy
wartość. Będę chciał ją tylko zamienić na wartość liczbową, więc my możemy na to
tak naprawdę nasłuchiwać tutaj za pomocą łacza. Mieliśmy tutaj już jednego watch'a,
więc dodajemy drugiego. Chce nasłuchiwać na dolar route, ale
musimy to zapisać w taki sposób. Okej, w zasadzie chyba
ten string tutaj nie jest konieczny, ale zostawmy to w ten sposób. W ES6
ten skrótowy zapis, czyli kiedy zmieni się route, to
będziemy to mieli this route params
index. To co nas interesuje w naszym przypadku. No i ja wtedy
jeżeli to się zmieni tutaj, będę chciał zmienić nasz slajd,
czyli będę chciał wykonać metodę change slide, czyli zrobimy sobie this change slide,
tylko że jeżeli tam przekaże na przykład trójkę to nam to nie zadziała, bo ona tutaj jest przycisków
przyjmowała przypomnę ci minus 1. Jeżeli kliknęliśmy tutaj lub
jeden, więc będziemy musieli ją lekko zmodyfikować. Będę
chciał żeby ona tutaj przyjmowała jeszcze drugi parametr, ale może pierwsze ją tutaj wywołajmy. Po
pierwsze będę chciał ten string trój trzy, czyli trójkę na przykład
zamienić na number w ten sposób, bo wiemy, że był to string i przekaże
go do metody change slide, ale chcę jeszcze przekazać drugi parametr na wartość true i
teraz za pomocą tego parametru dostosujemy sobie resztę,
więc chciałbym go tutaj nazwać router i domyślny parametr w ES6
ustawić na false, czyli jeżeli normalnie klikamy przycisk to
nie zostaje tutaj nic przekazane, bo nie zrobiliśmy tego przy kliknięciu, na przykład
tutaj. Czyli będzie to miało domyślna wartość false i dostosujemy
sobie to w taki oto sposób, wkleje tutaj fragment kodu. W zasadzie
wystarczy zmienić jedną linijkę, czyli jeżeli router
jest podany to chcemy wziąć dir minus 1. Powiedzmy, że tutaj na routerze Jest trójka,
to chcemy wziąć drugi index tablicy, bo mamy od zera, 0, 1, 2, więc
dlatego zrobię dir minus 1. To dir, no to będzie to co przekazane
pod pierwszy parametr, czyli właśnie z tego routera. Natomiast w przeciwnym wypadku jeżeli tu jest
false, to będziemy robić to, co robiliśmy wcześniej, okej. Prosta sprawa, sprawdzimy
czy to ma sens. Odświeżę tutaj całkowicie od nowa i jak sprawdzić czy trzeci
obrazek się teraz wczytał, przejdziemy do Vue i tutaj
mamy app, musimy przejść niżej to slide i mamy tutaj, jak widzisz, nie
trzeci, ale pierwszy obrazek, czyli za pierwszym wczytaniem to nie zadziałało, ale jeżeli teraz
to podmienię, okej. Jakiś błąd się pojawił. Widzimy,
że nie możemy odczytać index of undefined. Coś tutaj zrobiliśmy
źle. Zabrakło s'ki, okej. Jeszcze raz. Ja
w całości to odświeżę. Przejdziemy do Vue
do slide. Obrazek jest pierwszy, ale zmieńmy go na trzeci na przykład i
po zmianie tutaj, jak widać zaczyna to działać poprawnie. Trzeci
obrazek się wczytał, czyli reagujemy na te zmiany. No i teraz ostatnią rzeczą, którą
chciałbym zrobić będzie to, że jeżeli sobie kliknę na tą strzałkę i zmienia mi się na kolejny
slajd, to tak naprawdę ja będę chciał zaktualizować również to co mamy
tutaj u góry i wtedy będzie nam to działać poprawnie, a działa też wtedy jeżeli
ktoś tutaj zmieni to sposób ręczny, więc teraz będziemy
chcieli przejść do metody gdzie zmieniamy rzeczywiście ten slajd i momencie kiedy
nam się obrazek już wczytał, tutaj to będzie mogli zrobić
coś takiego this router razem a nie route
tak jak zrobiłem to tutaj i następnie push, w ten
sposób możemy powiedzieć, że chcemy zmienić adres url i tutaj podamy sobie
ścieżkę. Będzie to, ja zrobię to w postaci takiego template string'u,
bo będzie to tutaj dynamiczne, na slide i tutaj chce podstawić
aktualny slajd, a wiem, że mamy go pod index plus 1, bo na tym routerze nie
będziemy od zera wyświetlać, tylko właśnie od jedynki. Stąd zrobimy to w takiej formie. Jeszcze
otworzę narzędzia, żeby zobaczyć czy nie ma jakiegoś błędu. Odświeżmy może to wszystko i może
całkowicie od strony głównej, okej, wczytało
się i teraz jeżeli tutaj zmienię obrazek, jak widzisz jest on podmieniany. Szybko
nam to weszło, ale w niektórych przypadkach będzie się pojawiał preloader jeżeli połączenie
będzie troszeczkę wolniejsze. Zobaczmy, jest preloader i dopiero kiedy się
do wczyta podmienia nam się to w tym miejscu, ale jest jeszcze jedna zaleta tego routera. W
momencie kiedy kliknę wstecz, zmieni nam się to tutaj na trójkę. Nasłuchiwaliśmy
na te zmiany za pomocą watch'era. No i dzięki temu możesz
zobaczyć, że zmieniają się również na nasze slajdy. Wrócę tutaj do
pełnej prędkości i powiem ci, że tym sposobem zakończyliśmy podawanie naszej aplikacji. Pozostało
ją tylko jeszcze zbuild'ować, żeby można było wstawić ją
na serwer, bo teraz pracujemy developmencko. Mam nadzieję, że ten projekt ci się podobał. Starałem
ci się pokazać jak najwięcej rzeczy, które do tej pory były plus jeszcze Axios i Vue
Rauter. Natomiast w Vue Router potrafiłby dużo bardziej zaawansowany. Polecam
ci, jeżeli masz tylko chęci żeby tutaj więcej o tym poczytać,
ale i tak pokazałem ci na szybko najważniejsze jego koncepcje, oprócz może generowania
linku za pomocą router link, bo to akurat nie było nam potrzebne, ale jak widziałeś w dokumentacji
jest to bardzo proste. Zatem w ostatniej lekcji poświęconej temu
projektowi, zróbmy sobie jeszcze produkcyjny build.