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 tym dziale tak jak mówiliśmy opowiadamy
troszkę o optymalizacji naszej strony pod SEO i chciałbym tutaj przedstawić jedną z
najważniejszych rzeczy, którą można zrobić w kontekście prac cyfrowej nad projektem.
Poza faktycznym tworzeniem contentu to opisywanie treści strony za pomocą.
Z kim nie ma kropka.
To jest taka strona,
na której możecie sprawdzić różne metadane o Waszych fragmentach strony i np.
opisywać ich dane fragmenty za pomocą różnych encji.
Czyli jakbyśmy mieli np.
artykuł na Wikipedii.
No to mamy tutaj całą definicję obiektu
artykułu, którą możemy wrzucić na naszej stronie i dzięki temu wyszukiwarki
internetowe, a także przeglądarki internetowe w kontekście dostępności
czasami będą zwracały na te pola troszkę inną uwagę, w związku z czym
zrobimy tak, że zainstalujemy paczkę Next Jackson Child.
Czyli jest to taki pakiet, który pozwoli
nam tworzyć Hej Sony dla naszych podstron na podstawie tego co przekażemy mu
z poziomu WP i często nawet jest to taki format dla schemat.
Org. Który pozwala na deklarowanie jej stanów,
a nie konkretnie pracy na bezpośrednich elementach HTML.
Ponieważ jeśli zobaczymy tutaj np.
id, to klasyczne org działa na takiej
zasadzie, że musimy tutaj podać item type np.
article item prop.
Np.
jakiś tekst, powiedzmy albo image.
I tutaj naprawdę nam puchnie ten html
przez to, że musimy każdy jeden znacznik opisywać w ten sposób.
Więc prostszym sposobem jest pracowanie z Jackson LD.
Jest to o wiele czytelniejsze.
Efekt daje dokładnie taki sam i jesteśmy w
stanie osiągnąć więcej niektórych rozwiązań względem klasycznego podejścia.
HTML.
Więc ja to sobie ponownie tutaj zapiszę, żeby nie było żadnych niepotrzebnych zmian
i zobaczmy jak konfigurację pakietu Jackson Child.
Aby zainstalować ten plugin musimy
tym razem poprzez plugin go zainstalować a nie poprzez moduły.
Więc jak widzimy w zależności od tego co
chcemy zrobić różne rozwiązania będą nam potrzebne.
Tutaj wejdziemy w katalog plugins i stworzymy nowy plik.
Cześć LD to jest Wklejamy sobie ten plik.
Zgodnie z dokumentacją zapiszemy
i teraz musimy dodać ten plik do naszych pluginów.
W configu jest.
Więc wracamy do naszego projektu.
Szukamy pluginów.
I przekazujemy tutaj po prostu sos do naszego Jamesa na ryby zapisujemy.
Wydaje mi się, że jest to plugin typu
zarówno serwer jak i klient, w związku z czym zostawimy to w takiej formie.
I to co teraz musimy zrobić to
wewnatrz naszych komponentów wyeksportować taką metodę Jamesa YT
i ona nam wygeneruje Jacksona dla tych danych, które tutaj sobie zwrócimy.
Wejdźmy sobie do naszego komponentu ID.
I dodajmy tutaj.
Czasem nawet, w związku z czym to, co możemy zrobić to tak jak
wspominaliśmy sprawdzić sobie na Steama różne dostępne typy.
Ja już sprawdziłem, że jest to Arctic jako jeden z dostępnych typów.
I na encji Article możemy poszukać różnych
właściwości, które chcemy wypełnić, czyli np.
article baby.
To będzie coś, co definiuje faktyczną treść naszego
artykułu, więc to możemy sobie tutaj przepisać.
Article body i tutaj powiedzmy test. Chwilowo to jest.
Oczywiście to może być wszystko generowane na podstawie danych, które mamy
już w naszym komponencie i teraz robimy po prostu zapytanie.
Więc robimy też zapytanie do activities.
Aby pobrać pełną treść naszego artykułu, bo jest do tego osobny endpoint.
Ale zanim to zrobimy, wejdźmy na przykładowy widok i podejrzenie źródła.
Na samej górze powinniśmy mieć wygenerowane.
GN PLD.
Widzę, że nam się to nie zapisało.
Jestem w sumie ciekawe dlaczego.
Czyżbym nie uruchomił tego?
No zobaczmy tutaj Jackson.
Jest zapisane.
Często nawet.
Odświeżony.
Skala się na aplikację jeszcze przebudowuje.
Poszukajmy może artykul.
Nie widzę takiego wpisu.
Ciekawe o co może chodzić.
Mimo.
Klient ustaw my nie jest oczywiście
najlepszy z punktu widzenia SEO, bo to się powinno stać oczywiście na
serwerze, żeby mieć renderowane dane już dostępne od razu.
Ale być może coś jest problemem, chyba że faktycznie jest tutaj błąd
widoczny w konsoli, ale nie wydaje się też odświeżyć.
IT view Jane tern context art artykul Buddy tekst.
Powinno być to, że.
Zobaczmy, czy coś tu jeszcze możemy wyczytać.
Nie wydaje się, aby czegoś nam tu brakowało.
Article.
Jest ustawiony poprawnie.
Mamy typ podany.
Więc przejdźmy teraz jeszcze raz na nasz
frontend i zobaczmy czy coś się tutaj wygenerowało.
Na pewno nam się teraz nie renderuje, bo brakuje nam.
Część elit.
Czasem tutaj poszukamy.
Elementy.
I z tego co pamiętam to się to dawało gdzieś na samej górze.
Nie jestem pewien czemu to się na mnie ładuje.
Być może brakuje mi jakiejś prostej.
Idei, bądź możemy spróbować też wrócić z powrotem tutaj do dokumentacji.
Nie faktycznie zwracamy.
I taki oto czasem powinien nam się wyrenderować.
Czego nam tu może brakować?
Może spróbujmy wyrenderować pustą listę kompów.
Całość można sobie podmienić na.
Piszemy i tutaj zrobimy pustą.
Termika.
Zobaczmy, czy coś się wydarzyło.
Nic się nie zmieniło.
Więc dochodzę do wniosku, że nasza paczka nie zainstalowała się poprawnie, więc
zamienimy tutaj formę instalacji na tą prostszą, gdzie przekazujemy stringa.
A tak naprawdę Witold i tak nie jest
używany już w naszym projekcie, więc możemy się go pozbyć.
Zapiszmy.
I tak naprawdę gdyby plik nie mógł zostać
znaleziony, to prawdopodobnie by tak czy siak dał nam o tym znać.
Zapisaliśmy to.
Odśwież stronę.
Ewidentnie nam to nie chce zaskoczyć.
Ja spróbuję po prostu przebudować może cały serwer, być może o to chodzi,
ale jeśli nam się to nie uda, to w każdym razie widzimy jak można używać
tej paczki i tak naprawdę tutaj potrzebujemy tak czy
siak pomocy specjalistów od SEO, ponieważ my jako developerzy jesteśmy w
stanie określić część semantycznego znaczenia danego tagu.
Natomiast z punktu widzenia biznesowego czy z punktu widzenia właśnie
osoby, która zajmuje się optymalizacją danych pod wyszukiwarki, no to musimy
tutaj się dogadać i wykorzystać odpowiednią wersję tagu czy informacji.
I faktycznie po przygotowaniu
znajduje się tutaj tag script, w którym znajdują się tłumaczenia.
A czy znajdują się w nim miejsca na alt również się w nim znajduje,
w związku z czym był to problem z przeładowaniem.
Niestety czasami tak się dzieje,
więc jeżeli jesteście przekonani, że robicie coś poprawnie i niestety kod
wydaje się nie reagować to polecam przebudować serwer.
Pomimo tego, że wygląda na to, że on się sam przebudowuje, to niestety czasami też
różnego rodzaju przeszkadza nam w dokończeniu naszego zadania.
Zmiany wprowadzone w lekcji · 9 min
diff --git a/35/minipedia/nuxt.config.js b/35/minipedia/nuxt.config.js
index 33236bb..747f80b 100644
--- a/35/minipedia/nuxt.config.js
+++ b/35/minipedia/nuxt.config.js
@@ -29,12 +29,9 @@ module.exports = {
css: [
'~/assets/global.css'
],
-
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: [
- {
- src: '~/plugins/v-tooltip.js', mode: 'client'
- }
+ '~/plugins/jsonld'
],
// Auto import components: https://go.nuxtjs.dev/config-components
diff --git a/35/minipedia/package-lock.json b/35/minipedia/package-lock.json
index 9716e97..5bb2de5 100644
--- a/35/minipedia/package-lock.json
+++ b/35/minipedia/package-lock.json
@@ -7955,6 +7955,15 @@
}
}
},
+ "nuxt-jsonld": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/nuxt-jsonld/-/nuxt-jsonld-1.5.0.tgz",
+ "integrity": "sha512-75MOInAmm9NwJG1hS331S5Yt5Eeopte9xgqBFeQS/yahP00QJHAPUNQAQf3nWyvNbRVW7YwN2ipropEi/MM22Q==",
+ "requires": {
+ "schema-dts": "^0.7.1",
+ "xxhashjs": "^0.2.2"
+ }
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -9975,6 +9984,11 @@
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
+ "schema-dts": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-0.7.4.tgz",
+ "integrity": "sha512-nVdu+10WHq8svJF+5ep2Q6eFJvkTTuahn+mgmLsnAMZ3YbUmf/o5MyXl+IOkUcXCCI29czSX7wY53tbuj8MrmA=="
+ },
"schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
diff --git a/35/minipedia/package.json b/35/minipedia/package.json
index b88b88a..ca5c9ed 100644
--- a/35/minipedia/package.json
+++ b/35/minipedia/package.json
@@ -22,6 +22,7 @@
"nuxt": "^2.15.3",
"nuxt-basic-auth-module": "^1.4.0",
"nuxt-i18n": "^6.27.0",
+ "nuxt-jsonld": "^1.5.0",
"v-tooltip": "^2.1.3"
},
"devDependencies": {
diff --git a/35/minipedia/pages/index.vue b/35/minipedia/pages/index.vue
index b073829..a6bcb38 100644
--- a/35/minipedia/pages/index.vue
+++ b/35/minipedia/pages/index.vue
@@ -13,7 +13,14 @@
return {
mostViewed: await $axios.$get(`/api/wiki/mostViewed/lang/${i18n.locale}`),
};
- }
+ },
+ jsonld() {
+ return {
+ '@context': 'http://schema.org',
+ '@type': 'BreadcrumbList',
+ itemListElement: [],
+ };
+ },
}
</script>
diff --git a/35/minipedia/pages/wiki/_id.vue b/35/minipedia/pages/wiki/_id.vue
index 330e735..f00b667 100644
--- a/35/minipedia/pages/wiki/_id.vue
+++ b/35/minipedia/pages/wiki/_id.vue
@@ -3,21 +3,17 @@
<h1>
{{ $route.params.id }}
</h1>
-
+
<a :href="$store.state.originalUrl" class="notice"> {{ $t('Disclaimer') }} </a>
-
+
<FullInfoBox :content="$store.state.fullInfo.general" />
-
+
<p>{{ $store.state.summary }} </p>
<TableOfContents :content="$store.state.content" />
-
- <ContentSection
- v-for="section in $store.state.content"
- :title="section.title"
- :content="section.content"
- :key="section.title"
- />
+
+ <ContentSection v-for="section in $store.state.content" :title="section.title" :content="section.content"
+ :key="section.title" />
</article>
</template>
@@ -25,7 +21,15 @@
export default {
layout: 'default',
middleware: ['wiki-routing'],
+ jsonld() {
+ return {
+ '@context': 'http://schema.org',
+ '@type': 'BreadcrumbList',
+ itemListElement: [],
+ };
+ },
}
+
</script>
<style>
diff --git a/35/minipedia/plugins/jsonld.js b/35/minipedia/plugins/jsonld.js
new file mode 100644
index 0000000..aaab919
--- /dev/null
+++ b/35/minipedia/plugins/jsonld.js
@@ -0,0 +1,9 @@
+import Vue from 'vue';
+import NuxtJsonld from 'nuxt-jsonld';
+
+Vue.use(NuxtJsonld);
+
+// you can set the indentation
+Vue.use(NuxtJsonld, {
+ space: process.env.NODE_ENV === 'production' ? 0 : 2, // default: 2
+});
\ No newline at end of file