10. [nuxt-07] örneği: istemci ve sunucu bağlamları
10.1. Présentation
[nuxt-07] örneği, [context] nesnesini hem sunucu hem de istemci tarafında incelemek amacıyla hazırlanmıştır. [nuxt] uygulamalarının bu iki aktörünün birbirinden ayrı olduğunu unutmamak gerekir: Aşağıdakiler dışında hiçbir şeyi paylaşmazlar:
- sunucunun istemciye göndermek istediği bilgiler (HTTP yanıtında ve gönderilen sayfada);
- istemcinin sunucuya göndermek istediği bilgiler (HTTP isteğinde);
Dolayısıyla, birazdan göreceğimiz gibi, sunucu tarafından işlenen nesneler ile istemci tarafından işlenen nesneler aynı adı taşıyor olsa da, bunlar aynı değildir: bazen birbirlerinin kopyaları olabilirler, ancak hiçbir zaman aynı referansa sahip olmazlar. Bir istemci nesnesini değiştirmek, sunucu tarafındaki aynı isimli nesne üzerinde hiçbir etki yaratmaz ve bunun tersi de geçerlidir.
[nuxt-07] örneği, başlangıçta [nuxt-01] örneğinin kopyalanmasıyla elde edilir:

- [2]'e, istemci ve sunucuya ortak bir eklenti ekleyeceğiz;
- [3]'te, [index] sayfasını biraz değiştireceğiz;
10.2. [common / main.js] eklentisi
[common / main.js] eklentisi hem istemci hem de sunucu tarafından çalıştırılır: bunun nedeni aşağıdaki [nuxt.config.js] yapılandırmasıdır:
/*
** Plugins to load before mounting the App
*/
plugins: [{ src: '~/plugins/common/main.js' }],
- 4. satır: [mode] özelliğinin bulunmaması, [~/plugins/common/main.js] eklentisinin hem istemci hem de sunucu tarafından çalıştırılmasına neden olur: önce sunucu, ardından istemci;
Bu eklenti şu şekilde olacaktır:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// bu kodu kim çalıştırıyor?
console.log('[main server], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const main = '[main ' + who + ']'
// argüman sayısı
console.log(main + ', il y a', args.length, 'arguments')
// 1. argüman
const context = args[0]
// bağlam anahtarları
dumpkeys(main + ', context', context)
// uygulama
dumpkeys(main + ', context.app', context.app)
// yol
dumpkeys(main + ', context.route', context.route)
console.log(main + ', context.route=', context.route)
// yönlendirici
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)
// 2. argüman
const inject = args[1]
console.log('inject=', typeof inject)
}
function dumpkeys(message, object) {
// [object] anahtar listesi
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// anahtar listesi
if (object) {
console.log(Object.keys(object))
}
}
- 31-39. satırlar: [dumpkeys] işlevi, ikinci parametre olarak geçirilen nesnenin özelliklerini listeler. Bu listenin başında, birinci parametre olarak geçirilen mesaj yer alır;
- 3. satır: işlevin kaç argüman aldığını öğrenmek istiyoruz. Bunun için [...args] notasyonunu kullanıyoruz; bu, işlevin gerçek parametrelerini [args] tablosuna yerleştirir. İki argüman olduğunu göreceğiz;
- 5. satır: Kodu kimin yürüttüğünü (sunucu mu yoksa istemci mi) gösterir;
- 6. satır: kodun yürütücüsü, istemci mi yoksa sunucu mu;
- 7. satır: günlüklerde kullanılan sabit bir karakter dizisi;
- 12. satır: Eklentinin aldığı ilk argümanın, çalıştıranın bağlamı olduğunu göreceğiz;
- 14. satır: [context] nesnesinin anahtar listesi;
- 16. satır: [context] nesnesinin, [nuxt] uygulamasını temsil eden [app] özelliğine sahip olduğunu göreceğiz;
- 18. satır: [context] nesnesinin, yönlendiricinin geçerli yolunu temsil eden [route] adlı bir özelliğe sahip olduğunu göreceğiz;
- 21. satır: [app] nesnesinin, yönlendiriciyi temsil eden [router] özelliğine sahip olduğunu göreceğiz;
- 23. satır: [router.options.routes] nesnesi, uygulamanın farklı rotalarını temsil eder;
- 27-28. satırlar: Eklentinin ikinci argümanı, [nuxt-06] örneğinde kullandığımız [inject] işlevidir;
10.3. Sunucu tarafından çalıştırılan eklenti
Çalıştırıldığında, sunucu aşağıdakini görüntüler:
- 11-12. satırlar: Değerleri [nuxt.config.js] dosyasından alınan [base] ve [env] özelliklerini daha önce kullanma fırsatımız olmuştu;
- 8. satır: [app] özelliği, [nuxt] uygulamasını belirtir;
- 18. satır: [route] özelliği, yönlendiricinin geçerli yolunu, yani sunucunun göndereceği sayfayı belirtir;
- 13. satır: İstemci tarayıcısından gelen HTTP isteği;
- 14. satır: sunucunun HTTP yanıtı;
[context.app]'in özellik listesi şöyledir:
- satır 3: [router] özelliği, bize uygulamanın yönlendiricisine erişim sağlar. Bu, [nuxt] altında önemlidir; çünkü yönlendirici, geliştirici tarafından değil, [nuxt] tarafından tanımlanmıştır. Bu özellik, geliştiriciye yönlendiriciyi değiştirebilmesi için verilen bir erişimdir;
[context.route]'in özellik listesi şöyledir:
Sunucunun başlatılması sırasında [context.route] rotası şöyledir:
- 2. satır: Sunucunun bir sonraki sayfasının [index] olduğu ve yolunun [/] (10. satır) olduğu görülmektedir;
- 22. satır: [meta] özelliği, rotalara özellikler eklenmesine olanak tanır;
Sunucudaki [context.app.router] yönlendiricisinin özellikleri şunlardır:
Uygulamanın çeşitli rotaları [context.app.router.options.routes] özelliğinde bulunur:
Son olarak ikinci argüman:
10.4. Sunucudaki [index] sayfası
[index] sayfası şöyledir:
<!-- ana sayfa -->
<template>
<Layout :left="true" :right="true">
<!-- navigasyon -->
<Navigation slot="left" />
<!-- mesaj-->
<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',
// kullanılan bileşenler
components: {
Layout,
Navigation
},
data() {
return {
who: process.server ? 'server' : 'client'
}
},
// yaşam döngüsü
beforeCreate() {
// istemci ve sunucu
console.log('[home beforeCreate]')
},
created() {
// istemci ve sunucu
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() {
// sadece istemci
console.log('[home ' + this.who + ' beforeMount]')
},
mounted() {
// sadece istemci
console.log('[home ' + this.who + ' mounted]')
},
methods: {
dumpkeys(message, object) {
// [object] anahtar listesi
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
if (object) {
console.log(Object.keys(object))
}
}
}
}
</script>
- 43. satır: Bir sayfanın bağlamının [this.$nuxt.context]'te bulunabileceğini daha önce görmüştük;
- 42. satır: [this.$nuxt] nesnesinin özellikleri de görüntülenir;
Sunucu tarafından çalıştırılan bu sayfa, aşağıdaki günlükleri oluşturur:
[index] sayfasındaki sunucu bağlamının özellikleri şunlardır:
Bunlar, eklentideki [context] nesnesindeki özelliklerin aynısıdır.
10.5. İstemci tarafından çalıştırılan eklenti
Sunucu, [index] sayfasını istemci tarayıcısına gönderdikten sonra, iş istemci komut dosyalarına geçer. Ardından [main.js] eklentisi çalıştırılır. Bu günlükler şunlardır:
Sunucu tarafında bulunanlara benzer özellikler görülür; ancak bazı özellikler kaybolmuş, bazıları ise ortaya çıkmıştır. Örneğin 4. satırda, istemci tarayıcısının HTTP istekleri ve sunucunun HTTP yanıtı olan [req, res] özellikleri bulunmamaktadır.
10.6. İstemcinin [index] sayfası
İstemcinin [index] sayfası şu günlükleri üretir:
- 4. satır: [this.$nuxt] nesnesinin özellikleri. Bu, 51 özelliğe sahip zengin bir nesnedir;
- 6. satır: [this.$nuxt.context] nesnesinin özellikleri. Burada, istemci eklentisinin [context] nesnesindekilerle aynı özellikler bulunur;