fix: avoid using __DEV__ + throttle active header link

pull/27/head
Evan You 5 years ago
parent 903b34c617
commit a63b0cf69a

@ -5,7 +5,7 @@ import { usePrefetch } from '../composables/preFetch'
export const Content = { export const Content = {
setup() { setup() {
const route = useRoute() const route = useRoute()
if (!__DEV__) { if (process.env.NODE_ENV === 'production') {
// in prod mode, enable intersectionObserver based pre-fetch. // in prod mode, enable intersectionObserver based pre-fetch.
usePrefetch() usePrefetch()
} }

@ -8,7 +8,7 @@ export function useUpdateHead(pageDataRef: PageDataRef) {
let isFirstUpdate = true let isFirstUpdate = true
const updateHeadTags = (newTags: HeadConfig[]) => { const updateHeadTags = (newTags: HeadConfig[]) => {
if (!__DEV__ && isFirstUpdate) { if (process.env.NODE_ENV === 'production' && isFirstUpdate) {
// in production, the initial meta tags are already pre-rendered so we // in production, the initial meta tags are already pre-rendered so we
// skip the first update. // skip the first update.
isFirstUpdate = false isFirstUpdate = false

@ -66,15 +66,19 @@ export function createApp() {
} }
}, NotFound) }, NotFound)
const app = __DEV__ const app =
? createClientApp(Theme.Layout) process.env.NODE_ENV === 'production'
: createSSRApp(Theme.Layout) ? createSSRApp(Theme.Layout)
: createClientApp(Theme.Layout)
app.provide(RouterSymbol, router) app.provide(RouterSymbol, router)
app.provide(pageDataSymbol, pageDataRef) app.provide(pageDataSymbol, pageDataRef)
app.component('Content', Content) app.component('Content', Content)
app.component('Debug', __DEV__ ? Debug : () => null) app.component(
'Debug',
process.env.NODE_ENV === 'production' ? () => null : Debug
)
Object.defineProperties(app.config.globalProperties, { Object.defineProperties(app.config.globalProperties, {
$site: { $site: {

@ -9,7 +9,7 @@ export function pathToFile(path: string): string {
pagePath += 'index' pagePath += 'index'
} }
if (__DEV__) { if (process.env.NODE_ENV !== 'production') {
// awlays force re-fetch content in dev // awlays force re-fetch content in dev
pagePath += `.md?t=${Date.now()}` pagePath += `.md?t=${Date.now()}`
} else { } else {

@ -1,4 +1,3 @@
declare const __DEV__: boolean
declare const __VP_HASH_MAP__: Record<string, string> declare const __VP_HASH_MAP__: Record<string, string>
declare const process: { declare const process: {
env: Record<string, string> env: Record<string, string>

@ -24,10 +24,12 @@ export default {
return { return {
withBase, withBase,
isActiveLink, isActiveLink,
// use computed in dev for hot reload navData:
navData: __DEV__ process.env.NODE_ENV === 'production'
? computed(() => useSiteData().value.themeConfig.nav) ? // navbar items do not change in production
: useSiteData().value.themeConfig.nav useSiteData().value.themeConfig.nav
: // use computed in dev for hot reload
computed(() => useSiteData().value.themeConfig.nav)
} }
} }
} }

@ -33,38 +33,36 @@ export default {
useActiveSidebarLinks() useActiveSidebarLinks()
const resolveSidebar = () => { return {
const { items: computed(() => {
headers, const {
frontmatter: { sidebar, sidebarDepth = 2 } headers,
} = pageData.value frontmatter: { sidebar, sidebarDepth = 2 }
} = pageData.value
if (sidebar === 'auto') { if (sidebar === 'auto') {
// auto, render headers of current page // auto, render headers of current page
return resolveAutoSidebar(headers, sidebarDepth)
} else if (Array.isArray(sidebar)) {
// in-page array config
return resolveArraySidebar(sidebar, sidebarDepth)
} else if (sidebar === false) {
return []
} else {
// no explicit page sidebar config
// check global theme config
const { sidebar: themeSidebar } = siteData.value.themeConfig
if (themeSidebar === 'auto') {
return resolveAutoSidebar(headers, sidebarDepth) return resolveAutoSidebar(headers, sidebarDepth)
} else if (Array.isArray(themeSidebar)) { } else if (Array.isArray(sidebar)) {
return resolveArraySidebar(themeSidebar, sidebarDepth) // in-page array config
} else if (themeSidebar === false) { return resolveArraySidebar(sidebar, sidebarDepth)
} else if (sidebar === false) {
return [] return []
} else if (typeof themeSidebar === 'object') { } else {
return resolveMultiSidebar(themeSidebar, route.path, sidebarDepth) // no explicit page sidebar config
// check global theme config
const { sidebar: themeSidebar } = siteData.value.themeConfig
if (themeSidebar === 'auto') {
return resolveAutoSidebar(headers, sidebarDepth)
} else if (Array.isArray(themeSidebar)) {
return resolveArraySidebar(themeSidebar, sidebarDepth)
} else if (themeSidebar === false) {
return []
} else if (typeof themeSidebar === 'object') {
return resolveMultiSidebar(themeSidebar, route.path, sidebarDepth)
}
} }
} })
}
return {
items: __DEV__ ? computed(resolveSidebar) : resolveSidebar()
} }
} }
} }

@ -59,7 +59,7 @@ export function useActiveSidebarLinks() {
} }
} }
const onScroll = debounce(setActiveLink, 100) const onScroll = throttleAndDebounce(setActiveLink, 300)
onMounted(() => { onMounted(() => {
setActiveLink() setActiveLink()
window.addEventListener('scroll', onScroll) window.addEventListener('scroll', onScroll)
@ -75,10 +75,19 @@ export function useActiveSidebarLinks() {
}) })
} }
function debounce(fn: () => void, delay: number): () => void { function throttleAndDebounce(fn: () => void, delay: number): () => void {
let timeout: number let timeout: number
let called = false
return () => { return () => {
if (timeout) clearTimeout(timeout) if (timeout) clearTimeout(timeout)
timeout = setTimeout(fn, delay) if (!called) {
fn()
called = true
setTimeout(() => {
called = false
}, delay)
} else {
timeout = setTimeout(fn, delay)
}
} }
} }

Loading…
Cancel
Save