10. Voorbeeld [nuxt-07]: de client- en servercontexten
10.1. Présentation
Het voorbeeld [nuxt-07] is bedoeld om het object [context] zowel aan de serverzijde als aan de clientzijde te verkennen. Vergeet niet dat deze twee actoren in de [nuxt]-toepassingen gescheiden zijn: ze delen niets, behalve:
- wat de server bereid is naar de client te sturen (in het antwoord HTTP en de verzonden pagina);
- wat de client bereid is naar de server te sturen (in zijn verzoek HTTP);
Als dus, zoals we zullen zien, de objecten die door de server worden beheerd en die welke door de client worden beheerd dezelfde naam dragen, zijn ze niet identiek: ze kunnen soms kopieën van elkaar zijn, maar hebben nooit dezelfde referentie. Het wijzigen van een clientobject heeft geen enkel effect op het object met dezelfde naam aan de serverzijde, en vice versa.
Het voorbeeld [nuxt-07] wordt aanvankelijk verkregen door het voorbeeld [nuxt-01] te kopiëren:

- in [2] voegen we een plug-in toe die zowel op de client als op de server wordt gebruikt;
- in [3] gaan we de pagina [index] enigszins aanpassen;
10.2. De plug-in [common / main.js]
De plug-in [common / main.js] wordt zowel door de client als door de server uitgevoerd: dit komt door de volgende configuratie [nuxt.config.js]:
/*
** Plugins to load before mounting the App
*/
plugins: [{ src: '~/plugins/common/main.js' }],
- regel 4: doordat de eigenschap [mode] ontbreekt, wordt de plug-in [~/plugins/common/main.js] zowel door de client als door de server uitgevoerd: eerst door de server, daarna door de client;
Deze plug-in is de volgende:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// wie voert deze code uit?
console.log('[main server], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const main = '[main ' + who + ']'
// aantal argumenten
console.log(main + ', il y a', args.length, 'arguments')
// eerste argument
const context = args[0]
// context-sleutels
dumpkeys(main + ', context', context)
// de applicatie
dumpkeys(main + ', context.app', context.app)
// de route
dumpkeys(main + ', context.route', context.route)
console.log(main + ', context.route=', context.route)
// de router
dumpkeys(main + ', context.app.router', context.app.router)
// de 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)
// tweede argument
const inject = args[1]
console.log('inject=', typeof inject)
}
function dumpkeys(message, object) {
// lijst met sleutels van [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// lijst met sleutels
if (object) {
console.log(Object.keys(object))
}
}
- regels 31-39: de functie [dumpkeys] somt de eigenschappen op van het object dat als tweede parameter wordt doorgegeven. Deze lijst wordt voorafgegaan door het bericht dat als eerste parameter wordt doorgegeven;
- regel 3: we willen weten hoeveel argumenten de functie ontvangt. Hiervoor gebruiken we de notatie [...args], waardoor de daadwerkelijke parameters van de functie in de array [args] worden geplaatst. We zullen ontdekken dat er twee argumenten zijn;
- regel 5: we geven weer wie de code uitvoert, de server of de client;
- regel 6: de uitvoerder van de code, client of server;
- regel 7: een constante tekenreeks die in de logbestanden wordt gebruikt;
- regel 12: we zullen zien dat het eerste argument dat de plug-in ontvangt de context van de uitvoerder is;
- regel 14: lijst met sleutels van het object [context];
- regel 16: we zullen ontdekken dat het object [context] een eigenschap [app] heeft die de applicatie [nuxt] vertegenwoordigt;
- regel 18: we zullen ontdekken dat het object [context] een eigenschap [route] heeft die het huidige pad van de router vertegenwoordigt;
- regel 21: we zullen zien dat het object [app] een eigenschap [router] heeft die de router vertegenwoordigt;
- regel 23: het object [router.options.routes] vertegenwoordigt de verschillende routes van de applicatie;
- regels 27-28: het tweede argument van de plug-in is de functie [inject] die we in het voorbeeld [nuxt-06] hebben gebruikt;
10.3. De door de server uitgevoerde plug-in
Bij uitvoering geeft de server het volgende weer:
- regels 11-12: we hebben al eerder gebruikgemaakt van de eigenschappen [base] en [env], waarvan de waarden afkomstig zijn uit het bestand [nuxt.config.js];
- regel 8: de eigenschap [app] verwijst naar de toepassing [nuxt];
- regel 18: de eigenschap [route] verwijst naar de huidige route van de router, d.w.z. de pagina die de server gaat verzenden;
- regel 13: het verzoek HTTP van de clientbrowser;
- regel 14: het antwoord HTTP van de server;
De lijst met eigenschappen van [context.app] is als volgt:
- regel 3: de eigenschap [router] geeft ons toegang tot de router van de applicatie. Dit is belangrijk onder [nuxt], aangezien de router wordt gedefinieerd door [nuxt] zelf en niet door de ontwikkelaar. Deze eigenschap biedt de ontwikkelaar de mogelijkheid om de router aan te passen;
De lijst met eigenschappen van [context.route] is als volgt:
De route [context.route] bij het opstarten van de server is als volgt:
- regel 2: we zien dat de volgende pagina van de server [index] is en dat het pad ervan [/] is (regel 10);
- regel 22: met de eigenschap [meta] kunnen eigenschappen aan routes worden toegevoegd;
De eigenschappen van de router [context.app.router] van de server zijn als volgt:
In de eigenschap [context.app.router.options.routes] zijn de verschillende routes van de applicatie te vinden:
Tot slot het tweede argument:
10.4. De pagina [index] op de server
De pagina [index] ziet er als volgt uit:
<!-- hoofdpagina -->
<template>
<Layout :left="true" :right="true">
<!-- navigatie -->
<Navigation slot="left" />
<!-- bericht-->
<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',
// gebruikte componenten
components: {
Layout,
Navigation
},
data() {
return {
who: process.server ? 'server' : 'client'
}
},
// levenscyclus
beforeCreate() {
// client en server
console.log('[home beforeCreate]')
},
created() {
// client en 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() {
// alleen client
console.log('[home ' + this.who + ' beforeMount]')
},
mounted() {
// alleen client
console.log('[home ' + this.who + ' mounted]')
},
methods: {
dumpkeys(message, object) {
// lijst met sleutels van [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
if (object) {
console.log(Object.keys(object))
}
}
}
}
</script>
- regel 43: we hebben al gezien dat de context van een pagina te vinden is in [this.$nuxt.context];
- regel 42: ook de eigenschappen van het object [this.$nuxt] worden weergegeven;
Deze pagina wordt door de server uitgevoerd en genereert de volgende logbestanden:
De eigenschappen van de servercontext in de pagina [index] zijn als volgt:
Dit zijn dezelfde eigenschappen als in het object [context] van de plug-in.
10.5. De door de client uitgevoerde plug-in
Zodra de server de pagina [index] naar de browser van de klant heeft verzonden, nemen de clientscripts het over. De plug-in [main.js] wordt dan uitgevoerd. Dit zijn de logbestanden:
We zien eigenschappen die vergelijkbaar zijn met die aan de serverzijde, waarbij sommige eigenschappen zijn verdwenen en andere zijn bijgekomen. Zo ontbreken in regel 4 de eigenschappen [req, res], die de verzoeken HTTP van de clientbrowser en het antwoord HTTP van de server waren.
10.6. De pagina [index] van de client
De pagina [index] van de client genereert de volgende logbestanden:
- regel 4: de eigenschappen van het object [this.$nuxt]. Dit is een uitgebreid object met 51 eigenschappen;
- regel 6: de eigenschappen van het object [this.$nuxt.context]. We zien hier dezelfde eigenschappen als in het object [context] van de client-plugin;