10. Beispiel [nuxt-07]: Client- und Serverkontexte
10.1. Présentation
Das Beispiel [nuxt-07] dient dazu, das Objekt [context] sowohl auf der Server- als auch auf der Client-Seite zu untersuchen. Es ist zu beachten, dass diese beiden Akteure der [nuxt]-Anwendungen voneinander getrennt sind: Sie teilen nichts miteinander, außer:
- das, was der Server bereit ist, an den Client zu senden (in der Antwort HTTP und der gesendeten Seite);
- das, was der Client bereit ist, an den Server zu senden (in seiner Anfrage HTTP);
Wenn also, wie wir noch sehen werden, die vom Server und die vom Client bearbeiteten Objekte denselben Namen tragen, sind sie nicht identisch: Sie können manchmal Kopien voneinander sein, haben aber niemals dieselbe Referenz. Das Ändern eines Client-Objekts hat keinerlei Auswirkungen auf das gleichnamige Objekt auf der Serverseite und umgekehrt.
Das Beispiel [nuxt-07] wird zunächst durch Kopieren des Beispiels [nuxt-01] erstellt:

- zu [2]. Wir fügen ein Plugin hinzu, das sowohl auf dem Client als auch auf dem Server vorhanden ist;
- in [3] werden wir die Seite [index] etwas ändern;
10.2. Das Plugin [common / main.js]
Das Plugin [common / main.js] wird sowohl vom Client als auch vom Server ausgeführt: Dies ist auf die folgende Konfiguration [nuxt.config.js] zurückzuführen:
/*
** Plugins to load before mounting the App
*/
plugins: [{ src: '~/plugins/common/main.js' }],
- Zeile 4: Da die Eigenschaft [mode] fehlt, wird das Plugin [~/plugins/common/main.js] sowohl vom Client als auch vom Server ausgeführt: zuerst vom Server, dann vom Client;
Dieses Plugin lautet wie folgt:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// Wer führt diesen Code aus?
console.log('[main server], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const main = '[main ' + who + ']'
// Anzahl der Argumente
console.log(main + ', il y a', args.length, 'arguments')
// 1. Argument
const context = args[0]
// Kontextschlüssel
dumpkeys(main + ', context', context)
// die Anwendung
dumpkeys(main + ', context.app', context.app)
// die Route
dumpkeys(main + ', context.route', context.route)
console.log(main + ', context.route=', context.route)
// der Router
dumpkeys(main + ', context.app.router', context.app.router)
// der 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)
// zweites Argument
const inject = args[1]
console.log('inject=', typeof inject)
}
function dumpkeys(message, object) {
// Liste der Schlüssel von [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// Liste der Schlüssel
if (object) {
console.log(Object.keys(object))
}
}
- Zeilen 31–39: Die Funktion [dumpkeys] listet die Eigenschaften des als zweiten Parameter übergebenen Objekts auf. Dieser Liste geht die als ersten Parameter übergebene Meldung voraus;
- Zeile 3: Wir möchten wissen, wie viele Argumente die Funktion erhält. Dazu verwenden wir die Notation [...args], wodurch die tatsächlichen Parameter der Funktion in das Array [args] gespeichert werden. Wir werden feststellen, dass es zwei Argumente gibt;
- Zeile 5: Es wird angezeigt, wer den Code ausführt – der Server oder der Client;
- Zeile 6: der Ausführer des Codes, Client oder Server;
- Zeile 7: eine in den Protokollen verwendete Zeichenfolgenkonstante;
- Zeile 12: Wir werden feststellen, dass das erste vom Plugin empfangene Argument der Kontext des Ausführenden ist;
- Zeile 14: Liste der Schlüssel des Objekts [context];
- Zeile 16: Wir werden feststellen, dass das Objekt [context] eine Eigenschaft [app] besitzt, die die Anwendung [nuxt] darstellt;
- Zeile 18: Wir werden feststellen, dass das Objekt [context] eine Eigenschaft [route] besitzt, die den aktuellen Pfad des Routers darstellt;
- Zeile 21: Wir werden feststellen, dass das Objekt [app] eine Eigenschaft [router] besitzt, die den Router repräsentiert;
- Zeile 23: Das Objekt [router.options.routes] repräsentiert die verschiedenen Routen der Anwendung;
- Zeilen 27–28: Das zweite Argument des Plugins ist die Funktion [inject], die wir im Beispiel [nuxt-06] verwendet haben;
10.3. Das vom Server ausgeführte Plugin
Bei der Ausführung zeigt der Server Folgendes an:
- Zeilen 11–12: Wir haben bereits die Eigenschaften [base] und [env] verwendet, deren Werte aus der Datei [nuxt.config.js] stammen;
- Zeile 8: Die Eigenschaft [app] bezeichnet die Anwendung [nuxt];
- Zeile 18: Die Eigenschaft [route] bezeichnet die aktuelle Route des Routers, d. h. die Seite, die der Server senden wird;
- Zeile 13: die Anfrage HTTP des Client-Browsers;
- Zeile 14: Die Antwort HTTP des Servers;
Die Liste der Eigenschaften von [context.app] lautet wie folgt:
- Zeile 3: Über die Eigenschaft [router] erhalten wir Zugriff auf den Router der Anwendung. Dies ist unter [nuxt] wichtig, da der Router durch [nuxt] selbst und nicht durch den Entwickler definiert wird. Diese Eigenschaft gewährt dem Entwickler Zugriff, um den Router zu ändern;
Die Liste der Eigenschaften von [context.route] lautet wie folgt:
Die Route [context.route] beim Start des Servers lautet wie folgt:
- Zeile 2: Man sieht, dass die nächste Seite des Servers [index] ist und dass ihr Pfad [/] lautet (Zeile 10);
- Zeile 22: Mit der Eigenschaft [meta] können den Routen Eigenschaften hinzugefügt werden;
Die Eigenschaften des Routers [context.app.router] des Servers lauten wie folgt:
In der Eigenschaft [context.app.router.options.routes] befinden sich die verschiedenen Routen der Anwendung:
Und schließlich das zweite Argument:
10.4. Die Seite [index] auf dem Server
Die Seite [index] sieht wie folgt aus:
<!-- Startseite -->
<template>
<Layout :left="true" :right="true">
<!-- Navigation -->
<Navigation slot="left" />
<!-- Meldung-->
<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',
// verwendete Komponenten
components: {
Layout,
Navigation
},
data() {
return {
who: process.server ? 'server' : 'client'
}
},
// Lebenszyklus
beforeCreate() {
// Client und Server
console.log('[home beforeCreate]')
},
created() {
// Client und Server
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() {
// nur Client
console.log('[home ' + this.who + ' beforeMount]')
},
mounted() {
// nur Client
console.log('[home ' + this.who + ' mounted]')
},
methods: {
dumpkeys(message, object) {
// Schlüsselliste von [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
if (object) {
console.log(Object.keys(object))
}
}
}
}
</script>
- Zeile 43: Wir haben bereits gesehen, dass der Kontext einer Seite in [this.$nuxt.context] zu finden ist;
- Zeile 42: Außerdem werden die Eigenschaften des Objekts [this.$nuxt] angezeigt;
Diese vom Server ausgeführte Seite erzeugt die folgenden Protokolle:
Die Eigenschaften des Serverkontexts auf der Seite [index] lauten wie folgt:
Dies sind dieselben Eigenschaften wie im Objekt [context] des Plugins.
10.5. Das vom Client ausgeführte Plugin
Sobald der Server die Seite [index] an den Client-Browser gesendet hat, übernehmen die Client-Skripte die Kontrolle. Das Plugin [main.js] wird dann ausgeführt. Die folgenden Protokolle werden dabei erzeugt:
Es lassen sich ähnliche Eigenschaften wie auf der Serverseite feststellen, wobei einige Eigenschaften verschwunden sind und andere hinzugekommen sind. So fehlen in Zeile 4 die Eigenschaften [req, res], bei denen es sich um die Anfragen HTTP des Client-Browsers und die Antwort HTTP des Servers handelte.
10.6. Die Seite [index] auf der Client-Seite
Die Seite [index] des Clients erzeugt die folgenden Protokolle:
- Zeile 4: die Eigenschaften des Objekts [this.$nuxt]. Es handelt sich um ein umfangreiches Objekt mit 51 Eigenschaften;
- Zeile 6: die Eigenschaften des Objekts [this.$nuxt.context]. Hier finden sich dieselben Eigenschaften wie im Objekt [context] des Client-Plugins;