10. Приклад [nuxt-07]: контексти клієнта та сервера
10.1. Présentation
Приклад [nuxt-07] має на меті дослідити об’єкт [context] як на стороні сервера, так і на стороні клієнта. Не слід забувати, що ці два учасники додатків [nuxt] є відокремленими: вони нічого не мають спільного, крім:
- те, що сервер готовий надіслати клієнту (у відповіді HTTP та надісланій сторінці);
- те, що клієнт готовий надіслати серверу (у своєму запиті HTTP);
Отже, якщо, як ми побачимо, об’єкти, з якими працює сервер, та ті, з якими працює клієнт, мають однакову назву, вони не є ідентичними: іноді вони можуть бути копіями один одного, але ніколи не мають однакового посилання. Зміна об’єкта на стороні клієнта ніяк не впливає на об’єкт з такою самою назвою на стороні сервера, і навпаки.
Приклад [nuxt-07] спочатку отримано шляхом копіювання прикладу [nuxt-01]:

- у [2] ми додамо плагін, спільний для клієнта та сервера;
- у [3] ми дещо змінимо сторінку [index];
10.2. Плагін [common / main.js]
Плагін [common / main.js] виконується як клієнтом, так і сервером: це зумовлено наступною конфігурацією [nuxt.config.js]:
/*
** Plugins to load before mounting the App
*/
plugins: [{ src: '~/plugins/common/main.js' }],
- рядок 4: відсутність властивості [mode] призводить до того, що плагін [~/plugins/common/main.js] виконуватиметься як на клієнті, так і на сервері: спочатку на сервері, потім на клієнті;
Цей плагін матиме такий вигляд:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// хто виконує цей код?
console.log('[main server], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const main = '[main ' + who + ']'
// кількість аргументів
console.log(main + ', il y a', args.length, 'arguments')
// перший аргумент
const context = args[0]
// ключі контексту
dumpkeys(main + ', context', context)
// додаток
dumpkeys(main + ', context.app', context.app)
// маршрут
dumpkeys(main + ', context.route', context.route)
console.log(main + ', context.route=', context.route)
// маршрутизатор
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)
// другий аргумент
const inject = args[1]
console.log('inject=', typeof inject)
}
function dumpkeys(message, object) {
// список ключів [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// список ключів
if (object) {
console.log(Object.keys(object))
}
}
- рядки 31–39: функція [dumpkeys] виводить список властивостей об’єкта, переданого як другий параметр. Цьому списку передує повідомлення, передане як перший параметр;
- рядок 3: ми хочемо дізнатися, скільки аргументів отримує функція. Для цього використовуємо запис [...args], який призведе до того, що фактичні параметри функції будуть поміщені в масив [args]. Ми побачимо, що є два аргументи;
- рядок 5: виводимо, хто виконує код — сервер чи клієнт;
- рядок 6: виконавець коду — клієнт чи сервер;
- рядок 7: константа у вигляді рядка символів, що використовується в логах;
- рядок 12: ми побачимо, що першим аргументом, який отримує плагін, є контекст виконавця;
- рядок 14: список ключів об’єкта [context];
- рядок 16: ми побачимо, що об’єкт [context] має властивість [app], яка представляє додаток [nuxt];
- рядок 18: ми побачимо, що об’єкт [context] має властивість [route], яка представляє поточний маршрут маршрутизатора;
- рядок 21: ми побачимо, що об’єкт [app] має властивість [router], яка представляє маршрутизатор;
- рядок 23: об’єкт [router.options.routes] представляє різні маршрути додатка;
- рядки 27–28: другим аргументом плагіна є функція [inject], яку ми використовували у прикладі [nuxt-06];
10.3. Плагін, що виконується сервером
Під час виконання сервер виводить таке:
- рядки 11–12: ми вже мали нагоду використовувати властивості [base] та [env], значення яких беруться з файлу [nuxt.config.js];
- рядок 8: властивість [app] позначає додаток [nuxt];
- рядок 18: властивість [route] позначає поточний маршрут маршрутизатора, тобто сторінку, яку надішле сервер;
- рядок 13: запит HTTP від браузера клієнта;
- рядок 14: відповідь HTTP від сервера;
Список властивостей [context.app] такий:
- рядок 3: властивість [router] надає нам доступ до маршрутизатора додатка. Це важливо в контексті [nuxt], оскільки маршрутизатор визначається самим [nuxt], а не розробником. Ця властивість надає розробнику можливість змінювати маршрутизатор;
Список властивостей [context.route] такий:
Маршрут [context.route] під час запуску сервера є таким:
- рядок 2: бачимо, що наступною сторінкою сервера є [index], а її шлях — [/] (рядок 10);
- рядок 22: властивість [meta] дозволяє додавати властивості до маршрутів;
Властивості маршрутизатора [context.app.router] сервера такі:
У властивості [context.app.router.options.routes] містяться різні маршрути додатка:
І нарешті другий аргумент:
10.4. Сторінка [index] на сервері
Сторінка [index] виглядає так:
<!-- головна сторінка -->
<template>
<Layout :left="true" :right="true">
<!-- навігація -->
<Navigation slot="left" />
<!-- повідомлення-->
<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',
// використані компоненти
components: {
Layout,
Navigation
},
data() {
return {
who: process.server ? 'server' : 'client'
}
},
// життєвий цикл
beforeCreate() {
// клієнт і сервер
console.log('[home beforeCreate]')
},
created() {
// клієнт і сервер
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() {
// тільки клієнт
console.log('[home ' + this.who + ' beforeMount]')
},
mounted() {
// тільки клієнт
console.log('[home ' + this.who + ' mounted]')
},
methods: {
dumpkeys(message, object) {
// список ключів [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
if (object) {
console.log(Object.keys(object))
}
}
}
}
</script>
- рядок 43: ми вже бачили, що контекст сторінки можна знайти в [this.$nuxt.context];
- рядок 42: також відображаються властивості об’єкта [this.$nuxt];
Ця сторінка, виконана сервером, генерує такі журнали:
Властивості контексту сервера на сторінці [index] такі:
Це ті самі властивості, що й в об’єкті [context] плагіна.
10.5. Плагін, що виконується клієнтом
Після того як сервер надіслав сторінку [index] до браузера клієнта, управління переходить до клієнтських скриптів. Після цього виконується плагін [main.js]. Ось такі записи у журналі:
Ми бачимо властивості, аналогічні тим, що були на стороні сервера, причому деякі властивості зникли, а інші з’явилися. Так, у рядку 4 відсутні властивості [req, res], які відповідали запитам HTTP з боку клієнтського браузера та відповіді HTTP з боку сервера.
10.6. Сторінка [index] на стороні клієнта
Сторінка клієнта [index] генерує такі журнали:
- рядок 4: властивості об’єкта [this.$nuxt]. Це багатофункціональний об’єкт із 51 властивістю;
- рядок 6: властивості об’єкта [this.$nuxt.context]. Тут містяться ті самі властивості, що й в об’єкті [context] клієнтського плагіна;