11. [nuxt-08] örneği: yönlendirme ara yazılımları
Bu örnekte, her rota değişikliğinde çalıştırılan komut dosyaları olan yönlendirme ara yazılımları kavramını tanıtıyoruz.
[nuxt-08] örneği, başlangıçta [nuxt-01] projesinin kopyalanmasıyla elde edilir:

Yönlendirme ara yazılımları, [middleware] [2] adlı bir klasörde bulunmalıdır. İki aşamalı bir yönlendirme olabilir:
- her gezinme işlemine uygulanan bir yönlendirme. Bu yönlendirme, [nuxt.config.js] dosyasında tanımlanır;
- yönlendirmenin hedefi olan belirli bir sayfaya uygulanan yönlendirme. Bu yönlendirme, hedef sayfada tanımlanır;
11.1. Genel yönlendirme
[middleware / routing.js] dosyası genel yönlendirmeyi sağlayacaktır. Bu dosya, [nuxt.config.js] dosyasında aşağıdaki şekilde tanımlanmıştır:
router: {
base: '/nuxt-08/',
middleware: ['routing']
},
Genel yönlendirme ara yazılımları, yönlendiricinin bir özelliğidir (1. satır). Birden fazla yönlendirme ara yazılımı olabilir. Bu nedenle 3. satırda, [middleware] özelliğinin değeri bir dizidir. Görüldüğü gibi, orta katmanı belirtmek için bir yol kullanılmamaktadır. Orta katman, projenin [middleware] klasöründe otomatik olarak aranacaktır;
[routing] orta katmanı burada sadece günlük kaydı tutar:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// bu kodu kim çalıştırıyor?
console.log('[routing], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const routing = '[routing ' + who + ']'
// argüman sayısı
console.log(routing + ', il y a', args.length, 'argument(s)')
// 1. argüman
const context = args[0]
// bağlam anahtarları
dumpkeys(routing + ', context', context)
// uygulama
dumpkeys(routing + ', context.app', context.app)
// yol
dumpkeys(routing + ', context.route', context.route)
console.log(routing + ', context.route=', context.route)
// yönlendirici
dumpkeys(routing + ', context.app.router', context.app.router)
// router.options.routes
dumpkeys(routing + ', context.app.router.options.routes', context.app.router.options.routes)
console.log(routing + ', context.app.router.options.routes=', context.app.router.options.routes)
}
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))
}
}
- 3. satır: Middleware'in bir argüman aldığını göreceğiz: yürütücünün bağlamı (sunucu veya istemci);
- 4-25. satırlar: Neyin kullanılabilir olduğunu öğrenmek için farklı nesnelerin özelliklerini görüntülüyoruz. Middleware'in bağlamının eklentinin bağlamıyla neredeyse aynı olduğunu göreceğiz;
11.2. Belirli bir sayfa için yönlendirme
[index] sayfasına nasıl ulaşıldığını kontrol etmek istiyoruz. Bunun için, [middleware] özelliğini bu [index] sayfasına eklememiz gerekiyor:
<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
},
// yaşam döngüsü
beforeCreate() {
// istemci ve sunucu
console.log('[home beforeCreate]')
},
created() {
// istemci ve sunucu
console.log('[home created]')
},
beforeMount() {
// sadece istemci
console.log('[home beforeMount]')
},
mounted() {
// sadece istemci
console.log('[home mounted]')
},
// yönlendirme
middleware: ['index-routing']
}
</script>
- 34. satır: [middleware] özelliği, bir sonraki görüntülenecek sayfa [index] olduğunda her seferinde çalıştırılacak komut dosyalarını listeler. Burada da bu komut dosyaları, projenin [middleware] klasöründe aranacaktır;
[index-routing] orta katmanı şu şekildedir:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// bu kodu kim çalıştırıyor?
console.log('[index-routing], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const indexRouting = '[index-routing ' + who + ']'
// argüman sayısı
console.log(indexRouting + ', il y a', args.length, 'argument(s)')
// 1. argüman
const context = args[0]
// bağlam anahtarları
dumpkeys(indexRouting + ', context', context)
// uygulama
dumpkeys(indexRouting + ', context.app', context.app)
// yol
dumpkeys(indexRouting + ', context.route', context.route)
console.log(indexRouting + ', context.route=', context.route)
// yönlendirici
dumpkeys(indexRouting + ', context.app.router', context.app.router)
// router.options.routes
dumpkeys(indexRouting + ', context.app.router.options.routes', context.app.router.options.routes)
console.log(indexRouting + ', context.app.router.options.routes=', context.app.router.options.routes)
// nereden geliyoruz?
if (context.from) {
console.log('from=', context.from)
}
}
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))
}
}
[index-routing] kodunun içeriği, [routing] ile aynıdır ve aynı sonuçları verir. Bizi ilgilendiren, bu iki orta katman yazılımının ne zaman çalıştırıldığıdır.
11.3. Projenin çalıştırılması
Projeyi çalıştırıyoruz. Bu durumda günlük kayıtları şu şekildedir:
Sunucu tarafından ilk olarak [routing] komut dosyası çalıştırılır:
Burada, eklentilerle elde ettiğimiz sonuçları görüyoruz.
- 15. satır: [redirect] özelliği, orta katman yazılımlarında sıklıkla kullanılır; bu özellik, mevcut yönlendirmenin hedefini değiştirmeye olanak tanır;
Ardından, görüntülenecek sayfa [index] olduğu için, sunucu [index-routing] komut dosyasını çalıştırır ve aşağıdaki günlükleri görüntüler:
[index-routing] komut dosyasıyla elde edilen sonuçlar, [routing] komut dosyasıyla elde edilen sonuçlara benzerdir.
[index] sayfası istemci tarayıcısı tarafından alındığında, iş istemci komut dosyalarına geçer. Günlükler şu şekilde olur:
Görüldüğü gibi, uygulamanın başlatılması sırasında istemci hiçbir orta katman yazılımını çalıştırmaz. Bu, kullanıcının sunucuya bir çağrı yapmasını her zorladığında bu durumun tekrarlanacağı anlamına gelir. Orta katman yazılımları, yalnızca istemci içinde gezinme sırasında istemci tarafından çalıştırılır. Örneğin, [index] sayfasında iken [Page 1] bağlantısını kullanarak [page1] sayfasına gidelim. Bu durumda günlükler şu şekilde olur:
- 2. satır: [routing] orta katmanı istemci tarafından çalıştırılır;
- 4. satır: [from] özelliğine dikkat edin: bu, geldiğimiz yoldur;
- 9. satır: [context.route], gideceğimiz yoldur;
- 15-18. satırlar: [page1] sayfasının görüntülenmesi;
Şimdi [Home] bağlantısını kullanarak [index] sayfasına geri dönelim. Bu durumda günlük kayıtları şu şekildedir:
- satır 1-15: istemci, [routing] orta katman yazılımını çalıştırır. Bu normaldir. Her rota değişikliğinde bu yazılım çalıştırılır;
- satır 16-29: İstemci, [index-routing] orta katman yazılımını çalıştırır; bunun nedeni şudur:
- [index], mevcut rotanın hedefidir (bkz. satır 23);
- [index] sayfası, [index-routing] adlı bir ara yazılım tanımlamıştır;
Görüldüğü gibi, genel yönlendirme orta katmanları, sayfalara bağlı orta katmanlardan önce istemci tarafından yürütülür.