Files
ao3-mirror-ssr/src/stores/route.js
UnknownMp eca669d62a
All checks were successful
Build / build-and-test (push) Successful in 28s
[Base] 更新 SSR 机制, 支持流式渲染注入 head 标签
损失的 TTFB 可以忽略不计
2025-06-05 18:02:03 +08:00

72 lines
2.0 KiB
JavaScript

import { ref, computed, watch } from 'vue'
import { defineStore } from 'pinia'
import { useRouter, useRoute } from 'vue-router'
import { useHeadHelper } from '../ssr/headHelper.js'
export const useRouteStore = defineStore('route', () => {
const router = useRouter()
const route = useRoute()
const allRoutes = ref(router.getRoutes()
.filter(route => route.meta.hidden !== true)
.map(route => ({
path: route.path,
name: route.name,
order: route.meta.order || Number.MAX_SAFE_INTEGER
}))
.sort((a, b) => (a.order - b.order))
)
const lastFromDrawer = ref(0)
const customTitle = ref(null)
const title = import.meta.env.SSR ?
computed(() => route.meta.title || route.name) :
computed(() => customTitle.value || route.meta.title || route.name)
function drawerPress(target) {
if (lastFromDrawer.value == 0) {
lastFromDrawer.value = 1
router.push(target)
} else router.replace(target)
}
const progress = ref(0)
const progressMax = ref(1)
const showProgress = ref(false)
if (!import.meta.env.SSR) {
watch(title, title => document.title = title)
let progressTimer = null
router.beforeEach((to, from) => {
if (showProgress.value) return false
if (lastFromDrawer.value == 2) lastFromDrawer.value = 0
else if (lastFromDrawer.value == 1) lastFromDrawer.value = 2
progress.value = 0
progressMax.value = 1
showProgress.value = true
if (!progressTimer) {
progressTimer = setInterval(() => {
progress.value += progressMax.value / 10
if (progressMax.value <= progress.value) progressMax.value = progressMax.value * 3
}, 300)
}
return true
})
router.afterEach((to, from) => {
if (progressTimer) {
showProgress.value = false
clearInterval(progressTimer)
progressTimer = null
}
customTitle.value = null
if (!import.meta.env.SSR) window.scrollTo({ top: 0, left: 0, behavior: 'auto' });
})
}
return {
allRoutes,
lastFromDrawer,
title,
drawerPress,
showProgress,
progress,
progressMax,
customTitle
}
})