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,7 +33,8 @@ export default {
useActiveSidebarLinks() useActiveSidebarLinks()
const resolveSidebar = () => { return {
items: computed(() => {
const { const {
headers, headers,
frontmatter: { sidebar, sidebarDepth = 2 } frontmatter: { sidebar, sidebarDepth = 2 }
@ -61,10 +62,7 @@ export default {
return resolveMultiSidebar(themeSidebar, route.path, sidebarDepth) 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)
if (!called) {
fn()
called = true
setTimeout(() => {
called = false
}, delay)
} else {
timeout = setTimeout(fn, delay) timeout = setTimeout(fn, delay)
} }
}
} }

Loading…
Cancel
Save