Merge pull request #2332 from tangly1024/feat/hide-comment-default

评论插件异步加载
This commit is contained in:
tangly1024
2024-04-25 17:15:15 +08:00
committed by GitHub

View File

@@ -1,9 +1,10 @@
import dynamic from 'next/dynamic'
import Tabs from '@/components/Tabs' import Tabs from '@/components/Tabs'
import { isBrowser, isSearchEngineBot } from '@/lib/utils'
import { useRouter } from 'next/router'
import Artalk from './Artalk'
import { siteConfig } from '@/lib/config' import { siteConfig } from '@/lib/config'
import { isBrowser, isSearchEngineBot } from '@/lib/utils'
import dynamic from 'next/dynamic'
import { useRouter } from 'next/router'
import { useEffect, useRef, useState } from 'react'
import Artalk from './Artalk'
const WalineComponent = dynamic( const WalineComponent = dynamic(
() => { () => {
@@ -57,11 +58,14 @@ const ValineComponent = dynamic(() => import('@/components/ValineComponent'), {
/** /**
* 评论组件 * 评论组件
* 只有当前组件在浏览器可见范围内才会加载内容
* @param {*} param0 * @param {*} param0
* @returns * @returns
*/ */
const Comment = ({ siteInfo, frontMatter, className }) => { const Comment = ({ frontMatter, className }) => {
const router = useRouter() const router = useRouter()
const [shouldLoad, setShouldLoad] = useState(false)
const commentRef = useRef(null)
const COMMENT_ARTALK_SERVER = siteConfig('COMMENT_ARTALK_SERVER') const COMMENT_ARTALK_SERVER = siteConfig('COMMENT_ARTALK_SERVER')
const COMMENT_TWIKOO_ENV_ID = siteConfig('COMMENT_TWIKOO_ENV_ID') const COMMENT_TWIKOO_ENV_ID = siteConfig('COMMENT_TWIKOO_ENV_ID')
@@ -73,16 +77,39 @@ const Comment = ({ siteInfo, frontMatter, className }) => {
const COMMENT_GITALK_CLIENT_ID = siteConfig('COMMENT_GITALK_CLIENT_ID') const COMMENT_GITALK_CLIENT_ID = siteConfig('COMMENT_GITALK_CLIENT_ID')
const COMMENT_WEBMENTION_ENABLE = siteConfig('COMMENT_WEBMENTION_ENABLE') const COMMENT_WEBMENTION_ENABLE = siteConfig('COMMENT_WEBMENTION_ENABLE')
if (isSearchEngineBot()) { useEffect(() => {
return null // Check if the component is visible in the viewport
} const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
setShouldLoad(true)
observer.unobserve(entry.target)
}
})
})
if (commentRef.current) {
observer.observe(commentRef.current)
}
return () => {
if (commentRef.current) {
observer.unobserve(commentRef.current)
}
}
}, [])
// 当连接中有特殊参数时跳转到评论区 // 当连接中有特殊参数时跳转到评论区
if (isBrowser && ('giscus' in router.query || router.query.target === 'comment')) { if (
isBrowser &&
('giscus' in router.query || router.query.target === 'comment')
) {
setTimeout(() => { setTimeout(() => {
const url = router.asPath.replace('?target=comment', '') const url = router.asPath.replace('?target=comment', '')
history.replaceState({}, '', url) history.replaceState({}, '', url)
document?.getElementById('comment')?.scrollIntoView({ block: 'start', behavior: 'smooth' }) document
?.getElementById('comment')
?.scrollIntoView({ block: 'start', behavior: 'smooth' })
}, 1000) }, 1000)
} }
@@ -90,48 +117,85 @@ const Comment = ({ siteInfo, frontMatter, className }) => {
return <>Loading...</> return <>Loading...</>
} }
if (isSearchEngineBot()) {
return null
}
return ( return (
<div key={frontMatter?.id} id='comment' className={`comment mt-5 text-gray-800 dark:text-gray-300 ${className || ''}`}> <div
<Tabs> key={frontMatter?.id}
{COMMENT_ARTALK_SERVER && (<div key='Artalk'> id='comment'
<Artalk /> ref={commentRef}
</div>)} className={`comment mt-5 text-gray-800 dark:text-gray-300 ${className || ''}`}>
{/* 延迟加载评论区 */}
{COMMENT_TWIKOO_ENV_ID && (<div key='Twikoo'> {!shouldLoad && (
<TwikooCompenent /> <div className='text-center'>
</div>)} Loading...
<i className='fas fa-spinner animate-spin text-3xl ' />
{COMMENT_WALINE_SERVER_URL && (<div key='Waline'>
<WalineComponent />
</div>)}
{COMMENT_VALINE_APP_ID && (<div key='Valine' name='reply'>
<ValineComponent path={frontMatter.id} />
</div>)}
{COMMENT_GISCUS_REPO && (
<div key="Giscus">
<GiscusComponent className="px-2" />
</div>
)}
{COMMENT_CUSDIS_APP_ID && (<div key='Cusdis'>
<CusdisComponent frontMatter={frontMatter} />
</div>)}
{COMMENT_UTTERRANCES_REPO && (<div key='Utterance'>
<UtterancesComponent issueTerm={frontMatter.id} className='px-2' />
</div>)}
{COMMENT_GITALK_CLIENT_ID && (<div key='GitTalk'>
<GitalkComponent frontMatter={frontMatter} />
</div>)}
{COMMENT_WEBMENTION_ENABLE && (<div key='WebMention'>
<WebMentionComponent frontMatter={frontMatter} className="px-2" />
</div>)}
</Tabs>
</div> </div>
)}
{shouldLoad && (
<Tabs>
{COMMENT_ARTALK_SERVER && (
<div key='Artalk'>
<Artalk />
</div>
)}
{COMMENT_TWIKOO_ENV_ID && (
<div key='Twikoo'>
<TwikooCompenent />
</div>
)}
{COMMENT_WALINE_SERVER_URL && (
<div key='Waline'>
<WalineComponent />
</div>
)}
{COMMENT_VALINE_APP_ID && (
<div key='Valine' name='reply'>
<ValineComponent path={frontMatter.id} />
</div>
)}
{COMMENT_GISCUS_REPO && (
<div key='Giscus'>
<GiscusComponent className='px-2' />
</div>
)}
{COMMENT_CUSDIS_APP_ID && (
<div key='Cusdis'>
<CusdisComponent frontMatter={frontMatter} />
</div>
)}
{COMMENT_UTTERRANCES_REPO && (
<div key='Utterance'>
<UtterancesComponent
issueTerm={frontMatter.id}
className='px-2'
/>
</div>
)}
{COMMENT_GITALK_CLIENT_ID && (
<div key='GitTalk'>
<GitalkComponent frontMatter={frontMatter} />
</div>
)}
{COMMENT_WEBMENTION_ENABLE && (
<div key='WebMention'>
<WebMentionComponent frontMatter={frontMatter} className='px-2' />
</div>
)}
</Tabs>
)}
</div>
) )
} }