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.
W tej lekcji zajmiemy się tworzeniem. Build.
Poziomów, czyli takich modułów, które służą tylko i wyłącznie deweloperom.
To znaczy nie mają żadnych funkcjonalności w runtime.
Nasi użytkownicy nie będą.
Prawdopodobnie korzystali bezpośrednio z faktu, że korzystamy z tego modułu.
Ale jesteśmy w stanie stworzyć różnego
rodzaju walidację, różnego rodzaju kompilatory czy inne tego
typu rzeczy, które będą uruchamiały nowe procesy.
W momencie kiedy uruchamiamy NPM.
Czyli na cele.
Podczas gdy właśnie nasza aplikacja się.
Przebudowuje tak jak tutaj.
To na tym etapie.
Build moduły są używane.
My w tym przykładzie skupimy się na tym, aby stworzyć build module, który będzie.
Wajda miał zmienne.
Środowiskowe, o których też.
Już mówiliśmy i chcielibyśmy uniknąć
sytuacji takiej, że developer rozpoczynający pracę nad projektem nie ma
tego pliku wypełnionego i zobaczy, że aplikacja nie działa.
Dopiero gdy ją uruchomi i wejdzie na
stronę internetową, czyli na localhost 8000.
Aby uniknąć tego problemu.
Po pierwsze potrzebujemy mechanizmu, który.
Będzie sprawdzał zmienne środowiskowe.
A po drugie, musimy zarejestrować.
Nawet własny Bild moczu.
Aby zrobić to drugie.
Jest to całkiem proste.
Zamknijmy niepotrzebne pliki.
Otwieramy skąd i gdzie jest?
I tutaj musimy stworzyć odniesienie analogicznie do pluginów.
Jakie moduły chcemy załadować?
Jeżeli nie mamy katalogu modules to.
Możemy go sobie tutaj dodać, czyli stworzymy sobie folder models.
I sami. Tam dodamy.
Czyli w moczu.
Chcemy stworzyć nowy plik.
Invalid GS. Jest to też nazwa.
Paczki z której będziemy korzystali do walidacji tych plików.
I oczywiście jako że plik nie istnieje.
To serwer Nexta nam się tutaj wywrócił.
Więc stworzymy ten plik.
Międzyczasie i nazwiemy go tak samo jak tutaj Zadeklarowaliśmy invalid.
I to co trzeba zrobić to trzeba wyeksportować tutaj.
Funkcję export default function.
I na tej funkcji mamy dostęp.
Do kontekstu bez.
Czy gdy zostanie wypełniony w.
Momencie bindowania obiektem rakietowym.
Czyli jeżeli zrobimy sobie tutaj test track czyli next równa się.
Dysk i to się równa.
Dokładnie temu samemu, co byśmy po prostu zrobili Next równa się dysk kropka next.
To będziemy mieli dostęp.
Do różnych właściwości tego next.
Zobaczmy czy to w ogóle zadziała. Console.
Log. Heloł.
Zapiszmy. No i oczywiście.
Musimy uruchomić nasz serwer ponownie.
Bez.
I faktycznie jak zauważycie tutaj chylą.
Się, pojawiło.
I co warto tutaj zauważyć to co się dzieje na wokandzie to się nie.
Dzieje zupełnie blisko frontendu.
Fakt, że wyświetliło się to nam w konsoli. Oznacza.
Że jest to JavaScript uruchamiane po
stronie serwera, w związku z czym nie ma tutaj dostępu do takich rzeczy jak window,
dokument czy inne tego typu zmienne specyficzne dla przeglądarki.
Więc to co możemy zrobić to otworzyć sobie nową.
Kartę. W terminalu i zobaczyć jak.
Tworzy się.
Instancję biblioteki Invalid.
I po prostu kopiujemy. Tutaj ten.
Przykład.
I dostosujemy go do naszych potrzeb.
Czyli importujemy wszystkie potrzebne nam rzeczy.
Z invalid.
Następnie, aby zweryfikować, czy nasz plik.
Konfiguracyjny ze zmiennymi środowiskowymi jest poprawnie ustawiony.
Musimy wywołać.
Funkcję.
I tutaj mamy dodatkowe.
Funkcje, które pozwalają nam analizować typ zmiennych.
W związku z czym przenieśmy to.
Do naszej funkcji, ponieważ to ma się
wykonywać w momencie kiedy max jest faktycznie bile dawane.
Pozbądźmy się tych zmiennych, bo te zmienne nas nie interesują.
I wypełnimy to.
Zmiennymi, które faktycznie powinny znaleźć się w naszym dostępie.
Czyli na tym etapie mieliśmy tutaj tylko.
I wyłącznie te zmienne dotyczące bazy alfa.
Jeśli wrócimy do pliku Elvis Jazz. To możemy teraz.
Wypełnić sobie tutaj te dane.
Komentujemy to na razie.
I czyścimy.
Wtedy będziemy w stanie zdefiniować czy ten klucz.
Ma być kluczem. Wymaganym.
Czy ma być kluczem o typie string.
Czyli ciąg znaków czy jakieś inne.
Czyli domyślnie większość z tych rzeczy
nie powinna być wymagana, ponieważ nie zawsze chcemy.
Mieć username, a z racji, że basic może być wyłączony.
Ale ustawmy to.
Jako wymagane, aby to po prostu przetestować.
I ponownie try.
Jako że będą to wartości tekstowe. I tutaj możemy.
Pobrać jeszcze.
Boli.
Jeżeli jest taka funkcja.
Mam nadzieję, że jest.
I możemy to zapisać.
I po zapisaniu.
I tak naprawdę uruchomieniu.
Tej funkcji robimy sobie jaja.
Jeśli oczywiście zainstalowaliśmy tę paczkę wcześniej.
Jeszcze się upewnijmy, czy to nastąpiło.
NPM.
W odpowiednim katalogu w Wikipedii npm install.
Invalid.
Tu się to. Będzie w międzyczasie pobierało.
No i.
Generalnie mając dostęp do instancji na hosta możemy dostać się do jego opcji.
Czyli jeśli chcielibyśmy, aby to
uruchamiał się tylko i wyłącznie w trybie deweloperskim możemy zrobić np.
next poprzez DF i w tym momencie znajduje się cały nasz.
Next config czyli.
Pod nasz XT.
Poprzez znajduje się to co.
Tutaj mamy pod export default. Czyli będziemy.
Się odwoływali do tej właściwości i.
W zależności od tego czy jest to.
Środowisko deweloperskie.
Czy nie możemy zachować się inaczej?
Chociaż prawdopodobnie zmienne środowiskowe powinny być na obu.
W środowiskach zarówno produkcyjnym jak i developerskim.
Obecne.
Przejdźmy do głównego katalogu.
Gdzie znajduje się.
N.p.m. bez.
I widzimy, że faktycznie Boolean.
Nie występuje jako poprawny typ.
Zobaczmy jakie są. Typy bul.
Bul, bul.
Poprawimy to.
Zapisujemy, uruchamiamy
i oczywiście musimy również zaimportować go pod tą samą nazwą.
Jest całkiem możliwe, że ten skrypt dalej nie będzie działał.
Ale no właśnie.
Tym razem jest to sytuacja pożądana,
ponieważ faktycznie brakuje nam zmiennych środowiskowych i do tego ten.
Moduł był nam potrzebny.
Czyli jeśli sobie tutaj. W n ie.
Ustalimy te wartości i.
Powiedzmy nawet jeżeli ustawimy bezlik
auth enabled na false i tutaj w password damy na.
Password username admin.
Zapiszemy.
I uruchomimy skrypt ponownie.
To widzimy, że tutaj to się jeszcze nie zaaplikował.
Ciekawe czemu?
A dlatego, że to nie jest obiekt.
Zmienne środowiskowe deklarujemy za pomocą znaku równości, nie za pomocą dwukropka.
I ponownie. I w tym momencie widzimy, że to przeszło.
Jeżeli byśmy pozbyli się dowolnej właściwości
z naszego pliku konfiguracyjnego, to nasz proces nie przeszedł by.
W związku z czym.
Oznacza to tyle, że mamy w tym momencie pewność, że niezależnie od tego jaka.
Jest wartość tej zmiennej.
Musi ona być ustawiona.
Aby nasz next zbudował się w ogóle. Co możemy zrobić jeszcze?
Oczywiście to jest bardzo pobieżne.
Potraktowanie tego, co można zrobić z BIOS
modułami, ale jest to faktycznie praktyczny przykład.
Który jest przydatny.
W tym, co można zrobić, pozbądźmy się nieużywanych importów.
I być może w.
Systemie deweloperskim. Tylko i wyłącznie.
W systemie deweloperskim uruchamiamy tą.
Właściwość.
I w tym momencie. Ona się dalej wywoła, ponieważ.
Nasz model jest.
W tym momencie ustawiony na development,
w związku z czym normalnie przechodzimy to i mamy wypełnione informacje.
Jeżeli pozbędziemy się tej zmiennej
środowiskowej ponownie, no to dostaniemy tutaj błąd.
Co można zrobić Jeszcze to wykorzystać?
Właśnie light cegiełki, o których też już troszkę mówiłem.
Aby wyświetlić tutaj informacje w tym panelu next.
Czy jesteśmy w stanie tutaj.
Dodać jakąś treść, jeżeli mamy taką potrzebę?
Jeśli chodzi o nasz, być może nie byłoby to konieczne, ale jeśli chcielibyśmy.
Użyć tej przestrzeni.
Możemy wykorzystać do tego Hook, który też był oczywiście wspomniany w dokumentacji.
On dostaje tutaj.
Różne właściwości jako parametry do funkcji, z których możemy korzystać.
Jeśli chcielibyśmy dodać naszą własną informację.
Na temat tego, czy udało się.
Skompilować projekt pod względem zmiennych środowiskowych.
No to możemy to tutaj umieścić.
Czyli po prostu environment file.
Sims, coffee.
Albo po prostu.
Environment tables sim traffic,
ponieważ możemy ustawiać zmienne środowiskowe nie tylko poprzez plik.
Zapiszemy.
Wyczyściłem ekran, uruchomiłem ponownie.
Alex Token.
Prawdopodobnie wkleiłem tutaj coś co.
Niestety nie.
Pasuje.
Jeden nawias za dużo.
I faktycznie widzimy, że w momencie kiedy
ten huk się wywołał, dostaliśmy informację.
Environment variable sink. Afi.
Jeśli chcielibyśmy.
Moglibyśmy też wyświetlić to w innym
kolorze za pomocą paczki konsola, która też jest wbudowana w build module.
Więc jest to praktyczne użycie.
Build OSów możecie zrobić tutaj różne inne
rzeczy, jak na przykład wykrywanie czy serwis siostrzany.
Na którym nasza aplikacja działa, faktycznie chodzi.
Czy jeśli mielibyśmy zewnętrzne API, z którego pobierali byśmy dane,
to moglibyśmy tutaj stworzyć sobie hooka, który będzie pilnował czy np.
. Wikipedia.
Żyje? Ponieważ jeżeli Wikipedia.
Z jakiegoś powodu będzie. Miała tam time, czyli po prostu nie.
Będzie chodziła, nie będzie online. To nasza aplikacja.
Również nie zadziała.
I to też możemy wykryć na etapie pisma ciosów.
Chociaż wiem, fajnie też się to powinno wydarzyć.
To wszystko w tej sekcji kursu.
W następnej sekcji będziemy zajmować się
faktycznym tworzeniem API i połączeniem się z Wikipedią.
Pod kątem przekazywania danych do naszej aplikacji.
Zmiany wprowadzone w lekcji · 11 min
diff --git a/11/minipedia/.env b/11/minipedia/.env
new file mode 100644
index 0000000..249a01d
--- /dev/null
+++ b/11/minipedia/.env
@@ -0,0 +1,3 @@
+BASIC_ENABLED=false
+PASSWORD=password
+USERNAME=admin
\ No newline at end of file
diff --git a/11/minipedia/.gitignore b/11/minipedia/.gitignore
index e8f682b..9c48156 100644
--- a/11/minipedia/.gitignore
+++ b/11/minipedia/.gitignore
@@ -56,9 +56,6 @@ typings/
# Yarn Integrity file
.yarn-integrity
-# dotenv environment variables file
-.env
-
# parcel-bundler cache (https://parceljs.org/)
.cache
diff --git a/11/minipedia/modules/envalid.js b/11/minipedia/modules/envalid.js
new file mode 100644
index 0000000..8c082f2
--- /dev/null
+++ b/11/minipedia/modules/envalid.js
@@ -0,0 +1,23 @@
+import {
+ cleanEnv,
+ str,
+ bool
+} from 'envalid';
+
+export default function () {
+ const {
+ nuxt
+ } = this;
+
+ if (nuxt.options.dev) {
+ cleanEnv(process.env, {
+ USERNAME: str(),
+ PASSWORD: str(),
+ BASIC_ENABLED: bool()
+ })
+ }
+
+ nuxt.hook('listen', async function (server, { port }) {
+ nuxt.options.cli.badgeMessages.push(`Environment variables seem healthy!`)
+ });
+}
diff --git a/11/minipedia/nuxt.config.js b/11/minipedia/nuxt.config.js
index 03c23f9..8f2bf8d 100644
--- a/11/minipedia/nuxt.config.js
+++ b/11/minipedia/nuxt.config.js
@@ -14,7 +14,7 @@ export default {
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.png' }
]
- },
+ },
server: {
port: 8000,
},
@@ -36,6 +36,7 @@ export default {
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
buildModules: [
+ '~/modules/envalid.js'
],
// Modules: https://go.nuxtjs.dev/config-modules
diff --git a/11/minipedia/package-lock.json b/11/minipedia/package-lock.json
index 8ea0d09..9e3de43 100644
--- a/11/minipedia/package-lock.json
+++ b/11/minipedia/package-lock.json
@@ -4395,6 +4395,11 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
},
+ "envalid": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/envalid/-/envalid-7.1.0.tgz",
+ "integrity": "sha512-C5rtCxfj+ozW5q79fBYKcBEf0KSNklKwZudjCzXy9ANT8Pz1MKxPBn6unZnYXXy6e+cqVgnEURQeXmdueG9/kA=="
+ },
"errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
diff --git a/11/minipedia/package.json b/11/minipedia/package.json
index 9f85135..7f7decc 100644
--- a/11/minipedia/package.json
+++ b/11/minipedia/package.json
@@ -13,6 +13,7 @@
"dependencies": {
"@nuxtjs/axios": "^5.13.1",
"core-js": "^3.9.1",
+ "envalid": "^7.1.0",
"nuxt": "^2.15.3",
"nuxt-basic-auth-module": "^1.4.0",
"v-tooltip": "^2.1.3"