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.
Położenie akcji pod.
Piliśmy nasze dane z backendu do Stora i
teraz wypadałoby użyć tych danych w naszych komponentach.
Nie wszystkich danych użyjemy faktycznie,
ale możemy już się tutaj przygotować na to, żeby to działało.
Czyli tak naprawdę moglibyśmy to sobie komentować.
Albo przenieśmy to może do tej sekcji
skryptu i komentujemy ją sobie tutaj, żeby.
Wie skąd to wyłapał.
Swoja drogą są rozszerzenia do
skauta, które sprawiają, że faktycznie pliki się ładnie można je wykorzystywać.
W związku z czym
zróbmy dla testu pozbądźmy się tych wszystkich właściwości stąd.
W razie czego dalej mamy je dostępne w Gicie.
Albo po prostu zrobimy sobie nowy plik.
W którym to chwilowo tutaj wrzucimy.
Więc aplikacja nam się niestety oczywiście wywróciła.
Ale dzieje się tak dlatego, bo w naszych
komponentach wykorzystamy Properties, które nie są teraz zdefiniowane.
Więc co możemy zrobić, to odnieść się do
Store store state content i w tym momencie tego w content powinno nam ruszyć.
Możemy komentować chwilowo tutaj ten content section.
Zobaczmy czy to zadziała.
W kolejnej mapie.
Niezależnie od tego jaka jest treść, to
trzeba ten komponent tutaj ręcznie wrzucić.
Prawdopodobnie cały layout nam się też zepsuje, bo nie spodziewaliśmy się
tego, aby ich nie było, więc może po prostu zaprojektujemy wszystkie naraz.
Zobaczymy jak będzie wyglądała nasza aplikacja.
Czyli tutaj również.
Story stats.
Full info tutaj section in content, więc możemy zrobić tutaj store state.
Content.
I to też powinno działać.
Czy mieliśmy jeszcze jakieś inne komponenty?
Zdaje mi się, że nie.
Zobaczymy co się stanie.
Musimy od strony.
Detail vario include function.
Zobaczmy co się stało. I w jakim miejscu.
Full info box component czyli full info box jest komponentem,
który prawdopodobnie będziemy musieli troszkę zmodyfikować jak go usuniemy.
Odświeżamy.
To faktycznie Temple of Contents tam się ładnie wędrowała.
Zobaczcie, że mamy tutaj już biografie Writing, Legacy, Rembrandt itd.
Itd. Jeśli chodzi o samą treść.
Tutaj tych naszych rzeczy to się niestety nam nie udało, bo to prawdopodobnie
potraktowało całego stringa jako tablicę, więc to co możemy zrobić to.
Upewnić się, że. No właśnie.
Tutaj mamy informację Invalid prop type check failed for property content string.
W związku z czym możemy zrobić to tak.
Że w naszym content section.
Tutaj to po prostu podmieniłem na.
Na stringa content section.
Czyli tutaj content to będzie string.
I w tym momencie.
Musimy zmienić.
Nasz content.
Gdzie jest content pt. Content?
Dobrze i zmieńmy sobie ten content, bo to
jest bezpośrednio nowe property content Aspen Rail
i będziemy po prostu zwracać bez props content, tylko że będziemy je
sprite ować, czyli rozdzielać stringa na pojedyncze elementy tablic na podstawie.
Znaku nowej linii zapiszemy.
Tutaj damy przecinek i podmieniamy tę wartość.
Zobaczmy.
Czy to coś zmieniło i zmieniło?
I faktycznie widać, że.
Tutaj mamy już tą treść.
Ona wydaje mi się, że jest troszkę rozjechana, więc.
Jest całkiem duże prawdopodobieństwo, że
są po prostu dwa znaki nowej linii na każdy paragraf przychodzące z API.
I dokładnie tak było.
W związku z czym
widzimy, że mamy już naszą treść i ta treść powinna być też linkowane.
Jeżeli to sobie klikniemy, zobaczmy czy
faktycznie nas przenosi, czyli list of selected works.
Tutaj się wydaje, że akurat jest to pusty element.
Możliwe, że takie informacje dostajemy.
Tutaj już ciężko o tym zadecydować. Tak to wygląda.
Swoją drogą wydaje mi się, że notes
i references mogą być tutaj puste i przychodzić z innych metod naszego API.
Tym się nie powinniśmy w tym momencie przejmować.
Natomiast tak, mamy już podpięte dwa komponenty pod nasze dane.
Zobaczmy o co chodzi z tym full info boxem.
Przejdźmy to znowu do pliku view.
Full info box może nie komentować Ingo
ale go cofniemy, ale w międzyczasie sobie po prostu wypijemy tutaj full info.
To przekazywaliśmy.
Jej stringi.
Drugi parametr gorzej string.
Fajnie, wszyscy o tym wiedzą.
Może to być custom parser, którego w tym momencie nie potrzebujemy więcej manuala.
A trzeci parametr jest to.
Własna indeksacja, więc jeśli to zapiszemy
to wyświetli nam się ten Jameson i będzie on ładnie sformatowany.
Jeżeli byśmy długo jeszcze to byłoby jeszcze ładniej.
W związku z czym widzę, że tutaj mamy General Name.
Spróbujmy może przekazać do tego komponentu.
Full info od General.
Zobaczymy czy to się stanie.
Możemy tak naprawdę zmienić coś na
poziomie Routing Middleware to przekazywać.
Czy coś tu się wydarzyło?
Error card i przeczytajmy treść tego błędu.
Invalid prod.
While property content expected.
Agregat string.
Full info box powinien otrzymywać obiekt content section.
Content section.
Który przyjmuje stringa to już nie powinno być wtedy.
Wydaje mi się, że to jest jakiś stary błąd.
Tak btw.
Jest na to function czyli detail value w naszym full info boksie.
Nie jest w tym momencie singlem.
Jeśli jest string.
To co możemy z tym zrobić?
Tak naprawdę chyba to przefiltrować.
Czyli jeśli typeof.
Detail Vario jest różny od string.
Return false.
Oczywiście moglibyśmy tutaj zmienić tą logikę, żeby była troszkę prostsza.
Odśwież.
Function.
Czy mamy tutaj podaną linijkę?
Nie mamy.
Ale tutaj też się to znajduje dobrze, więc
mamy po prostu dwa filtry i trzeba też zrobić z tego.
Filtra tutaj.
Swoją drogą jestem ciekaw czy moglibyśmy tutaj zrobić.
Optional.
Wywoływanie.
Czyli jeśli takiej metody nie będzie, to zwróci nam się null.
Jeśli zwróci nam się null na filtrze to powinno się przefiltrować teoretycznie.
Zobaczmy czy to dało radę.
Tam chyba był jakiś błąd.
Tak niestety nie mamy włączonego tutaj Biebera tak aby zrozumiał taki sen,
w związku z czym po prostu tutaj taki sam safe check jak robiliśmy tam.
Napiszmy.
Odświeżam.
I faktycznie wyświetliły nam się tutaj te dane.
Oczywiście one się wyświetlają nie do końca dobrze, bo tak jak pamiętamy.
To co przekazujemy do tego komponentu.
Jest to obiekt i kluczem jest to, co wyświetla się po lewej stronie tabeli.
Wartością jest to, co pojawia się po prawej stronie tabeli.
W związku z czym te wartości będą wyglądały tak, jakby pochodziły z API.
W związku z czym możemy to sobie tutaj
longa na przykład przekonwertować do takich czytelnych ludzkich opisów.
No i będziemy musieli też uzupełnić main image tą informacją, którą też
posiadamy już z API, tylko będziemy musieli ją po prostu wypełnić.
W związku z czym na tym skupimy się w następnej lekcji nad
tym komponentem, aby go troszkę jeszcze wyczyścić.
Ale udało nam się już prze propagować całą informację z naszego API do.
Faktycznie naszej aplikacji i nasz indeks jest o wiele czystszy.
Przynajmniej ta sekcja, gdzie znajdują się Java skrypty jest o wiele czystsza.
Tutaj możemy się tego też pozbyć.
W razie czego mamy odniesienie do tego w.
Story.
My też możemy się pozbyć ikon w tym momencie w sumie też.
Czyli cała logika tego komponentu w tym momencie
sprowadza się tylko i wyłącznie do przekazania mi serwera na tym widoku.
No i cała reszta to jest content, który
też będziemy jeszcze ujednolicić, aby wszystko szło z aplikacji.
W związku z czym za kilka lekcji prawdopodobnie będziemy
już mieli tutaj same komponenty, które będą renderować dane.
Tutaj też tego się pozbyć.
Oraz ten Witold EB usunąć.
I nasz komponent będzie coraz czystszy, coraz bardziej poprawny
jeżeli chodzi o dobre praktyki w namiocie czy w WO.
Do zobaczenia w kolejnej lekcji, gdzie
skupimy się na komponencie głównych informacji.
Zmiany wprowadzone w lekcji · 10 min
diff --git a/19/minipedia/components/ContentSection.vue b/19/minipedia/components/ContentSection.vue
index 2c93545..2566ab3 100644
--- a/19/minipedia/components/ContentSection.vue
+++ b/19/minipedia/components/ContentSection.vue
@@ -1,7 +1,7 @@
<template>
<div>
<h2 :id="headingId">{{ $props.title }}</h2>
- <p v-for="paragraph in content">
+ <p v-for="paragraph in contentAsAnArray">
{{ paragraph }}
</p>
</div>
@@ -15,11 +15,14 @@ export default {
required: true,
},
content: {
- type: Array,
+ type: String,
required: true,
}
},
computed: {
+ contentAsAnArray() {
+ return this.$props.content.split('\n\n');
+ },
headingId() {
return this.$props.title.replace(' ', '-').toLowerCase();
}
diff --git a/19/minipedia/components/FullInfoBox.vue b/19/minipedia/components/FullInfoBox.vue
index d8f98f8..76b7e08 100644
--- a/19/minipedia/components/FullInfoBox.vue
+++ b/19/minipedia/components/FullInfoBox.vue
@@ -36,12 +36,19 @@
textDetails() {
return this.details.filter(detail => {
const detailValue = detail[1];
+ if (typeof detailValue !== 'string') {
+ return false;
+ }
return !detailValue.includes('.PNG')
});
},
mainImage() {
const firstImageBasedOnValue = this.details.filter(detail => {
const detailValue = detail[1];
+
+ if (typeof detailValue !== 'string') {
+ return false;
+ }
return detailValue.includes('.PNG')
})[0];
diff --git a/19/minipedia/pages/index.vue b/19/minipedia/pages/index.vue
index 309612d..8054a79 100644
--- a/19/minipedia/pages/index.vue
+++ b/19/minipedia/pages/index.vue
@@ -1,18 +1,12 @@
<template>
<article class="content">
- {{ $store.state.fullInfo }}
- {{ $store.state.content }}
- {{ $store.state.summary }}
- {{ $store.state.rawImages }}
- {{ $store.state.mainImage }}
<h1>
Janusz Korczak
</h1>
- <span v-tooltip="'Please support the original source of the data'" class="notice">From Wikipedia, the free encyclopedia</span>
+ <span class="notice">From Wikipedia, the free encyclopedia</span>
-
- <FullInfoBox :content="fullInfo" />
+ <FullInfoBox :content="$store.state.fullInfo.general" />
<p>Janusz Korczak, the pen name of Henryk Goldszmit (22 July 1878 or 1879 – 7 August 1942), was a
Polish Jewish educator, children's author and pedagogue known as Pan Doktor ("Mr. Doctor") or Stary
@@ -21,10 +15,10 @@
was sent from the Ghetto to the Treblinka extermination camp by the Nazis, during the Grossaktion
Warschau of 1942.</p>
- <TableOfContents :content="content" />
+ <TableOfContents :content="$store.state.content" />
<ContentSection
- v-for="section in content"
+ v-for="section in $store.state.content"
:title="section.title"
:content="section.content"
:key="section.title"
@@ -180,92 +174,10 @@
</template>
<script>
- import { mapMutations } from 'vuex';
-
export default {
layout: 'default',
middleware: ['wiki-routing'],
- computed: {
- fullInfo() {
- return {
- "Profile photo": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Janusz_Korczak.PNG/220px-Janusz_Korczak.PNG",
- "Born ": "Henryk Goldszmit 22 July 1878",
- "Died": `c. 7 August 1942 (aged 64)
- Treblinka extermination camp, German-occupied Poland`,
- "Occupation": [`Children's author`, `humanitarian`, `pediatrician`, `child pedagogue and defender of children's rights`]
- };
- },
- content() {
- return [{
- title: 'Biography',
- content: [
- `Korczak was born in Warsaw in 1878. He was unsure of his birth date, which he attributed to his
- father's
- failure to promptly acquire a birth certificate for him. His parents were Józef Goldszmit, a
- respected lawyer from a family of proponents of the haskalah, and Cecylia née Gębicka, daughter
- of a
- prominent Kalisz family. Born to a Jewish family, he was an agnostic in his later life who did
- not
- believe in forcing religion on children. His father fell ill around 1890 and was admitted
- to a
- mental hospital, where he died six years later on 25 April 1896. Spacious apartments were
- given
- up on Miodowa street, then Świętojerska. As his family's financial situation worsened, Henryk,
- while
- still attending the gymnasium (the current 8th Lycée in Warsaw began to work as a tutor for
- other
- pupils. In 1896 he debuted on the literary scene with a satirical text on raising children,
- Węzeł
- gordyjski (The Gordian Knot).`,
- `In 1898, he used Janusz Korczak as a pen name in the Ignacy Jan Paderewski Literary Contest. The
- name
- originated from the book Janasz Korczak and the Pretty Swordsweeperlady (O Janaszu Korczaku i
- pięknej
- Miecznikównie) by Józef Ignacy Kraszewski. In the 1890s he studied in the Flying University.
- During
- the years 1898–1904 Korczak studied medicine at the University of Warsaw and also wrote for
- several
- Polish language newspapers. After graduation, he became a pediatrician. In 1905−1912 Korczak worked
- at
- Bersohns and Baumans Children's Hospital in Warsaw. During the Russo-Japanese War, in 1905–06 he
- served
- as a military doctor. Meanwhile, his book Child of the Drawing Room (Dziecko salonu) gained him some
- literary recognition.`,
- `Korczak's orphanage is still in operation at 6 Jaktorowska Street
- In 1907–08, Korczak went to study in Berlin. While working for the Orphans' Society in 1909, he met
- Stefania Wilczyńska, his future closest associate. In 1911–1912, he became a director of Dom Sierot
- in
- Warsaw, an orphanage of his own design for Jewish children. He hired Wilczyńska as his
- assistant.
- There he formed a kind-of-a-republic for children with its own small parliament, court, and a
- newspaper.
- He reduced his other duties as a doctor. Some of his descriptions of the summer camp for Jewish
- children
- in this period and subsequently, were later published in his Fragmenty Utworów and have been
- translated
- into English.`,
- `During World War I, in 1914 Korczak became a military doctor with the rank of lieutenant. He served
- again as a military doctor in the Polish Army with the rank of major during the Polish-Soviet War,
- but
- after a brief stint in Łódź was assigned to Warsaw. After the wars, he continued his practice in
- Warsaw.`
- ]
- },
- {
- title: 'Childhood',
- content: ['Hello world']
-
- },
- {
- title: 'Writings',
- content: ['Hello world2']
-
- }
- ]
- }
- }
}
-
</script>
<style>