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 poprzedniej lekcji omówiliśmy strukturę
aplikacji Nexta i w tej lekcji opowiem troszkę o zmiennych środowiskowych.
I faktycznie stworzymy już coś w aplikacji, co będzie miało jakiś sens.
To znaczy zainstalujemy moduł na gotowy
moduł nazywa się Next Basic a w maju i jego zadaniem jest to, aby po
wizycie na naszą stronę internetową właśnie tutaj pokazywał się taki oto
jak się nam załaduje popup z informacjami, w których musimy
wpisać nasze dane logowania, bo inaczej strona w ogóle się nam nie wyświetli.
Więc jest to taka pierwsza pierwsza forma zabezpieczenia naszej
aplikacji przed nieautoryzowanym osobnikami i możemy to
w prosty sposób zaimplementować i do tego będą nam też potrzebne zmienne
środowiskowe, w związku z czym ja sobie skopiuję nazwę tego modułu.
Next Basic ów moduł Możemy go zainstalować poprzez jar bądź przez npm.
Tak jak wspominałem będziemy korzystali tutaj z npm a.
Instal.
Next pack w modzie.
I gdy wrócimy do Czech zobaczymy, że w skonfiguruje się, czyli w tym głównym
pliku, o którym wspominałem, że jest bardzo istotna jeżeli chodzi o pracę z
tekstem, musimy zadeklarować nowo zainstalowany moduł.
Czyli w Property modules będziemy podawali
tablicę modułów, które chcemy zainstalować.
I tutaj właśnie ten moduł.
I to jest konfiguracja tego oto modułu.
W związku z czym jeśli sobie to skopiuję.
I wrócimy do naszego pliku.
Tutaj to się dalej instaluje.
Wejdziemy w nast config hrs i zobaczymy, że tutaj jest już wpisane Marcus.
Ponieważ wybraliśmy sobie Asusa jako moduł, który będzie zainstalowany
domyślnie o to on się tutaj już pojawił, więc ja tylko przeniosę z
z altem oraz strzałki w górę, aby przenieść daną linijkę w dół
lub w górę i przeniosę go tutaj do Moczulski.
Ten fragment kodu usuwam
i w konfiguracji czyli w basic możemy dać różne opcje, czyli
to co tutaj deklarujemy pod name będzie naszym username naszą nazwą użytkownika.
Więc jeśli sobie tutaj wpiszemy.
Admin.
I tutaj wpiszemy password.
To widzimy, że tutaj Next się już tam przebudowuje.
I w Enabled możemy wskazać, czy chcemy
faktycznie korzystać z tego bzyka, ponieważ nie zawsze jest on wymagany.
Prawdopodobnie, gdy już będziemy mieli
aplikację produkcyjną, bądź po prostu będziemy mieli inną formę
logowania zaimplementowaną, to nie będzie on nam już potrzebny.
Ja tutaj w tym momencie to zasadniczo do
rejestru, ale widzimy, że w taki sposób odwołujemy się do zmiennych
środowiskowych, tak jak się dzieje to w nocie.
Więc ja tutaj po prostu
wpiszę true jako build, zapiszę ponownie i zobaczmy czy to nam tutaj zadziałało.
On się przebudowuje.
Czasami jest tak, że jeżeli edytujemy next
config jest a, to trzeba go tutaj zabić za pomocą kontrolce i uruchomić jeszcze raz.
Naprawdę.
Natomiast w tym wypadku nie było to konieczne.
Wystarczyło odświeżyć z Shift Command i R
na mojej maszynie bądź Control F5 aby odświeżyć to na Windowsie.
No i faktycznie, jeśli wpiszemy sobie tutaj jakieś dowolne dane.
To widzimy, że jesteśmy odbijanie.
Czyli znowu popatrz nam się pojawia i
będzie się pojawiał w nieskończoność tak długo jak będziemy wpisywać złe hasło.
Jeśli wpiszemy admin
i jako hasło podamy nasz password, to nasza strona już w tym momencie działa.
Oczywiście to się nam
tutaj zachowało, więc powinniśmy z trybu incognito za każdym razem w to wchodzić.
Ale to co chciałem Wam pokazać jako istotną rzecz to to tutaj
odwoływanie się do zmiennych środowiskowych, ponieważ hard
kodowanie haseł czy nazw użytkownika nie jest dobrą praktyką.
Możemy stworzyć.
Plik zawierający zmienne środowiskowe.
Jest taka konwencja, że domyślnie
trzymane są one z reguły w ukrytych plikach, czyli zaczynają się one
od kropki i kropka i MV jak environment, czyli środowisko.
I tam właśnie trzymamy nasze zmienne środowiskowe.
Czyli jeśli chcielibyśmy powiedzieć, że.
Czyli jeśli ustawimy sobie Basic Enabled
ustawione na true w naszym pliku kropka mv.
I robimy to poprzez proste przypisanie równa się, czyli true.
Zapiszemy tutaj.
Zobaczymy, że to nam się udawało
i w tym momencie tak naprawdę jesteśmy na tym samym etapie co byliśmy w kontekście
ustawienia tego tutaj na true, ponieważ ta wartość będzie teraz wypełniona.
Ale możemy też stworzyć własne zmienne środowiskowe i wynieść username i password
poza nasz kod BS, ponieważ plików z reguły się nie komentuje.
Jako dobrą praktykę, w związku z czym jeśli sobie tutaj
wpiszemy proces kropka i mv username i tutaj ustawimy process kropka
i encji password zapiszemy i tutaj wpiszemy username.
Admin 2. Tak dla pewności tylko oraz password.
Password.
Napiszemy więc ten plik już będzie poza wersjonowanie nie będzie zapisywane,
a więc taki plik też powinniście sobie sami stworzyć.
Jeżeli będziecie korzystać z tego przykładu, ponieważ on się nie zapisze
i nie zapisze się, ponieważ mamy taką definicję fixed ignore.
Tutaj właśnie w designera
będzie wpisana reguła, że po prostu pliki typu kropka elf nie są zapisywane.
No i po zapisaniu widzimy, że otworzył nam się znowu ten pokaz.
Piszemy sobie admin password i odbiło nas, ponieważ nie mamy
tutaj zadeklarowanego admin 2 co było naszym hasłem, więc wpisujemy password
i faktycznie widzimy, że coś nie zadziałało.
Czyli jesteśmy w stanie korzystać z tych zmiennych środowiskowych wewnątrz pliku.
Next.
Configure jest najważniejsza rzecz w tej lekcji, którą
chciałem powiedzieć o zmiennych środowiskowych.
Jest to, że w tekście
te zmienne nie będą domyślnie przekazywane do warstwy aplikacji.
Co to znaczy? Jeżeli wejdziemy w nasze page i np.
naszą stronę Page play login, czyli tutaj class Login i zmienimy np.
welcome tutaj wpiszemy sobie username.
Analogicznie musimy oczywiście tutaj stworzyć jakiś komputer.
Property.
I tutaj zrobimy username,
który będzie zwracał nam po prostu proces wi username co może dla.
Przykładu.
Piter.
Tutaj damy po prostu.
A co Ty?
Czyli nasza nazwa użytkownika będzie zakodowana, czyli po prostu.
W środku.
Naszego kodu.
Tutaj widzę, że.
S.
Niestety.
Rzuca błąd jeżeli chodzi o formatowanie, a też automatycznie nie.
Poprawił go, w związku z czym możemy to w tym momencie zignorować albo.
Naprawić to formatowanie.
Natomiast ja tutaj tego bym nie chciał robić.
Zobaczmy, czy Spotify nam po prostu pomoże.
Zapiszemy, że to co się zmieniło
jest tylko gorzej, więc cofniemy, wyłączę klienta na
kolejne rzeczy, ale widzimy faktycznie, że łapką się nam wyświetliło, w związku z
czym kod działa tylko ze względu na formatowanie.
Dostajemy tutaj błąd, ponieważ mamy dosyć silne sprawdzanie tego kodu.
Co jest istotne to jeżeli zrobimy w
classes username oczywiście tutaj najlepiej byłoby bez literówek.
To się nam odświeży albo miało się odświeżyć ręcznie.
W tym momencie maczał Gold false.
Teraz to już jest błąd.
Oczywiście trzeba napisać w odpowiednim formacie.
Po odświeżeniu widzimy wielką admin 2 przez chwilę,
co jest dość ciekawe, a ponieważ jest to renderowane na ekranie.
Ale w momencie kiedy frontend renderuje warstwę view,
czyli tak jak normalnie wchodzimy na naszą stronę internetową.
To view jest ładowane poprzez znacznik
skrypt i ten znacznik script również tutaj się znajduje, który będzie
w trybie czyli wewnątrz przeglądarki przebudowywać nam to co się znajduje, aby
realizować logikę fundamentalną takie jak np.
drag and drop czy filtrowanie po listach i tak dalej i tak dalej.
Ale początkowo widzimy to dlatego, bo dane są renderowane na backend, czyli
treść tych komponentów, ona w momencie, gdy mamy pierwszą zwrotkę z serwera.
Ponieważ to jest właśnie to, co dostajemy
z serwera na samym wejściu, już zawierają w sobie te dane, ale przez
to, że Next wycina zmienne środowiskowe z runtime u po to, aby nie
wystawiać na zewnątrz potencjalnie newralgicznych danych, to one znikają.
Jak temu zapobiec?
Jak sprawić, aby ta informacja tutaj dalej się znajdowała?
Jest to oczywiście opisane w dokumentacji,
ale ja po prostu tutaj powiem, że to co trzeba zrobić to w naszych
zmiennych środowiskowych wpisać tutaj next i MWI jako prefiks naszej zmiennej
środowiskowej, która ma się znaleźć na fontannie.
Czyli jeśli tutaj sobie wejdziemy w.
Next Dogs.
I tutaj wpiszemy environment.
Environment tables.
To tutaj powinno się pojawić na XT
i MWI jeśli fajnie wyglądają starting next i mwi debilny proces.
Oznacza to, że jeżeli będziemy tworzyć
zmienne środowiskowe z tym prefiksem, one będą znajdowały się również na fontannie.
Czyli wracając do naszego przykładu next mwi username to jest teraz nasza
nazwa zmiennej, to już musimy prefiksu używać.
Czyli w tym momencie musimy zmienić tą nazwę zmiennej w tym miejscu.
I faktycznie, gdy wejdziemy z powrotem na nasz projekt.
Widzimy, że admin.
Dalej się tutaj pojawia,
ale jeśli spróbowali byśmy ponownie dostać się do np.
pola password to już tego nie można zrobić.
A dzieje się to dlatego, ponieważ jeżeli
napiszemy aplikację w zły sposób mógłby dostać się do naszego password, a
oczywiście tego byśmy nie chcieli, ponieważ mógłby po prostu wejść w konsolę
i sprawdzić jak zalogować się do naszej aplikacji.
W związku z czym istotne jest to, aby pamiętać, że jeżeli
zależy nam, aby zmienna środowiskowa znalazła się na frontend, musimy ją
poprzedzić właśnie takim ciągiem znaków next.
Podkreślił.
I mwi podkreślił.
Podłoga i koniecznie muszą to być zmienne.
W kapita Kasia czyli wielkimi literami.
W przeciwnym razie zostaną one usunięte i
tak naprawdę w naszym przypadku nie musielibyśmy tego wystawiać na
zewnątrz, ponieważ nie jest to jakaś informacja bardzo newralgiczne.
Nie jest to też zbyt potrzebne naszemu użytkownikowi, ale jeśli
chcielibyśmy, to oczywiście możemy to zrobić w ten sposób.
To się przydaje przede wszystkim, jeżeli korzystamy z jakiś API na front endzie,
czyli będziemy korzystać z pewnych end pointów, które będziemy odpytywać np.
podczas stagnacji czy tego typu rzeczy.
Wtedy musimy koniecznie to poprzedzić.
To wszystko w tej lekcji.
W kolejnej lekcji omówię krótko
różne opcje konfiguracyjne na CSSa bazując na dokumentacji
i w kolejnym rozdziale zaczniemy faktyczną pracę nad projektem.
Zmiany wprowadzone w lekcji · 13 min
diff --git a/03/minipedia/nuxt.config.js b/03/minipedia/nuxt.config.js
index 55c18a5..fb200a0 100644
--- a/03/minipedia/nuxt.config.js
+++ b/03/minipedia/nuxt.config.js
@@ -35,9 +35,14 @@ export default {
// Modules: https://go.nuxtjs.dev/config-modules
modules: [
// https://go.nuxtjs.dev/axios
- '@nuxtjs/axios'
+ '@nuxtjs/axios',
+ 'nuxt-basic-auth-module'
],
-
+ basic: {
+ name: process.env.USERNAME,
+ pass: process.env.PASSWORD,
+ enabled: process.env.BASIC_ENABLED === 'true' // require boolean value(nullable)
+ },
// Axios module configuration: https://go.nuxtjs.dev/config-axios
axios: {},
diff --git a/03/minipedia/package-lock.json b/03/minipedia/package-lock.json
index 609e072..f08991e 100644
--- a/03/minipedia/package-lock.json
+++ b/03/minipedia/package-lock.json
@@ -2893,6 +2893,14 @@
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
+ "basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
"big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -7601,6 +7609,15 @@
"@nuxt/webpack": "2.15.4"
}
},
+ "nuxt-basic-auth-module": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/nuxt-basic-auth-module/-/nuxt-basic-auth-module-1.4.0.tgz",
+ "integrity": "sha512-5sX5otn6mRoX60wdf+UvXi0XKN1kAfE74UvQBXXf4Yez+qReG5HU8xQLZljeJ6Cy38hH6DMbE36gkfMz3xrChg==",
+ "requires": {
+ "basic-auth": "^2.0.1",
+ "consola": "^2.3.2"
+ }
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
diff --git a/03/minipedia/package.json b/03/minipedia/package.json
index 66fbf38..61f3c2d 100644
--- a/03/minipedia/package.json
+++ b/03/minipedia/package.json
@@ -13,7 +13,8 @@
"dependencies": {
"@nuxtjs/axios": "^5.13.1",
"core-js": "^3.9.1",
- "nuxt": "^2.15.3"
+ "nuxt": "^2.15.3",
+ "nuxt-basic-auth-module": "^1.4.0"
},
"devDependencies": {
"@nuxtjs/eslint-config": "^6.0.0",
diff --git a/03/minipedia/pages/please-login.vue b/03/minipedia/pages/please-login.vue
index 195f108..c4f1c1b 100644
--- a/03/minipedia/pages/please-login.vue
+++ b/03/minipedia/pages/please-login.vue
@@ -3,7 +3,7 @@
<div>
<Logo />
<h1 class="title">
- Please log in
+ Welcome {{ username }}
</h1>
<div class="links">
<a
@@ -28,7 +28,13 @@
</template>
<script>
-export default {}
+export default {
+ computed: {
+ username() {
+ return process.env.NUXT_ENV_USERNAME;
+ }
+ }
+}
</script>
<style>