10. Przykład [nuxt-07]: konteksty klienta i serwera
10.1. Présentation
Przykład [nuxt-07] ma na celu zbadanie obiektu [context] zarówno po stronie serwera, jak i po stronie klienta. Należy pamiętać, że te dwa podmioty w aplikacjach [nuxt] są od siebie oddzielone: nie dzielą między sobą niczego poza tym,
- to, co serwer zechce wysłać do klienta (w odpowiedzi HTTP i wysłanej stronie);
- to, co klient zechce wysłać do serwera (w swoim żądaniu HTTP);
Jeśli więc, jak zobaczymy, obiekty przetwarzane przez serwer i te przetwarzane przez klienta noszą tę samą nazwę, nie są one identyczne: czasami mogą być kopiami siebie nawzajem, ale nigdy nie mają tego samego odwołania. Modyfikacja obiektu po stronie klienta nie ma żadnego wpływu na obiekt o tej samej nazwie po stronie serwera i odwrotnie.
Przykład [nuxt-07] uzyskano początkowo poprzez skopiowanie przykładu [nuxt-01]:

- do [2] dodamy wtyczkę wspólną dla klienta i serwera;
- w [3] wprowadzimy niewielkie zmiany w stronie [index];
10.2. Wtyczka [common / main.js]
Wtyczka [common / main.js] jest uruchamiana zarówno przez klienta, jak i serwer: wynika to z następującej konfiguracji [nuxt.config.js]:
/*
** Plugins to load before mounting the App
*/
plugins: [{ src: '~/plugins/common/main.js' }],
- wiersz 4: brak właściwości [mode] powoduje, że wtyczka [~/plugins/common/main.js] zostanie uruchomiona zarówno przez klienta, jak i serwer: najpierw przez serwer, a następnie przez klienta;
Wtyczka ta będzie miała następującą nazwę:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// kto wykonuje ten kod?
console.log('[main server], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const main = '[main ' + who + ']'
// liczba argumentów
console.log(main + ', il y a', args.length, 'arguments')
// pierwszy argument
const context = args[0]
// klucze kontekstu
dumpkeys(main + ', context', context)
// aplikacja
dumpkeys(main + ', context.app', context.app)
// trasa
dumpkeys(main + ', context.route', context.route)
console.log(main + ', context.route=', context.route)
// router
dumpkeys(main + ', context.app.router', context.app.router)
// router.options.routes
dumpkeys(main + ', context.app.router.options.routes', context.app.router.options.routes)
console.log(main + ', context.app.router.options.routes=', context.app.router.options.routes)
// drugi argument
const inject = args[1]
console.log('inject=', typeof inject)
}
function dumpkeys(message, object) {
// lista kluczy [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// lista kluczy
if (object) {
console.log(Object.keys(object))
}
}
- wiersze 31–39: funkcja [dumpkeys] wyświetla listę właściwości obiektu przekazanego jako drugi parametr. Lista ta jest poprzedzona komunikatem przekazanym jako pierwszy parametr;
- wiersz 3: chcemy sprawdzić, ile argumentów przyjmuje funkcja. W tym celu używamy notacji [...args], co spowoduje umieszczenie rzeczywistych parametrów funkcji w tablicy [args]. Okazuje się, że są dwa argumenty;
- wiersz 5: wyświetlamy, kto wykonuje kod – serwer czy klient;
- wiersz 6: podmiot wykonujący kod – klient lub serwer;
- wiersz 7: stała ciąg znaków używana w logach;
- wiersz 12: okaże się, że pierwszym argumentem otrzymanym przez wtyczkę jest kontekst podmiotu wykonującego;
- wiersz 14: lista kluczy obiektu [context];
- wiersz 16: okaże się, że obiekt [context] posiada właściwość [app], która reprezentuje aplikację [nuxt];
- wiersz 18: okaże się, że obiekt [context] posiada właściwość [route], która reprezentuje bieżącą trasę routera;
- wiersz 21: okaże się, że obiekt [app] posiada właściwość [router], która reprezentuje router;
- wiersz 23: obiekt [router.options.routes] reprezentuje różne trasy aplikacji;
- wiersze 27–28: drugim argumentem wtyczki jest funkcja [inject], której użyliśmy w przykładzie [nuxt-06];
10.3. Wtyczka uruchamiana przez serwer
Po uruchomieniu serwer wyświetla następujący komunikat:
- wiersze 11–12: mieliśmy już okazję korzystać z właściwości [base] i [env], których wartości pochodzą z pliku [nuxt.config.js];
- wiersz 8: właściwość [app] określa aplikację [nuxt];
- wiersz 18: właściwość [route] określa bieżącą trasę routera, tj. stronę, którą wyśle serwer;
- wiersz 13: żądanie HTTP z przeglądarki klienta;
- wiersz 14: odpowiedź serwera o numerze HTTP;
Lista właściwości [context.app] przedstawia się następująco:
- wiersz 3: właściwość [router] zapewnia dostęp do routera aplikacji. Jest to istotne w przypadku [nuxt], ponieważ router jest definiowany przez samą właściwość [nuxt], a nie przez programistę. Ta właściwość stanowi uprawnienie przyznane programiście do modyfikowania routera;
Lista właściwości [context.route] jest następująca:
Trasa [context.route] przy uruchomieniu serwera jest następująca:
- wiersz 2: widać, że następną stroną serwera jest [index], a jej ścieżka to [/] (wiersz 10);
- wiersz 22: właściwość [meta] umożliwia dodawanie właściwości do tras;
Właściwości routera [context.app.router] serwera są następujące:
W właściwości [context.app.router.options.routes] znajdują się różne trasy aplikacji:
Wreszcie drugi argument:
10.4. Strona [index] na serwerze
Strona [index] wygląda następująco:
<!-- strona główna -->
<template>
<Layout :left="true" :right="true">
<!-- nawigacja -->
<Navigation slot="left" />
<!-- komunikat-->
<b-alert slot="right" show variant="warning">
Home
</b-alert>
</Layout>
</template>
<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */
import Navigation from '@/components/navigation'
import Layout from '@/components/layout'
export default {
name: 'Home',
// używane komponenty
components: {
Layout,
Navigation
},
data() {
return {
who: process.server ? 'server' : 'client'
}
},
// cykl życia
beforeCreate() {
// klient i serwer
console.log('[home beforeCreate]')
},
created() {
// klient i serwer
console.log('[home ' + this.who + ' created]')
this.dumpkeys('[home ' + this.who + ' created], this.$nuxt', this.$nuxt)
this.dumpkeys('[home ' + this.who + ' created], this.$nuxt.context', this.$nuxt.context)
},
beforeMount() {
// tylko klient
console.log('[home ' + this.who + ' beforeMount]')
},
mounted() {
// tylko klient
console.log('[home ' + this.who + ' mounted]')
},
methods: {
dumpkeys(message, object) {
// lista kluczy z [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
if (object) {
console.log(Object.keys(object))
}
}
}
}
</script>
- wiersz 43: widzieliśmy już, że kontekst strony można znaleźć w [this.$nuxt.context];
- wiersz 42: wyświetlane są również właściwości obiektu [this.$nuxt];
Strona ta, po uruchomieniu przez serwer, generuje następujące logi:
Właściwości kontekstu serwera na stronie [index] są następujące:
Są to te same właściwości, co w obiekcie [context] wtyczki.
10.5. Wtyczka uruchamiana przez klienta
Gdy serwer wyśle stronę [index] do przeglądarki klienta, kontrolę przejmują skrypty klienckie. Następnie zostanie uruchomiona wtyczka [main.js]. Oto odpowiednie wpisy w dzienniku:
Widać tu właściwości podobne do tych po stronie serwera, przy czym niektóre właściwości zniknęły, a inne się pojawiły. Na przykład w wierszu 4 brakuje właściwości [req, res], które odpowiadały żądaniom HTTP z przeglądarki klienta oraz odpowiedzi HTTP z serwera.
10.6. Strona [index] po stronie klienta
Strona klienta o adresie [index] generuje następujące logi:
- wiersz 4: właściwości obiektu [this.$nuxt]. Jest to obiekt o bogatej strukturze, zawierający 51 właściwości;
- wiersz 6: właściwości obiektu [this.$nuxt.context]. Znajdują się tu te same właściwości, co w obiekcie [context] wtyczki klienta;