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 lekcji w końcu zajmiemy się stworzeniem naszych dynamicznych podstron.
Tak naprawdę cała ta nasza ciężka praca do
tej pory opłaci się właśnie w tej lekcji, bo będziemy mogli w bardzo prosty sposób
podmienić temat danej strony na cokolwiek chcemy i mieć
w tym momencie tak naprawdę nieograniczoną bądź ograniczoną jedynie przez API i
informacje znalezioną na Wikipedii stronę rozmiarowo.
Jeśli chodzi o to, no to zerknijmy sobie ponownie na katalog Pages.
Tak jak mówiliśmy w katalogu pages definiujemy wszystkie nasze podstrony
i tutaj mamy zalinkować jedną stronę, która nie istnieje w naszym index.
Kropka w.
Które docelowo będzie naszą stroną główną
dla naszej mini i on jest za linkowany tutaj w latach, jeśli pamiętamy.
W TV jest taki duet jak reżyser i on nie działa.
Całą resztę także mamy tutaj zdefiniowaną i to co my musimy zrobić to upewnić się,
że nasza strona będzie działa na takiej zasadzie, że
powiedzmy, że zobaczmy jak wygląda prawdziwa Wikipedia, czyli Wikipedia.
Kropka. Org.
Wpiszemy tutaj.
Janusz Korczak już nam się pokazał i ścieżki wyglądają w taki sposób, że mamy
tutaj prefix wiki i nazwę faktycznego prałata.
Tutaj jest podkreślenie my używamy spacji, nie powinno być z tym problemu.
No i generalnie możemy stworzyć taką strukturę w naszych parach.
Więc jeżeli chcemy powiedzieć, że wiki
jest stałym elementem naszej ścieżki, to możemy po prostu stworzyć tutaj folder
i cokolwiek wrzucimy w ten folder to będzie się wędrowało z takim prefiksem.
Czyli jeśli sobie stworzymy tutaj nowy plik index kropka view.
Możemy skopiować nasze pliki login, bo
jest to prosty komponent i tutaj napiszemy sobie.
New page.
Wykrzyknik zapiszemy.
To teraz po wpisaniu wiki.
I bodajże tak wystarczy samo wiki, ponieważ
nazwaliśmy nasz komponent tutaj index kropka view.
W związku z czym skoro jest index kropkami to nie musimy go wpisywać bezpośrednio w
pasek adresu, bo jest to strona główna dla tego katalogu.
W związku z czym moglibyśmy tutaj zrobić jakieś przekierowanie.
Być może. Albo zostawić ten indeks View.
Tak jak jest.
Ale to, co możemy zrobić i będziemy
musieli zrobić jest to parametry zachowanie tego komponentu.
To znaczy, jeśli sobie stworzymy tutaj parametr powiedzmy id.
Tak się tworzy parametry w makiecie,
to powinni byśmy byli być w stanie wejść na wiki.
Slash dowolna ścieżka i ten komponent powinien nam się tutaj wyrenderować.
Więc zobaczmy czy to faktycznie działa.
Wiki Slash test i faktycznie działa.
Nieważne co tutaj wpiszemy to będzie nam chodziło.
Być może nawet jeśli damy więcej ścieżek,
tak więcej ścieżek nie działa, jeśli chcielibyśmy.
Zrobić taką logikę, że
nie ważne co jest po wiki to powinno iść to tego konkretnego komponentu.
No to musielibyśmy tutaj zastosować
wyrażenia regularne i w naszym next config jest po prostu stworzyć regułę, że jeśli
ścieżka zaczyna się na wiki to wszystko do końca będzie parametrem pierwszym.
Czyli jeśli wpiszemy sobie tutaj Janusz
Korczak, to teoretycznie chcielibyśmy, aby nasza strona główna wyświetlała się tutaj.
I widzę, że też
ścieżki tutaj musimy poprawić w naszym layoucie do layoutu default.
I tutaj będzie nasze logo.
Zróbmy tutaj logo z flashem, aby na każdej podstronie było ono renderowane, więc ta
strona będzie znajdowała się docelowo tutaj.
Jak mi się tylko uda
cofnąć trochę, więc co możemy zrobić, to po prostu sobie kopiujemy ten indeks.
Kropka.
Tutaj do it.
Zapiszemy.
I w tym momencie to powinno nam działać w identyczny sposób.
Czyli odświeżamy.
I faktycznie pojawił się tutaj Janusz Korczak.
I to, co musimy zrobić, to jeśli pominiemy te dane na powiedzmy Batman.
To powinnam się tutaj pojawić. Batman.
To się jeszcze oczywiście nie stało, ani stało się to dlatego, ponieważ nasz
Routing Middleware, które już sobie wcześniej stworzyliśmy, jest zakodowany na
Janusza Korczaka, więc to właśnie musimy zmienić jako kolejny krok,
Czyli w naszym wiki routing zmieniamy Janusz Korczak
na jakąś tutaj zmienną powiedzmy możemy zrobić sobie za porucznikiem.
Tym razem tak będzie nam łatwiej.
Ta pas.
I jeśli dobierzemy się tutaj dla tego Wrighta, o którym już też troszkę
mówiliśmy, parametry możemy sobie tam wypisać, zobaczyć co się tam znajduje.
Będzie się tam znajdował parametr id, ponieważ zrobiliśmy sobie
tutaj podkreślenie ID i dzięki temu to jest root.
Dynamiczny path jest na defined.
Oczywiście, że nie jest zdefiniowane,
ponieważ jeszcze nie wypełniliśmy go odpowiednimi danymi, ale faktycznie
widzimy, że jest tutaj ID Batman, więc jesteśmy w stanie wykorzystać tą
ścieżkę, tą zmienną i stworzyć nową zmienną PATH równą tej wartości.
I w tym momencie jeśli wszystko faktycznie jest dobrze ustawione.
Gdy będziemy wchodzili na różne podstrony, na przykład Janusz Korczak.
Spróbujmy tutaj ze spacją.
Tutaj przeglądarka automatycznie zmieni te 20.
Widzimy Janusza Korczaka, jeśli pojedziemy na Batmana.
Powinniśmy zobaczyć całą informację o Batmanie i.
Dokładnie tak się wydarzyło
i faktycznie widzimy tutaj, że wszystkie sekcje są wypełnione Batmanem.
Niestety tutaj API troszkę chyba
nie daje sobie rady z postacią Batmana, ponieważ większość pól jest pusta.
Niestety operujemy tutaj na aplikacjach i API czy bibliotekach, które łączą się z
tymi API, nad którymi nie mamy za dużo problemów.
Natomiast możemy jeszcze spróbować połączyć się do innych podstron, np.
do Hiszpanii.
I w ten sposób przeglądać nasze podstrony.
I tutaj już Hiszpania długo się ładuje,
a nawet jest bardzo duży obrazek, który nie został ujęty w stylach.
To w sumie to naprawdę jest to całkiem śmieszne.
Przejdźmy do full info box i ustawmy może.
W stylach.
Still.
Style.
Nazwa komponentu. Tutaj komponent nawet nie ma swojej nazwy.
To zrób mu po prostu full info box.
Na tej zasadzie to też powinno zadziałać,
chociaż możemy też wykorzystać po prostu ta folia.
A może wykorzystamy to folia więc full bio.
Image.
Czyli MG.
Max wpływ 100% to powinno się do szerokości kontenera dostosować.
I tak się faktycznie też stało
i w związku z czym możemy sobie poczytać dużo informacji o Hiszpanii.
Tutaj musimy się pozbyć tylko tych
referencji, bo one dalej są zahartowane na Janusza Korczaka.
Zobaczmy, czy w ogóle są jeszcze jakieś inne informacje.
To jest też zachowane.
W związku z tym przejdźmy do naszego nowego komponentu IT.
I tutaj po prostu wygenerujemy tak samo produkt.
Kropka.
Parametry.
Kropka nad i.
Widzimy, że tutaj zmieniło się.
Tam na Hiszpanię wpiszmy.
Janusz Korczak.
I chyba pozostałe rzeczy są już tylko i wyłącznie dostępne z referencji.
Więc jak widzimy cały ten czas,
cała nasza ciężka praca związana z propagowaniem tych danych ze Stora,
pobieraniem ich z naszego API w końcu się opłaciła i jesteśmy w stanie
przeglądać tak naprawdę całą Wikipedię z poziomu naszej aplikacji.
A tutaj widzę, że nie wszystkie API nam niestety nie zadziała.
Janusz Korczak Nie jest.
Nie ma takiego wpisu na Wikipedii,
w związku z czym to powinniśmy sobie tutaj jakoś obsłużyć.
Ale generalnie jeżeli znamy klucz Wikipedii czy jej stronę, która na pewno
istnieje, to będziemy w stanie przejrzeć tą stronę, a w kolejnych lekcjach też
stworzymy sobie tutaj taki komponent, w którym będziemy w stanie wyszukiwać
informacje z Wikipedii, a nie wpisywać je tylko i wyłącznie w pasku adresu.
Co jest istotne, to obecne rozwiązanie w tym stanie jaki jest jest dalej dostępne.
Jest zgodne z duchem Progressive Enhancement.
Dlatego tak lubię rozwiązania typu next,
next typu rendering, ponieważ mamy te informacje niezależnie od tego, czy
użytkownik ma wyłączony czy włączony JavaScript.
Jeszcze tutaj tylko wyłączymy JavaScript
na chwilę dla testów DSA i JavaScript odświeżamy stronę
i pomimo tego, że cała nasza aplikacja jest napisana w stu procentach w
JavaScripcie, strona ładuje się, nawet jeśli jest on wyłączony w przeglądarce.
W kolejnej sekcji tego kursu opowiem troszkę o programowym użyciu Nexta
i w kolejnych sekcjach po sekcji dotyczącego programowego użycia Nexta.
Skupimy się na ulepszaniu projektu Mini,
ponieważ mamy wszystkie fundamenty, aby stworzyć z tego naprawdę ciekawą, wydajną
i wygodną w programowaniu aplikację internetową.
Zmiany wprowadzone w lekcji · 9 min
diff --git a/23/minipedia/components/FullInfoBox.vue b/23/minipedia/components/FullInfoBox.vue
index 725fd11..86dc3af 100644
--- a/23/minipedia/components/FullInfoBox.vue
+++ b/23/minipedia/components/FullInfoBox.vue
@@ -62,3 +62,9 @@
</script>
+
+<style>
+.full-bio img {
+ max-width: 100%;
+}
+</style>
diff --git a/23/minipedia/layouts/default.vue b/23/minipedia/layouts/default.vue
index 3ec702a..a507266 100644
--- a/23/minipedia/layouts/default.vue
+++ b/23/minipedia/layouts/default.vue
@@ -3,7 +3,7 @@
<nav class="side-navigation">
<div class="logo">
<a href="/">
- <img src="logo2.png" alt="">
+ <img src="/logo2.png" alt="">
Minipedia
</a>
</div>
diff --git a/23/minipedia/middleware/wiki-routing.js b/23/minipedia/middleware/wiki-routing.js
index 92fbb19..d4162de 100644
--- a/23/minipedia/middleware/wiki-routing.js
+++ b/23/minipedia/middleware/wiki-routing.js
@@ -1,10 +1,11 @@
export default async function ({ store, route, $axios }) {
+ const path = route.params.id;
try {
- store.commit('setFullInfo', await $axios.$get('/api/wiki/fullInfo/page/Janusz%20Korczak'))
- store.commit('setContent', await $axios.$get('/api/wiki/content/page/Janusz%20Korczak'))
- store.commit('setSummary', await $axios.$get('/api/wiki/summary/page/Janusz%20Korczak'))
- store.commit('setRawImages', await $axios.$get('/api/wiki/rawImages/page/Janusz%20Korczak'))
- store.commit('setMainImage', await $axios.$get('/api/wiki/mainImage/page/Janusz%20Korczak'))
+ store.commit('setFullInfo', await $axios.$get('/api/wiki/fullInfo/page/' + path))
+ store.commit('setContent', await $axios.$get('/api/wiki/content/page/' + path))
+ store.commit('setSummary', await $axios.$get('/api/wiki/summary/page/' + path))
+ store.commit('setRawImages', await $axios.$get('/api/wiki/rawImages/page/' + path))
+ store.commit('setMainImage', await $axios.$get('/api/wiki/mainImage/page/' + path))
} catch (e) {
console.error(e);
}
diff --git a/23/minipedia/pages/wiki/_id.vue b/23/minipedia/pages/wiki/_id.vue
new file mode 100644
index 0000000..7cfbb56
--- /dev/null
+++ b/23/minipedia/pages/wiki/_id.vue
@@ -0,0 +1,179 @@
+<template>
+ <article class="content">
+ <h1>
+ {{ $route.params.id }}
+ </h1>
+
+ <span class="notice">From Wikipedia, the free encyclopedia</span>
+
+ <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"
+ />
+
+ <h2 id="references">References</h2>
+ <ol class="references">
+ <li>
+ Yad Vashem (2010). "Ceremony Marking 68 Years Since its Murder of Korczak and the Children of
+ the Orphanage". Yad Vashem The Holocaust Martyrs' and Heroes' Remembrance Authority. Retrieved
+ 27 January 2012.
+ </li>
+ <li>
+ "Jewish Doctor Janusz Korczak Died With 190 Children at Treblinka Court: Changes Date of Death
+ for Orphanage Director". JTA. 30 March 2015. Retrieved 30 March 2015.
+ </li>
+ <li>
+ Sandra Joseph, Institute of Education in London (July–August 2002). "POLE APART - the life and
+ work of Janusz Korczak". Young Minds Magazine 59. Archived from the original on 28 September
+ 2007. Retrieved 27 January 2012.
+ </li>
+ <li>
+ "Polskie Stowarzyszenie im. Janusza Korczaka". www.pskorczak.org.pl (in Polish). Retrieved
+ 2016-03-12.
+ </li>
+ <li>
+ Tadeusz Lewowicki (2000). "Janusz Korczak (1878–1942)" (PDF, 43 KB). Prospects:the quarterly
+ review of comparative education, vol. XXIV, no. 1/2, 1994, p. 37–48. UNESCO: International
+ Bureau of Education. Retrieved 27 January 2012.
+ </li>
+ <li>
+ Prof. Barbara Smolińska–Theiss (2012). "Janusz Korczak – zarys portretu (the portrait)" (in
+ Polish). Rok Janusza Korczaka (The official year of Janusz Korczak). Archived from the original
+ on 15 April 2012. Retrieved 27 January 2012.
+ </li>
+ <li>
+ The Month, Volume 39. Simpki, Marshall, and Company. 1968. p. 350. When Dr. Janusz Korczak, a
+ Jewish philanthropist and agnostic, voluntarily chooses to follow the Jewish orphans under his
+ care to the Nazi extermination camp in Treblinka...
+ </li>
+ <li>
+ Chris Mullen (March 7, 1983). "Korczak's Children: Flawed Faces in a Warsaw Ghetto". The
+ Heights. p. 24. Retrieved 25 August 2013. An assimilated Jew, he changed his name from Henryk
+ Goldschmidt and was an agnostic who did not believe in forcing religion on children.
+ </li>
+ <li>
+ Janusz Korczak (1978). Ghetto diary. Holocaust Library. p. 42. You know I am an agnostic, but I
+ understood: Pedagogy, tolerance, and all that.
+ </li>
+ <li>
+ Janusz Korczak; Aleksander Lewin (1996). Sława: Opowiadania (1898-1914) (in Polish). Oficyna
+ Wydawnicza Latona. p. 387. ISBN 978-83-85449-35-5.
+ </li>
+ <li>
+ Maria Falkowska (1978). Kalendarium życia, działalności i twórczości Janusza Korczaka (in
+ Polish). Wydaw-a Szkolne i Pedagogiczne. p. 8.
+ </li>
+ <li>
+ Joanna Cieśla (15 January 2012). "Henryk zwany Januszem. Janusz Korczak - pedagog
+ rewolucjonista" (in Polish). S.P. Polityka. Historia. Retrieved 27 January 2012.
+ </li>
+ <li>
+ Józef Ignacy Kraszewski (2012). "Moja Biblioteczka". Historia o Janaszu Korczaku i o pięknej
+ Miecznikównie. LubimyCzytać.pl. Retrieved May 25, 2012.
+ </li>
+ <li>
+ Hanna Mortkowicz-Olczakowa (1960). "Goldszmit Henryk", in Polski Słownik Biograficzny, T. VIII.
+ P. 214
+ </li>
+ <li>
+ "CENTOS". Jewish Historical Institute. Retrieved 2020-07-20.
+ </li>
+ <li>
+ Dorit Gani (April 10, 2018). "Who Stood with the Orphans When the Nazis Came?". The National
+ Library of Israel. Retrieved 26 November 2019.
+ </li>
+ <li>
+ Agnieszka Litwiniuk (March 29, 2012). "Stefania Wilczyńska". Sylwetki warszawskich Żydówek
+ (Profiles of Warsaw Jewish women) (in Polish). Warszefroj, Centrum Kultury Jidysz (Yidish
+ Centre). Retrieved 14 December 2013.
+ </li>
+ <li>
+ "Dom Sierot. Krochmalna 92". Swedish Holocaust Memorial Association. Retrieved 27 January 2012.
+ </li>
+ <li>
+ "Perle, Joshua". Encyclopaedia Judaica. Encyclopedia.com. Retrieved June 15, 2019.
+ </li>
+ <li>
+ Nick Shepley (7 December 2015). Hitler, Stalin and the Destruction of Poland: Explaining
+ History. Andrews UK Limited. p. 55. ISBN 978-1-78333-143-7.
+ </li>
+ <li>
+ Jerzy Waldorff, Władysław Szpilman, The Pianist. Page 96.
+ </li>
+ <li>
+ Mary Berg, The Diary of Mary Berg: Growing Up in the Warsaw Ghetto, Oxford: Oneworld
+ Publications, 1996, pages 169-170.
+ </li>
+ <li>
+ "The Jewish Cemetery on Okopowa Street in Warsaw (Cmentarz żydowski przy ul. Okopowej w
+ Warszawie)". Cmentarium. 2007. Retrieved January 8, 2013.
+ </li>
+ <li>
+ Mirosław Gorzelanny (November 27, 2012). "School history". Specjalny Ośrodek Szkolno –
+ Wychowawczy im Janusza Korczaka w Borzęciczkach. Archived from the original on June 26, 2013.
+ Retrieved January 8, 2013.
+ </li>
+ <li>
+ "Wyrok w sprawie Korczaka – omówienie". Fundacja Nowoczesna Polska. Retrieved 2016-03-12.
+ </li>
+ <li>
+ "Wygrany spór o datę śmierci Korczaka. Prawda pokonała "własność intelektualną"". Dziennik
+ Internautów. Retrieved 2016-03-12.
+ </li>
+ <li>
+ "Author: Janusz Korczak". Wolne Lektury. Retrieved 2016-03-12.
+ </li>
+ <li>
+ "Janusz Korczak", Book Institute
+ </li>
+ <li>
+ Modig, Cecilia (2009). Never Violence – Thirty Years on from Sweden's Abolition of Corporal
+ Punishment (PDF). Ministry of Health and Social Affairs, Sweden; Save the Children Sweden.
+ Reference No. S2009.030. p. 8.
+ </li>
+ <li>
+ Agata Anna Lisiak (2010). Urban Cultures in (post)colonial Central Europe. Purdue University
+ Press. pp. 147–. ISBN 978-1-55753-573-3.
+ </li>
+ <li>
+ "Monument to Janusz Korczak (Warsaw)". monuments-remembrance.eu. Retrieved 2020-04-09.
+ </li>
+ <li>
+ Rin, Svi (April 1966). "גדולי חינוך בעמנו Book Review". Jewish Social Studies. 28: 127-128.
+ </li>
+ <li>
+ Hickling, Alfred (June 12, 2008). "?". The Guardian. London.
+ </li>
+ <li>
+ "Chlodnagaden nr. 33 - Dit Holbæk". Dit Holbæk (in Danish). 2017-03-14. Retrieved 2017-04-09.
+ </li>
+ <li>
+ Knapp, Bettina (1995). French Theater Since 1968. New York: Twayne Publishers. ISBN 0805782974.
+ </li>
+ <li>
+ "Korczak (2011) | British Youth Music Theatre".
+ </li>
+
+ </ol>
+
+ </article>
+ </div>
+</template>
+
+<script>
+ export default {
+ layout: 'default',
+ middleware: ['wiki-routing'],
+ }
+</script>
+
+<style>
+</style>