Динамичке руте у статичкој апликацији
11.11.2019
Наставивши развој сајта, приметио сам једну специфичност Nuxt.js-а. Уколико
статички генеришете апликацију преко nuxt generate, а не наведете експлицитно
које руте ће бити генерисане, руте са параметрима ће и даље функционисати, али
само ако су активиране кроз саму апликацију, преко Vue Router-а (рецимо,
<nuxt-link>). Ако унесете УРЛ странице у адресном пољу, или притиснете F5,
добићете поруку о грешци, као да рута не постоји!
Проблем
На пример, нека у апликацији имамо следеће странице:
/pages ├──/search │ └──_docid.vue └──index.vue
Нека одговарајући фајлови садрже следећи код:
<!--pages/index.vue-->
<template>
<section>
<nuxt-link to="/search/first">Search: "first"</nuxt-link>
<nuxt-link to="/search/second">Search: "second"</nuxt-link>
</section>
</template>
<script>
export default {
name: "Index"
};
</script>
<!-- ... -->
<!--pages/search/_docid.vue-->
<template>
<div class="search">
<nuxt-link to="/">Back to home</nuxt-link>
<p>{{docBodies[documentId]}}</p>
</div>
<!--doc-->
</template>
<script>
export default {
name: "Search",
asyncData({ params }) {
return {
documentId: params.docid,
docBodies: {
first: "First document",
second: "Second document"
}
};
}
};
</script>
<!-- ... -->
Покретањем nuxt generate без посебно подешене generate секције фајла
nuxt.config.js биће генерисана само основна рута, /. Ако приступимо почетној
страници, па затим активирамо линк Search: "first", учитаће се страница за
претрагу, /search/first. Међутим, притиском на F5 или Ctrl+R
страница неће бити исправно учитана. Исто се дешава приступом преко линка
/search/first.
Са овим понашањем Nuxt.js-а сам се суочио када сам желео да у свој блог додам
подршку за листање свих страница са одређеном ознаком. Рецимо, у мом блогу се за
то користи рута /blog/tag/:tagname, и овај чланак ће се појавити у листи чланака
на рути /blog/tag/SSR.
Ако негде у апликацији, рецимо у приказу појединачних чланака, позовемо
<nuxt-link :to="`/blog/tag/${tag.name}`">
{{tag.name}}
</nuxt-link>
све ће функционисати, али не и у поменута два случаја: ако директно посетимо УРЛ или освежимо већ учитану страницу.
Решење
Решење овог проблема је генерисање странице која ће бити „резервна опција“ у
случају када задата рута није статички генерисана. Ово се постиже додавањем
опције fallback у секцију generate у датотеци nuxt.config.js:
export default {
/*
** Rendering mode
** Doc: https://nuxtjs.org/api/configuration-mode
*/
mode: "universal",
// ...
generate: {
// ***************************************************
// *** Without the next line, F5 on dynamic routes ***
// *** will fail ***
// ***************************************************
fallback: true
},
// ...
};
Ова опција има три могуће вредности:
true: fallback руту ће опслуживати фајл/404.html,false: fallback руту ће опслуживати фајл/200.html,'[назив_фајла].html': експлицитно задавање фајла fallback руте.
Ова лако занемарљива опција може представљати разлику између функционалног и нефункционалног сајта.