Vue 3 vue-router не работает в production mode
Делаю CRM. У всех страниц в настройках роутера есть мета-свойство layout, определяющее, в какой обёртке будет представлен контент этой страницы
const routes = [
{
path: "/login",
name: "Login",
meta: {layout: 'auth'},
component: () => import('@/views/LoginPage.vue')
},
{
path: "/planning",
name: "Planning",
meta: {layout: 'main', auth: true},
component: () => import('@/views/PlanningPage.vue')
},
{
path: '/categories',
name: "Categories",
meta: {layout: 'main', auth: true},
component: () => import('@/views/CategoriesPage.vue')
},
В корневом компоненте App вложено computed свойство , которое запрашивает это мета-свойство у $route, то есть у текущей страницы. За счёт этого computed свойства работает динамический компонент, который и оборачивает router-view
<template>
<component :is="layout">
<router-view></router-view>
</component>
</template>
<script>
import MainLayout from './layouts/MainLayout.vue';
import AuthLayout from './layouts/AuthLayout.vue';
export default {
data(){
return {}
},
computed: {
layout(){
return this.$route.meta.layout + '-layout'
}
},
components: {
MainLayout, AuthLayout
},
mounted() {
this.$store.dispatch("checkForAuth")
},
methods: {
}
}
</script>
Итак, в developer mode всё работает замечательно - vue-router цепляет нужные страницы, меняет динамический компонент на нужный (main-layout или auth-layout), и выводит всё на экран:
В production mode, запускаемом через file://
меня, вместо нужного layout, встречает undefined-layout, ничего не работает
Самостоятельно решения проблемы не нашёл, лучшее, к чему пришёл - по всей видимости почему-то не работает this.$route.meta
.
Если хардкодить layout в App.vue, впрочем, общая проблема не решается. В production mode выводится лишь navbar, заложенный в layout'e, а сами страницы также не подгружаются.
Заранее спасибо за помощь, если вам потребуются уточнения - готов действовать оперативно!
vue.config.js:
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
transpileDependencies: true,
css: {
loaderOptions: {
scss: {
additionalData: '@import "~@/assets/variables.scss";'
}
}
}
});
настройки роутера
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
router.beforeEach((to, from, next) => {
const currUser = auth.currentUser,
requireAuth = to.matched.some(record => record.meta.auth)
if(requireAuth && !currUser)
next('/login')
else next()
})
export default router;