Skip to content

6. [nuxt-03] Örneği: nuxtServerInit

[nuxt-03] projesi, [Vuex] mağazasının [nuxtServerInit] adlı bir işlevini tanıtmayı amaçlamaktadır. Bu işlev, sunucunun [Vuex] depolama alanını, [fetch] işlevinin yaptığı gibi başlatmasına olanak tanır. Ancak [fetch] işlevinden farklı olarak, [nuxtServerInit] işlevi istemci tarafından hiçbir zaman yürütülmez.

Image

[nuxt-03] projesi, başlangıçta [nuxt-01] projesinin kopyalanmasıyla elde edilir; bu projeden, [pages] klasöründeki ve [navigation] bileşeninden kaldırılmıştır. [store] klasörü, [nuxt-02/store] klasörünün kopyalanmasıyla oluşturulmuştur.

6.1. [Vuex] mağaza

[Vuex] depolama alanı, aşağıdaki [store/index.js] dosyası ile uygulanacaktır:


/* eslint-disable no-console */
export const state = () => ({
  // sayaç
  counter: 0
})

export const mutations = {
  // sayaç bir birim artırılıyor [inc]
  increment(state, inc) {
    state.counter += inc
  }
}

export const actions = {
  async nuxtServerInit(store, context) {
    // bu kodu kim çalıştırıyor?
    console.log('nuxtServerInit, client=', process.client, 'serveur=', process.server)
    // bir sözün tamamlanmasını bekliyoruz
    await new Promise(function(resolve, reject) {
      // burada normalde asenkron bir işlev bulunur
      // bir saniye bekleyerek simüle ediyoruz
      setTimeout(() => {
        // başarılı
        resolve()
      }, 1000)
    })
    // depolama alanı değiştiriliyor
    store.commit('increment', 34)
    // günlük
    console.log('nuxtServerInit commit terminé')
  }
}
  • 1-12. satırlar: [nuxt-02] projesindekine benzerdir;
  • 14-32. satırlar: [actions] nesnesi dışa aktarılır. Bu, [Vuex] mağazasının ayrılmış bir terimidir;
  • 15. satır: [nuxtServerInit] işlevi tanımlanmaktadır. Bu işlev, uygulamanın başlatılması sırasında sunucu tarafından yürütülecektir. Bu fonksiyonun genel işlevi, asenkron bir fonksiyonla elde edilen harici veriler yardımıyla [Vuex] depolama alanını başlatmaktır. [nuxt], istenen sayfanın yaşam döngüsünü başlatmadan önce bu fonksiyonun sonuçlarını vermesini bekler. Fonksiyon iki parametre alır:
    • başlatılacak [Vuex] deposu;
    • o anki [nuxt] bağlamı;
  • 19-26. satırlar: asenkron işlemin bitmesi beklenir; burada bir saniyelik yapay bir bekleme vardır (15. satır);
  • 28. satır: sayaça 34 değeri verilir;
  • 17. ve 30. satırlar: [nuxtServerInit] işlevinin yürütülüşünü takip etmek için günlük kayıtları;

6.2. [index] sayfası

[index] sayfası şu şekilde olacaktır:


<!-- [index] sayfası -->
<template>
  <Layout :left="true" :right="true">
    <!-- gezinme -->
    <Navigation slot="left" />
    <!-- mesaj-->
    <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',
  // kullanılan bileşenler
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // yaşam döngüsü
  beforeCreate() {
    // istemci ve sunucu
    console.log('[home beforeCreate]')
  },
  created() {
    // istemci ve sunucu
    this.value = this.$store.state.counter
    console.log('[home created], value=', this.value)
  },
  beforeMount() {
    // sadece istemci
    console.log('[home beforeMount]')
  },
  mounted() {
    // sadece istemci
    console.log('[home mounted]')
  }
}
</script>
  • 37. satır: [nuxtServerInit] fonksiyonu tarafından başlatılan sayaç değeri, 27. satırdaki [value] özelliğine atanır. Bu değer 7. satırda görüntülenir;
  • 37. satır hem sunucu hem de istemci tarafından yürütülecektir. Her iki durumda da [value] özelliği aynı değeri alacaktır; bu da sunucu tarafından oluşturulan sayfanın, istemci tarafından oluşturulan sayfayla aynı olmasını sağlar;

6.3. [page1] sayfası

[page1] sayfası, [index] sayfasının kopyalanmasıyla elde edilir. Ardından, metni değiştirerek [home] ifadesini [page1] ile değiştiririz:


<!-- [[page1] sayfası] -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigasyon -->
    <Navigation slot="left" />
    <!-- mesaj-->
    <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',
  // kullanılan bileşenler
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // yaşam döngüsü
  beforeCreate() {
    // istemci ve sunucu
    console.log('[page1 beforeCreate]')
  },
  created() {
    // istemci ve sunucu
    this.value = this.$store.state.counter
    console.log('[page1 created], value=', this.value)
  },
  beforeMount() {
    // sadece istemci
    console.log('[page1 beforeMount]')
  },
  mounted() {
    // sadece istemci
    console.log('[page1 mounted]')
  }
}
</script>

Bu sayfa, yalnızca iki sayfa arasında gezinmeyi mümkün kılmak amacıyla bulunmaktadır.

6.4. Exécution

[nuxt.config.js] dosyası şu şekilde değiştirilir:


// kaynak kod dizini
  srcDir: 'nuxt-03',
  // yönlendirici
  router: {
    // uygulamanın URL kökü
    base: '/nuxt-03/'
  },
  // sunucu
  server: {
    // hizmet bağlantı noktası, varsayılan olarak 3000
    port: 81,
    // dinlenen ağ adresleri, varsayılan olarak localhost: 127.0.0.1
    // 0.0.0.0 = makinenin tüm ağ adresleri
    host: 'localhost'
}

Çalıştırıldığında görüntülenen sayfa şöyledir:

Image

  • [5] dosyasında, [nuxtServerInit] işlevinin, [index] sayfasının yaşam döngüsünden önce sunucu tarafından yürütüldüğü görülmektedir. [nuxt], yaşam döngüsüne geçmeden önce asenkron işlevin işini tamamlamasını beklemiştir;
  • [4]'te, istemcinin [nuxtServerInit] işlevini çalıştırmadığı görülmektedir;

Şimdi iki kez gezinelim: index --> sayfa1 --> index. Günlük kayıtları şu şekildedir:

Image

  • [1-2]'te, [nuxtServerInit] işlevinin istemci tarafından çalıştırılmadığını görüyoruz;

Şimdi, sunucuya bir çağrı yapılmasını zorlamak için [page1] sayfasındaki URL kodunu elle girelim:

Image

[3-4]'te, başlangıçta [index] sayfasının yüklenmesinden önce görülen mekanizmanın aynısını görüyoruz. Burada daha önce söylenenleri hatırlatmak isteriz: sunucuya bir sayfanın çağrılmasını zorladığımızda, her şey sanki uygulama istenen sayfa bir ana sayfa olarak yeniden başlatılıyormuş gibi gerçekleşir;