Techniki Zaawansowane
5 godz. 11 min · Vue.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperKurs, który masz przed sobą, to kontynuacja wydanego wcześniej kursu Vue.js od Podstaw. W pierwszym kursie omówione zostały najważniejsze koncepcje pracy z Vue, a w tym materiale poruszamy już bardziej zaawansowane tematy. Przede wszystkim skupimy się na pracy z użyciem nowoczesnego workflow, co da nam niezwykłą swobodę tworzenia aplikacji internetowych. Jeśli zatem znasz już podstawy pracy z tym frameworkiem i chcesz wskoczyć na kolejny poziom wtajemniczenia, ten kurs jest zdecydowanie dla Ciebie. A co znajdziesz w materiale?
Na początku zobaczysz, jak szybko tworzyć pliki startowe do nowej aplikacji z użyciem narzędzia vue-cli. Omówimy możliwość dzielenia kodu na wiele plików, tworzenia szablonów, a także wykorzystywania bezpośrednio funkcji renderującej, do której zamieniane są na etapie builda wszystkie szablony.Zobaczysz również czym są i jak pracować z komponentami funkcyjnymi i tzw. mixinami, które pozwolą reużywać raz napisany fragment kodu.
Przepływ informacji to bardzo ważny temat w każdej aplikacji internetowej. Vue oferuje kilka sposobów na to, aby komponenty mogły się ze sobą komunikować. Ich omówienie zaczniemy od najprostszych technik, które świetnie sprawdzają się w wielu przypadkach. Następnie rozszerzymy możliwości instancji Vue w ten sposób, aby wszystkie komponenty miały dostęp do scentralizowanego miejsca, gdzie przechowywany będzie stan aplikacji.Tam jednak, gdzie aplikacja wymaga zarządzania większą ilością danych jednocześnie, powyższe techniki mogą być niewystarczające. Z tego powodu, podobnie jak w innych frameworkach, Vue posiada oficjalny wzorzec oraz bibliotekę do zarządzania stanem aplikacji. Rozwiązanie to nazywa się VueX i w kursie zostanie ono dokładnie omówione. Zobaczysz zatem jak skonfigurować tzw. store, jak przechowywać w nim dane, jak je wyświetlać w widokach, aktualizować za pomocą tzw. mutacji czy pracować z nimi wykorzystując akcje. Przekonasz się, że początkowa większa ilość pracy, aby wszystko skonfigurować, w pewnym momencie zaczyna się opłacać.
Tworzenie nowoczesnych aplikacji typu SPA (Single Page Application) nie może się obejść bez zmian widoków. Dobrą praktyką jest, aby wraz z takimi zmianami, aktualizowany był również pasek adresu. Wykonanie takiego zadania umożliwiają nam tzw. routery. Vue posiada oficjalny dodatek o nazwie vue-router, który w tym kursie dokładnie omówimy.Zobaczysz jak dołączyć router do swojego projektu, a także jak konfigurować ścieżki. Poruszymy tematy takie jak generowanie odnośników, dynamiczne parametry, tworzenie zagnieżdżonych ścieżek czy nawigacja z poziomu kodu JavaScript. Dowiesz się również, jak tworzyć tzw. guardy, które umożliwią lub zablokują możliwość wyświetlania wybranego widoku, np. w zależności od tego czy użytkownik jest aktualnie zalogowany.
Trzecim, po zarządzaniu stanem aplikacji i wykorzystaniu routingu, komponentem, który niezbędny jest do tworzenia aplikacji napędzanych danymi, jest możliwość wysyłania zapytań HTTP.Tę czynność umożliwi nam bardzo popularna, acz niezależna od Vue biblioteka axios. Zobaczysz jak za jej pomocą pobierać i wysyłać dane. Aby jednak jak najwygodniej pracować z tym rozwiązaniem, połączymy axios z Vue, udostępniając tak naprawdę jej metody wewnątrz każdego komponentu.
W jednym z rozdziałów kursu podejmiemy temat walidacji formularzy. Zobaczysz jak z pomocą popularnego pluginu dla Vue, robić to w bardzo prosty sposób.Omówimy różne funkcje walidujące, które umożliwią sprawdzenie poprawności pól tekstowych, radio czy checkboxów. Zobaczysz jak w łatwy sposób wyświetlać komunikaty o błędach i warunkowo zmieniać wygląd pól. Nie zabraknie również informacji o asynchronicznej walidacji, która pozwoli nam na żywo sprawdzać czy wpisany adres email jest dostępny czy też nie.
Kurs ten oczywiście to nie tylko niezbędna teoria, ale także praktyczne przykłady. Aby jak najlepiej poznać omawiane techniki, wykorzystamy je do stworzenia ciekawych aplikacji.Pierwszą z nich będzie konfigurator produktu, który umożliwi użytkownikowi wybór podzespołów zamawianego komputera. Każdy taki wybór będzie wpływał na końcową cenę, która będzie na bieżąco aktualizowana. Po wybraniu wszystkich opcji, dane prześlemy na serwer. To projekt który pokaże Ci jak przechowywać dane z użyciem VueX, a także jak na ich podstawie wyświetlić widok i napisać logikę.Innym projektem, który wykonamy, będzie Quiz. To aplikacja, gdzie użytkownik odpowiadał będzie na serię pytań pobranych z serwera, a do wyboru będą 3 odpowiedzi. Po przejściu przez wszystkie pytania, wyślemy do serwera zapytanie, a ten w zamian zwróci nam listę poprawnych odpowiedzi. Dzięki temu pokażemy użytkownikowi, gdzie miał rację, a gdzie popełnił błąd. Aplikacja ta wykorzystywać będzie wszystkie najważniejsze techniki, tj. VueX, routing, a także Ajax.
Kurs ten jest dla wszystkich osób, które czują się już swobodnie w pracy z frameworkiem Vue. Jeśli zatem masz już solidną wiedzę podstawową lub przerobiłeś kurs Vue.js od Podstaw, to zdecydowanie jesteś gotów na poszerzenie swoich umiejętnośći w pracy z tym frameworkiem. Co ważne, doświadczenie w pracy z innymi frameworkami JavaScript nie jest tutaj wymagane, a jedyne co będzie bardzo pomocne, to znajomość nowej składni EcmaScript 6.
Vue.js 2.x.x
W tej lekcji poznasz jedną z najpotężniejszych rzeczy jaka jest dostępna w Webpacku i w połączeniu z Vue naprawdę
działa to świetnie.
Mianowicie chodzi o asynchroniczne ładowanie modułów i jest to rzecz właśnie związana głównie z Webpack'iem,
który pozwala nam robić dynamiczne importy.
A jest to coś, co powoli swoją drogę do standardu znajduje, więc pojawi się niebawem pewnie w standardzie
ECMAScript.
Natomiast możemy z tego już korzystać, chodzi generalnie o to, żebyśmy mogli sobie zrobić dynamiczny import,
czyli np. po kliknięciu dopiero na jakiś przycisk czy na nawigację, dopiero wtedy chcemy załadować jakiś
moduł.
Do tej pory wszystkie importy, które tutaj robimy są statyczne i Webpack analizuje je na etapie build'a
i wszystko łączy w jeden plik.
Natomiast co, gdybyśmy chcieli zrobić tak, że dopiero wtedy, kiedy ktoś przejdzie do użytkowników czy np.
do edycji użytkownika, żebyśmy dopiero wtedy pobrali kod odpowiedzialny za ten widok i
za tę logikę. Żeby po prostu nasz ten główny bundle był mniejszy i dopiero kiedy ktoś przechodzi dalej,
żebyśmy mogli taki kod pobrać. Przy bardzo małych aplikacjach,
nie jest to konieczne, ale przy większych, naprawdę, będzie bardzo przydatne.
Więc możemy to bez problemu zrobić i mamy coś takiego, co powoli tak jak wspomniałem, ma swoją drogę, jest
na swojej drodze do standardu i to jest dynamiczny import, czyli import wykonywany jako funkcja, gdzie
możemy podać ścieżkę.
Tutaj byśmy podali path, taką ścieżkę jak podajemy tutaj i to nam zwraca promise, więc możemy sobie zrobić then
i następnie możemy zrobić sobie module i taką funkcję, która przyjmuje ten module i np. mamy tam module.default
itd.
Czyli jeżeli, powiedzmy, z Home sobie coś eksportujemy jako default'owy, to tutaj w tej funkcji w then pod module
kropka default,
dokładnie to mieć będziemy.
I webpack tutaj już jest z Vue tak skonfigurowany, że o to zadba i stworzy osobny całkowicie plik javascript'owy.
I kiedy taki import się tutaj wykona, to dopiero wtedy go wczyta.
Więc możemy to zawrzeć w funkcji, ale okazuje się, że fajnie jest to połączone właśnie z VueRouterem i powiedzmy,
że chcielibyśmy po przejściu do UserEdit, dopiero wtedy wczytywać tę część.
Czyli jeżeli tutaj usunę ten import, to wiadomo, że ten kod z UserEdit nie będzie już zawierany w tym głównym
bundle'u.
I o to nam chodzi.
Tego kodu tam po prostu nie będzie, ale teraz będziemy mogli sobie stworzyć UserEdit jako stałą.
I będzie to funkcja i dopiero w tej funkcji będę chciał zrobić import i podać tutaj dokładnie taką ścieżkę,
jak mieliśmy, czyli to sobie skopiuje.
Wstawiam to w tym miejscu, OK.
Czyli to jest funkcja strzałkowska, a więc UserEdit tak naprawdę będzie funkcją, która po wywołaniu
zwraca to, co tutaj jest w import i tak naprawdę promise, a kiedy to promise ma status resolve, od kiedy webpack'owi
udało z serwera pobrać, to dopiero wtedy robi resolve w tej promise'ie i co jest ważne, to możemy sobie
przekazać taką funkcję, tak jak robiliśmy to tutaj z komponentem.
Tu nic nie musimy zmieniać, zamiast przekazywać komponentu, można przekazać funkcję i ta funkcja zostanie
wywołana i tak naprawdę można powiedzieć, że tutaj VueRouter poczeka na kompromis.
I tyle wystarczy.
Sprawdźmy, co tutaj się zmieni. Odświeżamy stronę przejdę do panelu tutaj właśnie network i zaznaczę pliki
JavaScript'owe i chcę wiedzieć kiedy one się pobierają i teraz się pobrał główny plik app, w którym będzie
cała nasza aplikacja.
Ale oprócz tego importu, bo go usunęłem.
W momencie kiedy przejdę do Edycji, zauważ że pobierany jest dodatkowy plik 1.js i to jest właśnie plik,
który webpack utworzył na podstawie tego importu, czyli on dopiero teraz został ściągnięty i wszystko działa
tak jak działać powinno.
Natomiast możemy sobie również zgrupować więcej takich importów w jeden.
Gdybyśmy chcieli powiedzmy wszystkie akcje użytkownika, żeby były w jednym pliku, bo jeżeli np. UserDetails
teraz bym skopiował, czyli zrobię coś takiego, UserDetails, tutaj sobie zaimportujemy też UserDetails, a tutaj go usunę.
Znowu to będzie działać tak jak powinno,
ale zauważ, że będziemy mieć dwa dodatkowe pliki.
W momencie kiedy przejdę do szczegóły jest pobierane 3.js, a kiedy przejdę do Edycji jest pobierane 2.js.
Gdybym natomiast od razu przeszedł do Edycji, gdzie wiemy, że potrzebny jest i widok podglądu i edycji, to
zobacz, jednocześnie będą dwa pliki pobierane.
Można je natomiast zgrupować za pomocą takiego magicznego komentarza w webpacku.
Tutaj możemy wstawić taki komentarz JavaScript;owy i napisać webpackChunkName i podamy sobie tutaj user
i jeżeli coś takiego zrobię również w tym miejscu, to webpack po prostu te wywołania zgrupuje i będzie to wszystko
w jednym pliku.
UserList mógłbyś tam wstawić, UserNavigation czy nawet UserLogin.
Sprawdźmy czy to rzeczywiście działa, przechodzimy do users, przechodzimy do Edytuj i wyłącznie jeden
plik się pobrał i jeżeli w niego wejdziemy zobaczymy Preview, to tutaj będzie cały potrzebny kod dla
tych dwóch modułów i jest on jak widzisz ładowany
asynchroniczne.
Co jeszcze jest ważne gdybyś sobie wykonał tutaj w terminalu.
Jeśli zatrzymamy to Ctrl + C npm run build, czyli zadanie, którego jeszcze nie wykonywaliśmy, ale o nim
mówiłem ono tutaj w package.json jest zdefiniowane, to powinien zostać utworzony katalog dist, w którym
się znajdzie cała nasza aplikacja.
I właśnie ten Chunk również tam będzie, więc zobaczymy sobie,
może tutaj. Katalog dist się otworzył, mamy tutaj całą naszą aplikację i jak widzisz mamy utworzone, utworzonych
kilka plików. Mamy tutaj naszą główną aplikację.
Tutaj jestem Chunk z dwoma modelami, które sobie zaimportowaliśmy, a w vendor będą takie rzeczy jak np. Vue
czy VueRouter.
No i oczywiście to wszystko jest tutaj poprawnie, również, podstawione.
Ok, to zatem tyle w tej lekcji, jak widzisz mega potężna moc drzemie w tym, że możemy dynamicznie importować
sobie jakieś moduły.
Webpack zadba o to, żeby na ich podstawie utworzyć osobne pliki.