Files
NotionNext/pages/_document.js
2025-06-03 15:06:37 +08:00

78 lines
2.2 KiB
JavaScript

// eslint-disable-next-line @next/next/no-document-import-in-page
import BLOG from '@/blog.config'
import Document, { Head, Html, Main, NextScript } from 'next/document'
// 预先设置深色模式的脚本内容
const darkModeScript = `
(function() {
const darkMode = localStorage.getItem('darkMode')
const prefersDark =
window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
const defaultAppearance = '${BLOG.APPEARANCE || 'auto'}'
let shouldBeDark = darkMode === 'true' || darkMode === 'dark'
if (darkMode === null) {
if (defaultAppearance === 'dark') {
shouldBeDark = true
} else if (defaultAppearance === 'auto') {
// 检查是否在深色模式时间范围内
const date = new Date()
const hours = date.getHours()
const darkTimeStart = ${BLOG.APPEARANCE_DARK_TIME ? BLOG.APPEARANCE_DARK_TIME[0] : 18}
const darkTimeEnd = ${BLOG.APPEARANCE_DARK_TIME ? BLOG.APPEARANCE_DARK_TIME[1] : 6}
shouldBeDark = prefersDark || (hours >= darkTimeStart || hours < darkTimeEnd)
}
}
// 立即设置 html 元素的类
document.documentElement.classList.add(shouldBeDark ? 'dark' : 'light')
})()
`
class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx)
return { ...initialProps }
}
render() {
return (
<Html lang={BLOG.LANG}>
<Head>
{/* 预加载字体 */}
{BLOG.FONT_AWESOME && (
<>
<link
rel='preload'
href={BLOG.FONT_AWESOME}
as='style'
crossOrigin='anonymous'
/>
<link
rel='stylesheet'
href={BLOG.FONT_AWESOME}
crossOrigin='anonymous'
referrerPolicy='no-referrer'
/>
</>
)}
{/* 预先设置深色模式,避免闪烁 */}
<script dangerouslySetInnerHTML={{ __html: darkModeScript }} />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument