mirror of
https://github.com/reonokiy/blog.nokiy.net.git
synced 2025-06-16 19:51:07 +02:00
perf: optimize katex config, implement async css loading for katex, improve scrollbar and lightbox loading logic
This commit is contained in:
parent
625879b061
commit
979f36a796
6 changed files with 66 additions and 60 deletions
|
@ -18,6 +18,7 @@ import { remarkReadingTime } from './src/plugins/remark-reading-time.mjs'
|
||||||
|
|
||||||
const url = themeConfig.site.url
|
const url = themeConfig.site.url
|
||||||
const locale = themeConfig.global.locale
|
const locale = themeConfig.global.locale
|
||||||
|
const isKatexEnabled = themeConfig.global.katex
|
||||||
const linkPrefetch = themeConfig.preload.linkPrefetch
|
const linkPrefetch = themeConfig.preload.linkPrefetch
|
||||||
const imageHostURL = themeConfig.preload.imageHostURL
|
const imageHostURL = themeConfig.preload.imageHostURL
|
||||||
const imageConfig = imageHostURL
|
const imageConfig = imageHostURL
|
||||||
|
@ -31,6 +32,28 @@ const imageConfig = imageHostURL
|
||||||
}
|
}
|
||||||
: {}
|
: {}
|
||||||
|
|
||||||
|
const remarkPlugins = [
|
||||||
|
remarkDirective,
|
||||||
|
...(isKatexEnabled ? [remarkMath] : []),
|
||||||
|
remarkAdmonitions,
|
||||||
|
remarkGithubCard,
|
||||||
|
remarkReadingTime,
|
||||||
|
]
|
||||||
|
|
||||||
|
const rehypePlugins = [
|
||||||
|
rehypeSlug,
|
||||||
|
...(isKatexEnabled ? [rehypeKatex] : []),
|
||||||
|
rehypeImgToFigure,
|
||||||
|
[
|
||||||
|
rehypeExternalLinks,
|
||||||
|
{
|
||||||
|
target: '_blank',
|
||||||
|
rel: ['nofollow', 'noopener', 'noreferrer', 'external'],
|
||||||
|
protocols: ['http', 'https', 'mailto'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
] as any[]
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
site: url,
|
site: url,
|
||||||
base: '/',
|
base: '/',
|
||||||
|
@ -61,26 +84,8 @@ export default defineConfig({
|
||||||
robotsTxt(),
|
robotsTxt(),
|
||||||
],
|
],
|
||||||
markdown: {
|
markdown: {
|
||||||
remarkPlugins: [
|
remarkPlugins,
|
||||||
remarkDirective,
|
rehypePlugins,
|
||||||
remarkMath,
|
|
||||||
remarkAdmonitions,
|
|
||||||
remarkGithubCard,
|
|
||||||
remarkReadingTime,
|
|
||||||
],
|
|
||||||
rehypePlugins: [
|
|
||||||
rehypeSlug,
|
|
||||||
rehypeKatex,
|
|
||||||
rehypeImgToFigure,
|
|
||||||
[
|
|
||||||
rehypeExternalLinks,
|
|
||||||
{
|
|
||||||
target: '_blank',
|
|
||||||
rel: ['nofollow', 'noopener', 'noreferrer', 'external'],
|
|
||||||
protocols: ['http', 'https', 'mailto'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
|
||||||
shikiConfig: {
|
shikiConfig: {
|
||||||
// Available themes: https://shiki.style/themes
|
// Available themes: https://shiki.style/themes
|
||||||
themes: {
|
themes: {
|
||||||
|
|
|
@ -60,18 +60,6 @@ function initBackToTop() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
// Cleanup observer
|
|
||||||
if (observer) {
|
|
||||||
observer.disconnect()
|
|
||||||
observer = null
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove event listeners
|
|
||||||
backToTopButton = null
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle page transitions
|
// Handle page transitions
|
||||||
document.addEventListener('astro:page-load', initBackToTop)
|
document.addEventListener('astro:page-load', initBackToTop)
|
||||||
document.addEventListener('astro:before-swap', cleanup)
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -11,7 +11,7 @@ function setupGithubCards() {
|
||||||
observer.unobserve(entry.target)
|
observer.unobserve(entry.target)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, { rootMargin: '200px' })
|
}, { rootMargin: '400px' })
|
||||||
|
|
||||||
githubCards.forEach(card => observer.observe(card))
|
githubCards.forEach(card => observer.observe(card))
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,11 +53,13 @@ function setupPhotoSwipe() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function lazySetupPhotoSwipe() {
|
function lazySetupPhotoSwipe() {
|
||||||
if ('requestIdleCallback' in window) {
|
if (typeof window.requestIdleCallback === 'function') {
|
||||||
window.requestIdleCallback(() => setupPhotoSwipe(), { timeout: 1000 })
|
window.requestIdleCallback(() => setupPhotoSwipe(), { timeout: 1000 })
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setTimeout(setupPhotoSwipe, 100)
|
requestAnimationFrame(() => {
|
||||||
|
setupPhotoSwipe()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,25 @@ function setupScrollbar() {
|
||||||
bodyElement.setAttribute('data-scrollbar-initialized', 'true')
|
bodyElement.setAttribute('data-scrollbar-initialized', 'true')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const setupSecondaryScrollbars = () => {
|
||||||
|
// Add scrollbar to TOC content
|
||||||
|
const tocElement = document.getElementById('toc-content')
|
||||||
|
if (tocElement && !tocElement.hasAttribute('data-scrollbar-initialized')) {
|
||||||
|
OverlayScrollbars({
|
||||||
|
target: tocElement,
|
||||||
|
}, {
|
||||||
|
scrollbars: {
|
||||||
|
theme: 'scrollbar-widget',
|
||||||
|
autoHide: 'never',
|
||||||
|
},
|
||||||
|
overflow: {
|
||||||
|
x: 'hidden',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
tocElement.setAttribute('data-scrollbar-initialized', 'true')
|
||||||
|
}
|
||||||
|
|
||||||
// Add scrollbar to code blocks
|
// Add scrollbar to code blocks
|
||||||
const preElements = document.querySelectorAll('pre')
|
const preElements = document.querySelectorAll('pre')
|
||||||
preElements.forEach((pre) => {
|
preElements.forEach((pre) => {
|
||||||
|
@ -44,23 +63,15 @@ function setupScrollbar() {
|
||||||
pre.setAttribute('data-scrollbar-initialized', 'true')
|
pre.setAttribute('data-scrollbar-initialized', 'true')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Add scrollbar to TOC content
|
if (typeof window.requestIdleCallback === 'function') {
|
||||||
const tocElement = document.getElementById('toc-content')
|
window.requestIdleCallback(setupSecondaryScrollbars, { timeout: 1000 })
|
||||||
if (tocElement && !tocElement.hasAttribute('data-scrollbar-initialized')) {
|
}
|
||||||
OverlayScrollbars({
|
else {
|
||||||
target: tocElement,
|
requestAnimationFrame(() => {
|
||||||
}, {
|
setupSecondaryScrollbars()
|
||||||
scrollbars: {
|
|
||||||
theme: 'scrollbar-widget',
|
|
||||||
autoHide: 'never',
|
|
||||||
},
|
|
||||||
overflow: {
|
|
||||||
x: 'hidden',
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
tocElement.setAttribute('data-scrollbar-initialized', 'true')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ const pageImage = postSlug
|
||||||
<link rel="preload" href="/fonts/EarlySummer-Subset.woff2" as="font" type="font/woff2" crossorigin />
|
<link rel="preload" href="/fonts/EarlySummer-Subset.woff2" as="font" type="font/woff2" crossorigin />
|
||||||
<link rel="preload" href="/fonts/Snell-Black.woff2" as="font" type="font/woff2" crossorigin />
|
<link rel="preload" href="/fonts/Snell-Black.woff2" as="font" type="font/woff2" crossorigin />
|
||||||
<link rel="preload" href="/fonts/Snell-Bold.woff2" as="font" type="font/woff2" crossorigin />
|
<link rel="preload" href="/fonts/Snell-Bold.woff2" as="font" type="font/woff2" crossorigin />
|
||||||
{katex && <link rel="stylesheet" href={katexCSS} />}
|
{katex && <link rel="preload" href={katexCSS} as="style" onload="this.onload=null;this.rel='stylesheet'" />}
|
||||||
{commentURL && <link rel="preconnect" href={commentURL} crossorigin />}
|
{commentURL && <link rel="preconnect" href={commentURL} crossorigin />}
|
||||||
{commentURL && <link rel="dns-prefetch" href={commentURL} />}
|
{commentURL && <link rel="dns-prefetch" href={commentURL} />}
|
||||||
<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="RSS Feed" />
|
<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="RSS Feed" />
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue