Skip to content

Commit

Permalink
perf(theme): 优化 headers
Browse files Browse the repository at this point in the history
  • Loading branch information
pengzhanbo committed Jul 9, 2024
1 parent 5db3481 commit 67f7b0e
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 27 deletions.
15 changes: 6 additions & 9 deletions theme/src/client/components/VPDoc.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,20 @@ import VPDocMeta from '@theme/VPDocMeta.vue'
import { useEncrypt } from '../composables/encrypt.js'
import { useSidebar } from '../composables/sidebar.js'
import { useData } from '../composables/data.js'
import { useHeaders } from '../composables/outline.js'
const { page, theme, frontmatter, isDark } = useData()
const route = useRoute()
const { hasSidebar, hasAside, leftAside } = useSidebar()
const headers = useHeaders()
const { isPageDecrypted } = useEncrypt()
const hasComments = computed(() => {
return page.value.frontmatter.comments !== false && isPageDecrypted.value
})
const enableAside = computed(() => {
if (page.value.isBlogPost)
return hasAside.value && isPageDecrypted.value && page.value.headers.length
return hasAside.value && isPageDecrypted.value
})
const enableAside = computed(() => hasAside.value && headers.value.length)
const pageName = computed(() =>
route.path.replace(/[./]+/g, '_').replace(/_html$/, ''),
Expand Down Expand Up @@ -68,7 +65,7 @@ watch(
<div
:key="page.path" class="vp-doc-container" :class="{
'has-sidebar': hasSidebar,
'has-aside': hasAside,
'has-aside': enableAside,
'is-blog': page.isBlogPost,
'with-encrypt': !isPageDecrypted,
}"
Expand Down Expand Up @@ -207,7 +204,7 @@ watch(
.aside-container {
position: sticky;
top: 0;
min-height: calc(100vh - var(--vp-footer-height, 0px));
min-height: calc(100vh - var(--vp-nav-height, 0px) - var(--vp-footer-height, 0px));
max-height: 100vh;
padding-top: calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px);
margin-top: calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1 - 32px);
Expand Down Expand Up @@ -241,7 +238,7 @@ watch(
.aside-content {
display: flex;
flex-direction: column;
min-height: calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));
min-height: calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-footer-height, 0px) + 48px));
padding-bottom: 32px;
}
Expand Down
11 changes: 3 additions & 8 deletions theme/src/client/components/VPDocAsideOutline.vue
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
import { onContentUpdated } from '@vuepress-plume/plugin-content-update/client'
import VPDocOutlineItem from '@theme/VPDocOutlineItem.vue'
import { type MenuItem, getHeaders, useActiveAnchor } from '../composables/outline.js'
import { type MenuItem, useActiveAnchor, useHeaders } from '../composables/outline.js'
import { useData } from '../composables/data.js'
const { theme, frontmatter } = useData()
const { theme } = useData()
const headers = ref<MenuItem[]>([])
const headers = useHeaders()
const hasOutline = computed(() => headers.value.length > 0)
onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme.value.outline)
})
const container = ref()
const marker = ref()
Expand Down
11 changes: 3 additions & 8 deletions theme/src/client/components/VPLocalNav.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<script lang="ts" setup>
import { useWindowScroll } from '@vueuse/core'
import { computed, onMounted, ref } from 'vue'
import { onContentUpdated } from '@vuepress-plume/plugin-content-update/client'
import VPLocalNavOutlineDropdown from '@theme/VPLocalNavOutlineDropdown.vue'
import { useSidebar } from '../composables/sidebar.js'
import { type MenuItem, getHeaders } from '../composables/outline.js'
import { useHeaders } from '../composables/outline.js'
import { useData } from '../composables/data.js'
const props = defineProps<{
Expand All @@ -14,23 +13,19 @@ const props = defineProps<{
defineEmits<(e: 'openMenu') => void>()
const { page, theme, frontmatter } = useData()
const { page, theme } = useData()
const { hasSidebar } = useSidebar()
const { y } = useWindowScroll()
const navHeight = ref(0)
const headers = ref<MenuItem[]>([])
const headers = useHeaders()
const empty = computed(() => {
return headers.value.length === 0 && !hasSidebar.value
})
onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme.value.outline)
})
onMounted(() => {
navHeight.value = Number.parseInt(
getComputedStyle(document.documentElement).getPropertyValue(
Expand Down
31 changes: 29 additions & 2 deletions theme/src/client/composables/outline.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { onMounted, onUnmounted, onUpdated } from 'vue'
import type { Ref } from 'vue'
import { inject, onMounted, onUnmounted, onUpdated, provide, ref } from 'vue'
import type { InjectionKey, Ref } from 'vue'
import { onContentUpdated } from '@vuepress-plume/plugin-content-update/client'
import type { ThemeOutline } from '../../shared/index.js'
import { throttleAndDebounce } from '../utils/index.js'
import { useAside } from './aside.js'
import { useData } from './data.js'

export interface Header {
/**
Expand Down Expand Up @@ -41,6 +43,31 @@ export type MenuItem = Omit<Header, 'slug' | 'children'> & {
children?: MenuItem[]
}

export const headersSymbol: InjectionKey<Ref<MenuItem[]>> = Symbol(
__VUEPRESS_DEV__ ? 'headers' : '',
)

export function setupHeaders(): Ref<MenuItem[]> {
const { frontmatter, theme } = useData()
const headers = ref<MenuItem[]>([])

onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme.value.outline)
})

provide(headersSymbol, headers)

return headers
}

export function useHeaders(): Ref<MenuItem[]> {
const headers = inject(headersSymbol)
if (!headers) {
throw new Error('useHeaders() is called without provider.')
}
return headers
}

export function getHeaders(range?: ThemeOutline): MenuItem[] {
const headers = Array.from(
document.querySelectorAll('.vp-doc :where(h1,h2,h3,h4,h5,h6)'),
Expand Down
2 changes: 2 additions & 0 deletions theme/src/client/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
enhanceScrollBehavior,
setupDarkMode,
setupEncrypt,
setupHeaders,
setupSidebar,
setupThemeData,
setupWatermark,
Expand All @@ -23,6 +24,7 @@ export default defineClientConfig({
},
setup() {
setupSidebar()
setupHeaders()
setupEncrypt()
setupWatermark()
},
Expand Down

0 comments on commit 67f7b0e

Please sign in to comment.