Skip to content

6. مثال [nuxt-03]: nuxtServerInit

پروژه [nuxt-03] با هدف نمایش تابع [nuxtServerInit] از مخزن [Vuex] ایجاد شده است. این امکان را برای سرور فراهم می‌کند تا مخزن [Vuex] را به همان شیوه‌ای که تابع [fetch] این کار را انجام می‌دهد، راه‌اندازی کند. با این حال، برخلاف تابع [fetch]، تابع [nuxtServerInit] هرگز توسط کلاینت اجرا نمی‌شود.

Image

پروژه [nuxt-03] در ابتدا با کپی کردن پروژه [nuxt-01] ایجاد می‌شود، که از آن صفحه [page2] از پوشه [pages] و از کامپوننت QZXW2HTMLP0007 حذف می‌شود.47ZQX. پوشه [store] با کپی کردن پوشه [nuxt-02/store] ایجاد شده است.

6.1. ذخیره‌گاه [Vuex]

فایل [Vuex] توسط فایل زیر [store/index.js] پیاده‌سازی خواهد شد:


/* eslint-disable no-console */
export const state = () => ({
  // شمارنده
  counter: 0
})

export const mutations = {
  // افزایش شمارنده به یک [inc]
  increment(state, inc) {
    state.counter += inc
  }
}

export const actions = {
  async nuxtServerInit(store, context) {
    // چه کسی این کد را اجرا می‌کند؟
    console.log('nuxtServerInit, client=', process.client, 'serveur=', process.server)
    // منتظر حل شدن یک وعده
    await new Promise(function(resolve, reject) {
      // به طور معمول، در اینجا یک تابع ناهمزمان وجود داشت
      // ما آن را با یک وقفه یک ثانیه‌ای شبیه‌سازی می‌کنیم
      setTimeout(() => {
        //موفقیت
        resolve()
      }, 1000)
    })
    // ما فروشگاه را تغییر می‌دهیم
    store.commit('increment', 34)
    // لاگ
    console.log('nuxtServerInit commit terminé')
  }
}
  • خطوط ۱–۱۲: همانند آنچه در پروژه [nuxt-02] بودند؛
  • خطوط 14–32: یک شیء به نام [actions] صادر می‌شود. این یک اصطلاح رزرو شده از فروشگاه [Vuex] است؛
  • خط ۱۵: تابع [nuxtServerInit] تعریف شده است. این تابع هنگام شروع برنامه توسط سرور اجرا خواهد شد. نقش معمول آن، راه‌اندازی یک مخزن به نام [Vuex] با استفاده از داده‌های خارجی که از طریق یک تابع غیرهمزمان به دست آمده است. [nuxt] منتظر می‌ماند تا این تابع نتایج خود را بازگرداند، پیش از آنکه چرخهٔ عمر صفحهٔ درخواستی را آغاز کند. این تابع دو پارامتر می‌گیرد:
    • ذخیره‌ی [Vuex] که باید مقداردهی اولیه شود؛
    • زمینهٔ جاری [nuxt
  • خطوط ۱۹–۲۶: منتظر تکمیل عملیات ناهمزمان می‌مانیم؛ در اینجا، یک وقفه مصنوعی یک ثانیه‌ای (خط ۱۵)؛
  • خط ۲۸: شمارنده روی ۳۴ تنظیم می‌شود؛
  • خطوط ۱۷ و ۳۰: لاگ‌ها برای ردیابی اجرای تابع [nuxtServerInit

6.2. صفحه [index]

صفحه [index] به شرح زیر خواهد بود:


<!--صفحه [index] -->
<template>
  <Layout :left="true" :right="true">
    <!-- ناوبری -->
    <Navigation slot="left" />
    <!-- پیام-->
    <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',
  // کامپوننت‌های استفاده شده
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // چرخهٔ عمر
  beforeCreate() {
    // کلاینت و سرور
    console.log('[home beforeCreate]')
  },
  created() {
    // کلاینت و سرور
    this.value = this.$store.state.counter
    console.log('[home created], value=', this.value)
  },
  beforeMount() {
    //فقط کلاینت
    console.log('[home beforeMount]')
  },
  mounted() {
    // فقط کلاینت
    console.log('[home mounted]')
  }
}
</script>
  • خط ۳۷: مقدار شمارنده که توسط تابع [nuxtServerInit] مقداردهی اولیه شده است، در خط ۲۷ به ویژگی [value] اختصاص داده می‌شود. این مقدار توسط خط ۷ نمایش داده می‌شود؛
  • خط ۳۷ هم توسط سرور و هم توسط کلاینت اجرا خواهد شد. در هر دو مورد، مقدار یکسانی برای ویژگی [value] تعیین می‌شود که تضمین می‌کند صفحه تولید شده توسط سرور با صفحه‌ای که توسط کلاینت تولید شده یکسان باشد؛

6.3. صفحه [page1]

صفحه [page1] با کپی کردن صفحه [index] به دست می‌آید. سپس متن آن اصلاح می‌شود تا [home] با [page1] جایگزین شود:


<!--صفحه [[page1]] -->
<template>
  <Layout :left="true" :right="true">
    <!-- ناوبری -->
    <Navigation slot="left" />
    <!-- پیام-->
    <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',
  // کامپوننت‌های استفاده شده
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  //چرخهٔ زندگی
  beforeCreate() {
    // کلاینت و سرور
    console.log('[page1 beforeCreate]')
  },
  created() {
    // کلاینت و سرور
    this.value = this.$store.state.counter
    console.log('[page1 created], value=', this.value)
  },
  beforeMount() {
    //فقط کلاینت
    console.log('[page1 beforeMount]')
  },
  mounted() {
    //فقط کلاینت
    console.log('[page1 mounted]')
  }
}
</script>

این صفحه صرفاً برای امکان پیمایش بین دو صفحه ایجاد شده است.

6.4. Exécution

فایل [nuxt.config.js] به شرح زیر اصلاح می‌شود:


// پوشه کد منبع
  srcDir: 'nuxt-03',
  // روتر
  router: {
    // دایرکتوری ریشهٔ برنامه
    base: '/nuxt-03/'
  },
  // سرور
  server: {
    // پورت سرویس، به‌طور پیش‌فرض 3000
    port: 81,
    // آدرس‌های شبکه‌ای که گوش داده می‌شوند، پیش‌فرض localhost: 127.0.0.1
    // 0.0.0.0 = تمام آدرس‌های شبکه روی دستگاه
    host: 'localhost'
}

صفحه نمایش‌داده‌شده در زمان اجرا به شرح زیر است:

Image

  • در [5]، می‌بینیم که تابع [nuxtServerInit] توسط سرور قبل از چرخه عمر صفحه [index] اجرا شده است. [nuxt] منتظر اتمام تابع غیرهمزمان بود قبل از اینکه به چرخهٔ عمر ادامه دهد؛
  • در [4]، می‌بینیم که کلاینت تابع [nuxtServerInit] را اجرا نکرده است؛

حال بیایید دو بار پیمایش کنیم: index --> page1 --> index. لاگ‌ها به شرح زیر است:

Image

  • در [1-2]، می‌بینیم که تابع [nuxtServerInit] توسط کلاینت اجرا نمی‌شود؛

اکنون بیایید به‌صورت دستی از صفحه [page1] وارد URL شویم تا تماس با سرور را اجباری کنیم:

Image

در [3-4]، ما همان مکانیزمی را می‌بینیم که پیش از بارگذاری صفحه [index] در هنگام راه‌اندازی وجود داشت. برای خلاصه آنچه قبلاً گفته شده است: هنگامی که فراخوانی یک صفحه به سرور اجباری می‌شود، گویی برنامه با یک صفحه اصلی که همان صفحه درخواست‌شده است، مجدداً راه‌اندازی می‌شود؛