Prosty i Nowoczesny Framework dla Vue.js
7 godz. 2 min · Vue.js · Full-stack i Programowanie
Wojciech PołowniakSr. Fullstack EngineerW tym projekcie tworzyć będziemy praktyczny projekt - klona Wikipedii! Minipedia pobierze dane z prawdziwego źrodła danych, zewnętrznego API WikiMedia - będzie łudząco podobna do oryginału oraz współdzieliła najważniejsze funkcjonalności, takie jak dostarczanie treści w różnych wersjach językowych, możliwość wyszukiwania artykułów, czy pobieranie najpopularniejszych wpisów dla danego języka. Stworzymy także podstronę wyświetlającą za każdym razem losowy artykuł w danej wersji językowej.Zobaczysz też, jak dokonać migracji ze statycznej strony HTML na Nuxt - oraz jak tworzyć przykładowe komponenty podczas tego procesu.Dzięki temu wszystkiemu, dowiesz się jak wykorzystać nabytą wiedzę w praktyce.
Dzięki Nuxtowi dowiesz się jak optymalizować Twoje strony www z duchem idei progressive enhancement, dostarczając coraz to lepsze doświadczenia dla swoich użytkowników oraz tworząc aplikację napisaną w 100% w JavaScript, która będzie działała nawet wtedy, gdy użytkownik jawnie wyłączy go w przeglądarce! To wszystko za SSR (Server Side Rendering), dzięki któremu treści będą gotowe do konsumpcji już przy wstępnej, pierwszej odpowiedzi z serwera WWW.Oczywiście, ma to swoje implikacje na wydajność naszej aplikacji - sprawiając że Lighthouse czy optymalizacja pod SEO staje się coraz prostsza!
Czymże jest ekosystem danego frameworka bez wsparcia społeczności! Dlatego podczas tego kursu nauczysz się instalować i wykorzystywać różne pluginy i moduły, które zaoszczędzą Ci dużo czasu. Dowiesz się też, jak tworzyć własne moduły - które rozszerzą działanie Twojej aplikacji Nuxt w sposób czysty i zarządzalny.
Nuxt jest frameworkiem w którym pracujemy zarówno po stronie front-endu, jak i back-endu. W związku z czym, stworzymy swoje własne API (bazujące na express.js) które będzie pewnego rodzaju pośrednikiem pomiędzy API WikiMedia oraz Twoją aplikacją internetową.
W tym kursie, dowiesz się także jak tworzyć swoje własne Middleware'y - czyli fragmenty kodu wywoływane pomiędzy przechodzeniem między stronami, czy podczas innych zapytań HTTP.Dodatkowo, zobaczysz jakie narzędzia daje nam Nuxt aby tworzyć progresywne aplikacje internetowe, oferując wsparcie dla takich funkcjonalności jak np. animacje między przejściami pojedynczymi podstronami naszego serwisu.
Tajemnicze i18n - czyli numeronim odpowiadający angielskiemu słowu "internalisation" - odnosi się w kontekście web developmentu do tłumaczenia danych na różne języki. Podczas realizacji projektu Minipedii, nie tylko wykorzystamy standardowe podejście do tłumaczeń stałych elementów naszego interfejsu użytkownika, ale także przetłumaczymy same dane zwracane z API, wykorzystując inną wersję językową w zależności od preferencji użytkownika!
Poznasz też kilka ciekawych pluginów i rozwiązań dotyczących optymalizacji pod SEO - poza faktem, że podejście spełniające intencje użytkownika jest najlepszym, co możemy zrobić - pluginy generujące nam mapę stron automatycznie na podstawie zadeklarowanych przez nas podstron, czy generatory danych jsonld pomogą w pozycjonowaniu Twojej wydajnej aplikacji jeszcze wyżej w hierarchii wyszukiwarek.
Aby móc efektywnie korzystać z tego kursu, powinieneś posiadać średnio zaawansowaną wiedzę z kategorii Front End, z naciskiem na umiejętność posługiwania się JavaScriptem oraz solidne podstawy NodeJS. Konieczna jest znajomość Vue, jako że Nuxt jest frameworkiem korzystającym z niego u swoich podstaw. Jeśli czujesz się dość swobodnie w wyżej wymienionych aspektach web developmentu, ten kurs będzie idealny dla Ciebie.
Cześć! W tej sekcji odejdziemy na.
Chwilę od komponentów i frontendu nowego podejścia do pracy z tekstem.
I w tej lekcji skupimy się na sekcji, którą już troszkę omówiliśmy w.
Poprzednich lekcjach.
Czyli plugina.
Jest to o tyle proste, że możemy zarejestrować pluginy do wł czy.
Nie tylko do filmu.
W bardzo prosty sposób.
I tak naprawdę Next przy początkowym.
Ustawieniu.
Mógłby już tutaj nam wypełnić.
To pole w pliku config.
To jest jakimiś modułami, które mielibyśmy już dostępne.
I tutaj widzę, że akurat Axis jest.
Teraz ładowane jako moduł, niejako plugin.
Są pewne różnice wewnętrzne.
Co do tego jak one się zachowują. Ale jeśli przejdziemy.
Tutaj do dokumentacji to zobaczymy, że.
Mamy możliwość definiowania pluginów różnego typu.
To znaczy.
Pluginy możemy definiować w taki sposób,
że jest to tablica pewnych obiektów, gdzie musimy podać źródło naszego pluginu.
Który jest zwykłym.
Plikiem tekstowym, który sami sobie tworzymy.
I musimy wskazać.
W jakim trybie ma ten plugin zostać użyty, ponieważ.
Niektóre.
Biblioteki będziemy używali tylko.
I wyłącznie na froncie, jak np.
w polu TIP, które właśnie w tym przykładzie będziemy omawiać.
Czy też.
Typowo backend owe rozwiązania jak np.
.
Pluginy, które mają się wywoływać po
stronie serwera w async, data czy w innych krokach, o których też już mówiliśmy i o
których będziemy mówić dalej, gdy będziemy ich używać.
No i oczywiście jest też.
Tryb globalny, to znaczy, że działa zarówno dla klienta jak i serwera.
Tutaj widzę.
Że akurat Axis jest załadowany poprzez pluginy.
U nas załadowany jest poprzez next, jest akcja.
Prawdopodobnie to jest nowsza wersja, a to było jakąś alternatywną opcją, jeżeli nie
korzystamy z wbudowanych generatorów projektów.
No ale stwórzmy po prostu.
Podstawowy plugin.
Który będzie.
Będę robił takie protip czyli jeżeli wyjdziemy na Witolda.
Jest to taka paczka npm owa która jest rozszerzeniem dla view.
Możemy troszkę teraz szerzej, żeby widzieć co tu się dzieje.
Które pozwala pokazywać to tipi.
Jej instalacja jest banalnie prosta.
Więc tak też zrobimy.
Uruchomimy npm install z odpowiednią nazwą.
Tutaj otworzę sobie nowy terminal, żeby
nie zamykać naszego nexta i po prostu wklejam.
W odpowiednim.
Katalogu mini pdf lpm install save vito tip.
I w międzyczasie jak to.
Się nam ładuje. To ja w naszym.
Katalogu plugins stworzę nowy plik.
I będzie to po prostu wina Tulip.
Czy jest?
I tak jak tutaj jest to zadeklarowane.
Zrobimy prosty import.
I zarejestrujemy go w www.
Czyli zapiszemy to.
I większość prasy już jest za nami.
Musimy jeszcze tylko wskazać w.
Pliku na skąd i gdzie jest tak jak tutaj widzieliśmy w dokumentacji
ścieżkę do danego pliku i tryb w jakim się renderuje.
Pliki są typowo frontową rzeczą.
W związku z czym nie ma sensu umieszczać
ich na serwerze, więc możemy jawnie powiedzieć, że jest to paczka klienckie.
Więc tworzymy obiekt Souls jako klucz główny katalog plugins.
Witold Czy jest.
Model klient zapisujemy.
Przejdźmy z powrotem do serwera, żeby zobaczyć czy wszystko działa.
I Witold jest akurat też podany jako przykład.
Tutaj w dokumentacji tak mi się wydaje.
Chyba w tym pliku było to wskazane.
Że w taki właśnie sposób możemy frontend do zależności ładować do nexta.
No i teraz co możemy z tym zrobić?
Zobaczmy sobie dokumentację tego modułu.
I teraz na dowolnym elemencie HTML.
Owym możemy wstawić nasz własny z naszym własnym tekstem.
I oczywiście można go custom złamać itd.
My tego robić nie będziemy.
Ale zdecydowanie użyjemy tego tipa, żeby sprawdzić czy to faktycznie zadziałało.
Czyli teraz jeśli sobie zrobimy. Np.
na spanie from Wikipedia friends Xperia.
Tutaj widzę to tip.
Please support the original source of the data.
Zapiszemy.
I oczywiście to musi być jako string, bo tutaj Witold jest dyrektywą WU.
Zapisujemy.
I w tym momencie.
Gdy jedziemy na tego pana wikipedia na skroty.
Jak widać faktycznie ten protip nie jest
on jakoś ładnie instalowany, ponieważ brakuje mu prawdopodobnie CSS ów.
Natomiast tak jak widzimy.
Jesteśmy w stanie bez problemu załadować dowolne pluginy View.
W naszej aplikacji znak STOP.
Ponieważ jeżeli byśmy pozbyli.
Się tutaj tego znaku skonfiguruj s.
Czyli tutaj to sobie komentujemy, zapiszemy.
To teraz ta dyrektywa nie ma prawa działać, ponieważ nie jest zadeklarowana.
I prawdopodobnie.
Nasza aplikacja się wysypie jak to się tylko przewiduje.
No to zobaczymy czy.
Czy coś się złego stanie.
Nie, nasza aplikacja się nie zepsuła.
Zobaczmy czy jest jakiś błąd w konsoli.
Tak fajne, ale sama aplikacja się nie wywróciła.
Jest to po prostu błąd Java skryptowy.
Który może wpłynąć na.
Działanie naszej aplikacji. Jeżeli np.
w runtime mielibyśmy jakieś zależności,
które nie załadują się właśnie przez brak tejże dyrektywy.
W związku z czym tak właśnie możemy.
Deklarować nowe pluginy do WP czy generalnie do Nexta.
I mogą to być dowolne.
Paczki mp move.
Tylko musimy pamiętać, aby umieszczać daną paczkę w zależności od jej przeznaczenia
albo po stronie klienckiej, albo po stronie serwera.
Szczerze mówiąc nie korzystam tak często z pluginów.
Bo większość rzeczy.
Jest już w tym momencie.
Pisana na modułach i modułów.
Nie trzeba tak bardzo konfigurować. Wystarczy.
Zaimportować. Tutaj nazwę tego modułu
i ewentualnie skonfigurować go tutaj dodatkowymi opcjami.
I community pomimo tego, że jest mniejsze.
Niż to jak.
Nexta.
Zdecydowanie pracuję nad tymi modułami, więc pluginy są
bardziej do sytuacji kiedy chcemy sami stworzyć.
Jakiś plugin do. Nexta.
Nie chcemy tworzyć całego.
Modułu, ponieważ jest to troszkę bardziej
czasochłonne i niesie ze sobą obowiązek rozumowania.
Wersjonowanie Nexta.
A chcemy mieć po.
Prostu rozszerzenie naszych funkcjonalności.
W kolejnej lekcji zajmiemy się bind modułami.
Czyli modułami, które wykonują się po stronie serwera.
I służą przede wszystkim
zarządzaniu projektem na etapie developerskim, niekoniecznie
w runtime, czyli niekoniecznie będziemy tam umieszczać moduły związane z czymś, co
użytkownik będzie docelowo widział, ale o tym w następnej lekcji.
Zmiany wprowadzone w lekcji · 7 min
diff --git a/10/minipedia/nuxt.config.js b/10/minipedia/nuxt.config.js
index 2d4cd80..03c23f9 100644
--- a/10/minipedia/nuxt.config.js
+++ b/10/minipedia/nuxt.config.js
@@ -26,6 +26,9 @@ export default {
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: [
+ {
+ src: '~/plugins/v-tooltip.js', mode: 'client'
+ }
],
// Auto import components: https://go.nuxtjs.dev/config-components
diff --git a/10/minipedia/package-lock.json b/10/minipedia/package-lock.json
index f08991e..8ea0d09 100644
--- a/10/minipedia/package-lock.json
+++ b/10/minipedia/package-lock.json
@@ -8051,6 +8051,11 @@
"ts-pnp": "^1.1.6"
}
},
+ "popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -11015,6 +11020,17 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
+ "v-tooltip": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz",
+ "integrity": "sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "lodash": "^4.17.21",
+ "popper.js": "^1.16.1",
+ "vue-resize": "^1.0.1"
+ }
+ },
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
@@ -11125,6 +11141,14 @@
"resolved": "https://registry.npmjs.org/vue-no-ssr/-/vue-no-ssr-1.1.1.tgz",
"integrity": "sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g=="
},
+ "vue-resize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz",
+ "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
"vue-router": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz",
diff --git a/10/minipedia/package.json b/10/minipedia/package.json
index 61f3c2d..9f85135 100644
--- a/10/minipedia/package.json
+++ b/10/minipedia/package.json
@@ -14,7 +14,8 @@
"@nuxtjs/axios": "^5.13.1",
"core-js": "^3.9.1",
"nuxt": "^2.15.3",
- "nuxt-basic-auth-module": "^1.4.0"
+ "nuxt-basic-auth-module": "^1.4.0",
+ "v-tooltip": "^2.1.3"
},
"devDependencies": {
"@nuxtjs/eslint-config": "^6.0.0",
diff --git a/10/minipedia/pages/index.vue b/10/minipedia/pages/index.vue
index c946534..a4b4b7f 100644
--- a/10/minipedia/pages/index.vue
+++ b/10/minipedia/pages/index.vue
@@ -4,7 +4,7 @@
Janusz Korczak
</h1>
- <span class="notice">From Wikipedia, the free encyclopedia</span>
+ <span v-tooltip="'Please support the original source of the data'" class="notice">From Wikipedia, the free encyclopedia</span>
<FullInfoBox :content="fullInfo" />
diff --git a/10/minipedia/plugins/v-tooltip.js b/10/minipedia/plugins/v-tooltip.js
new file mode 100644
index 0000000..554b784
--- /dev/null
+++ b/10/minipedia/plugins/v-tooltip.js
@@ -0,0 +1,4 @@
+import Vue from 'vue'
+import VTooltip from 'v-tooltip'
+
+Vue.use(VTooltip);
\ No newline at end of file