Skip to content

6. Beispiel [nuxt-03]: nuxtServerInit

Das Projekt [nuxt-03] zielt darauf ab, eine Funktion des Stores [Vuex] namens [nuxtServerInit] vorzustellen. Sie ermöglicht es dem Server, den Speicher [Vuex] zu initialisieren, so wie es die Funktion [fetch] tut. Im Gegensatz zur Funktion [fetch] wird die Funktion [nuxtServerInit] jedoch niemals vom Client ausgeführt.

Image

Das Projekt [nuxt-03] wird zunächst durch Kopieren des Projekts [nuxt-01] erstellt, aus dem die Seite [page2] aus dem Ordner [pages] und aus der Komponente [navigation] entfernt wird. Der Ordner [store] wird durch Kopieren des Ordners [nuxt-02/store] erstellt.

6.1. Der Store [Vuex]

Der Store [Vuex] wird durch die folgende Datei [store/index.js] implementiert:


/* eslint-disable no-console */
export const state = () => ({
  // Zähler
  counter: 0
})

export const mutations = {
  // Erhöhung des Zählers um einen Wert [inc]
  increment(state, inc) {
    state.counter += inc
  }
}

export const actions = {
  async nuxtServerInit(store, context) {
    // Wer führt diesen Code aus?
    console.log('nuxtServerInit, client=', process.client, 'serveur=', process.server)
    // Wir warten auf das Ende eines Promises
    await new Promise(function(resolve, reject) {
      // Normalerweise gibt es hier eine asynchrone Funktion
      // man simuliert sie mit einer Wartezeit von einer Sekunde
      setTimeout(() => {
        // Erfolg
        resolve()
      }, 1000)
    })
    // Der Speicher wird geändert
    store.commit('increment', 34)
    // Protokoll
    console.log('nuxtServerInit commit terminé')
  }
}
  • Zeilen 1–12: entsprechen denen im Projekt [nuxt-02];
  • Zeilen 14–32: Es wird ein Objekt [actions] exportiert. Dies ist ein reservierter Begriff aus dem Store von [Vuex];
  • Zeile 15: Die Funktion [nuxtServerInit] wird definiert. Diese wird beim Start der Anwendung vom Server ausgeführt. Ihre übliche Aufgabe besteht darin, einen Store [Vuex] mithilfe externer Daten zu initialisieren, die über eine asynchrone Funktion abgerufen wurden. [nuxt] wartet, bis diese Funktion ihre Ergebnisse zurückgibt, bevor der Lebenszyklus der angeforderten Seite gestartet wird. Die Funktion erhält zwei Parameter:
    • den zu initialisierenden Speicher [Vuex];
    • den aktuellen Kontext [nuxt];
  • Zeilen 19–26: Es wird auf das Ende der asynchronen Aktion gewartet, hier eine künstliche Wartezeit von einer Sekunde (Zeile 15);
  • Zeile 28: Dem Zähler wird der Wert 34 zugewiesen;
  • Zeilen 17 und 30: Log-Einträge zur Verfolgung des Ablaufs der Funktion [nuxtServerInit];

6.2. Die Seite [index]

Die Seite [index] sieht wie folgt aus:


<!-- Seite [index] -->
<template>
  <Layout :left="true" :right="true">
    <!-- Navigation -->
    <Navigation slot="left" />
    <!-- Meldung-->
    <b-alert slot="right" show variant="warning"> Home - value= {{ value }} </b-alert>
  </Layout>
</template>

<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */

import Layout from '@/components/layout'
import Navigation from '@/components/navigation'
export default {
  name: 'Home',
  // verwendete Komponenten
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // Lebenszyklus
  beforeCreate() {
    // Client und Server
    console.log('[home beforeCreate]')
  },
  created() {
    // Client und Server
    this.value = this.$store.state.counter
    console.log('[home created], value=', this.value)
  },
  beforeMount() {
    // nur Client
    console.log('[home beforeMount]')
  },
  mounted() {
    // nur Client
    console.log('[home mounted]')
  }
}
</script>
  • Zeile 37: Der von der Funktion [nuxtServerInit] initialisierte Zählerwert wird der Eigenschaft [value] aus Zeile 27 zugewiesen. Dieser Wert wird in Zeile 7 angezeigt;
  • Zeile 37 wird sowohl vom Server als auch vom Client ausgeführt. In beiden Fällen erhält die Eigenschaft [value] denselben Wert, wodurch sichergestellt wird, dass die vom Server generierte Seite mit der vom Client generierten Seite identisch ist;

6.3. Die Seite [page1]

Die Seite [page1] wird durch Kopieren der Seite [index] erstellt. Anschließend wird ihr Text so geändert, dass [home] durch [page1] ersetzt wird:


<!-- Seite [[page1]] -->
<template>
  <Layout :left="true" :right="true">
    <!-- Navigation -->
    <Navigation slot="left" />
    <!-- Meldung-->
    <b-alert slot="right" show variant="warning"> Page1 - value= {{ value }} </b-alert>
  </Layout>
</template>

<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */

import Layout from '@/components/layout'
import Navigation from '@/components/navigation'

export default {
  name: 'Page1',
  // verwendete Komponenten
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // Lebenszyklus
  beforeCreate() {
    // Client und Server
    console.log('[page1 beforeCreate]')
  },
  created() {
    // Client und Server
    this.value = this.$store.state.counter
    console.log('[page1 created], value=', this.value)
  },
  beforeMount() {
    // nur Client
    console.log('[page1 beforeMount]')
  },
  mounted() {
    // nur Client
    console.log('[page1 mounted]')
  }
}
</script>

Diese Seite dient lediglich dazu, die Navigation zwischen zwei Seiten zu ermöglichen.

6.4. Exécution

Die Datei „[nuxt.config.js]“ wird wie folgt geändert:


// Quellcode-Verzeichnis
  srcDir: 'nuxt-03',
  // Router
  router: {
    // Stammverzeichnis der Anwendung URL
    base: '/nuxt-03/'
  },
  // Server
  server: {
    // Dienstport, standardmäßig 3000
    port: 81,
    // Abgehörte Netzwerkadressen, standardmäßig localhost: 127.0.0.1
    // 0.0.0.0 = alle Netzwerkadressen des Rechners
    host: 'localhost'
}

Die bei der Ausführung angezeigte Seite sieht dann wie folgt aus:

Image

  • In [5] ist zu sehen, dass die Funktion [nuxtServerInit] vom Server vor dem Lebenszyklus der Seite [index] ausgeführt wurde. [nuxt] hat gewartet, bis die asynchrone Funktion ihre Arbeit beendet hatte, bevor der Lebenszyklus fortgesetzt wurde;
  • In [4] ist zu sehen, dass der Client die Funktion [nuxtServerInit] nicht ausgeführt hat;

Navigieren wir nun zweimal: Index --> Seite 1 --> Index. Die Protokolle lauten dann wie folgt:

Image

  • In [1-2] sieht man, dass die Funktion [nuxtServerInit] vom Client nicht ausgeführt wird;

Geben wir nun die URL „URL“ von der Seite „[page1]“ manuell ein, um einen Aufruf an den Server zu erzwingen:

Image

In [3-4] finden wir denselben Mechanismus wieder, der dem Laden der Seite [index] beim Start vorausging. An dieser Stelle sei noch einmal daran erinnert, was bereits gesagt wurde: Wenn man den Aufruf einer Seite beim Server erzwingt, läuft alles so ab, als würde die Anwendung mit einer Startseite neu starten, bei der es sich um die angeforderte Seite handelt;