load 优化

This commit is contained in:
tangly1024.com
2023-12-01 12:50:54 +08:00
parent 23ac2195c9
commit 3b181f3069
8 changed files with 118 additions and 61 deletions

View File

@@ -1,6 +1,6 @@
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import Tabs from '@/components/Tabs' import Tabs from '@/components/Tabs'
import { isBrowser } from '@/lib/utils' import { isBrowser, isSearchEngineBot } from '@/lib/utils'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import Artalk from './Artalk' import Artalk from './Artalk'
import { siteConfig } from '@/lib/config' import { siteConfig } from '@/lib/config'
@@ -73,6 +73,10 @@ 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()) {
return null
}
// 当连接中有特殊参数时跳转到评论区 // 当连接中有特殊参数时跳转到评论区
if (isBrowser && ('giscus' in router.query || router.query.target === 'comment')) { if (isBrowser && ('giscus' in router.query || router.query.target === 'comment')) {
setTimeout(() => { setTimeout(() => {

View File

@@ -1,4 +1,5 @@
import { siteConfig } from '@/lib/config' import { siteConfig } from '@/lib/config'
import { isSearchEngineBot } from '@/lib/utils'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import WebWhiz from './Webwhiz' import WebWhiz from './Webwhiz'
@@ -29,6 +30,10 @@ const AdBlockDetect = dynamic(() => import('@/components/AdBlockDetect'), { ssr:
* @returns * @returns
*/ */
const ExternalPlugin = (props) => { const ExternalPlugin = (props) => {
if (isSearchEngineBot()) {
return null
}
return <> return <>
{JSON.parse(siteConfig('THEME_SWITCH')) && <ThemeSwitch />} {JSON.parse(siteConfig('THEME_SWITCH')) && <ThemeSwitch />}
{JSON.parse(siteConfig('DEBUG')) && <DebugPanel />} {JSON.parse(siteConfig('DEBUG')) && <DebugPanel />}

View File

@@ -1,14 +1,41 @@
import { Component } from 'react' import { Component, useEffect, useState } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { siteConfig } from '@/lib/config' import { siteConfig } from '@/lib/config'
export default function Messenger() { export default function Messenger() {
return <MessengerCustomerChat const pageId = siteConfig('FACEBOOK_PAGE_ID')
pageId={siteConfig('FACEBOOK_PAGE_ID')} const appId = siteConfig('FACEBOOK_APP_ID')
appId={siteConfig('FACEBOOK_APP_ID')} const language = siteConfig('LANG').replace('-', '_')
language={siteConfig('LANG').replace('-', '_')}
shouldShowDialog={true} // 新增一个状态变量用于追踪是否已经滚动过
/> const [showMessenger, setShowMessenger] = useState(false);
const showTheComponent = () => {
window.removeEventListener('scroll', showTheComponent);
if (!showMessenger) {
setShowMessenger(true);
}
};
// 延时7秒或页面滚动时加载该组件
useEffect(() => {
window.addEventListener('scroll', showTheComponent);
setTimeout(() => {
showTheComponent()
}, 7000);
return () => {
window.removeEventListener('scroll', showTheComponent);
};
}, []);
return <>
{showMessenger && <MessengerCustomerChat
pageId={pageId}
appId={appId}
language={language}
shouldShowDialog={true}
/>}
</>
} }
/** /**
@@ -24,8 +51,8 @@ class MessengerCustomerChat extends Component {
} }
/** /**
* 初始化 * 初始化
*/ */
componentDidMount() { componentDidMount() {
this.setFbAsyncInit() this.setFbAsyncInit()
this.reloadSDKAsynchronously() this.reloadSDKAsynchronously()
@@ -34,19 +61,19 @@ class MessengerCustomerChat extends Component {
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
if ( if (
prevProps.pageId !== this.props.pageId || prevProps.pageId !== this.props.pageId ||
prevProps.appId !== this.props.appId || prevProps.appId !== this.props.appId ||
prevProps.shouldShowDialog !== this.props.shouldShowDialog || prevProps.shouldShowDialog !== this.props.shouldShowDialog ||
prevProps.htmlRef !== this.props.htmlRef || prevProps.htmlRef !== this.props.htmlRef ||
prevProps.minimized !== this.props.minimized || prevProps.minimized !== this.props.minimized ||
prevProps.themeColor !== this.props.themeColor || prevProps.themeColor !== this.props.themeColor ||
prevProps.loggedInGreeting !== this.props.loggedInGreeting || prevProps.loggedInGreeting !== this.props.loggedInGreeting ||
prevProps.loggedOutGreeting !== this.props.loggedOutGreeting || prevProps.loggedOutGreeting !== this.props.loggedOutGreeting ||
prevProps.greetingDialogDisplay !== this.props.greetingDialogDisplay || prevProps.greetingDialogDisplay !== this.props.greetingDialogDisplay ||
prevProps.greetingDialogDelay !== this.props.greetingDialogDelay || prevProps.greetingDialogDelay !== this.props.greetingDialogDelay ||
prevProps.autoLogAppEvents !== this.props.autoLogAppEvents || prevProps.autoLogAppEvents !== this.props.autoLogAppEvents ||
prevProps.xfbml !== this.props.xfbml || prevProps.xfbml !== this.props.xfbml ||
prevProps.version !== this.props.version || prevProps.version !== this.props.version ||
prevProps.language !== this.props.language prevProps.language !== this.props.language
) { ) {
this.setFbAsyncInit() this.setFbAsyncInit()
this.reloadSDKAsynchronously() this.reloadSDKAsynchronously()
@@ -60,8 +87,8 @@ class MessengerCustomerChat extends Component {
} }
/** /**
* 初始化 * 初始化
*/ */
setFbAsyncInit() { setFbAsyncInit() {
const { appId, autoLogAppEvents, xfbml, version } = this.props const { appId, autoLogAppEvents, xfbml, version } = this.props
@@ -80,18 +107,18 @@ class MessengerCustomerChat extends Component {
loadSDKAsynchronously() { loadSDKAsynchronously() {
const { language } = this.props; const { language } = this.props;
/* eslint-disable */ /* eslint-disable */
(function (d, s, id) { (function (d, s, id) {
var js, var js,
fjs = d.getElementsByTagName(s)[0]; fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) { if (d.getElementById(id)) {
return; return;
} }
js = d.createElement(s); js = d.createElement(s);
js.id = id; js.id = id;
js.src = `https://connect.facebook.net/${language}/sdk/xfbml.customerchat.js`; js.src = `https://connect.facebook.net/${language}/sdk/xfbml.customerchat.js`;
fjs.parentNode.insertBefore(js, fjs); fjs.parentNode.insertBefore(js, fjs);
})(document, 'script', 'facebook-jssdk'); })(document, 'script', 'facebook-jssdk');
/* eslint-enable */ /* eslint-enable */
} }
removeFacebookSDK() { removeFacebookSDK() {
@@ -147,25 +174,25 @@ class MessengerCustomerChat extends Component {
const refAttribute = htmlRef !== undefined ? `ref="${htmlRef}"` : '' const refAttribute = htmlRef !== undefined ? `ref="${htmlRef}"` : ''
const minimizedAttribute = const minimizedAttribute =
minimized !== undefined ? `minimized="${minimized}"` : '' minimized !== undefined ? `minimized="${minimized}"` : ''
const themeColorAttribute = const themeColorAttribute =
themeColor !== undefined ? `theme_color="${themeColor}"` : '' themeColor !== undefined ? `theme_color="${themeColor}"` : ''
const loggedInGreetingAttribute = const loggedInGreetingAttribute =
loggedInGreeting !== undefined loggedInGreeting !== undefined
? `logged_in_greeting="${loggedInGreeting}"` ? `logged_in_greeting="${loggedInGreeting}"`
: '' : ''
const loggedOutGreetingAttribute = const loggedOutGreetingAttribute =
loggedOutGreeting !== undefined loggedOutGreeting !== undefined
? `logged_out_greeting="${loggedOutGreeting}"` ? `logged_out_greeting="${loggedOutGreeting}"`
: '' : ''
const greetingDialogDisplayAttribute = const greetingDialogDisplayAttribute =
greetingDialogDisplay !== undefined greetingDialogDisplay !== undefined
? `greeting_dialog_display="${greetingDialogDisplay}"` ? `greeting_dialog_display="${greetingDialogDisplay}"`
: '' : ''
const greetingDialogDelayAttribute = const greetingDialogDelayAttribute =
greetingDialogDelay !== undefined greetingDialogDelay !== undefined
? `greeting_dialog_delay="${greetingDialogDelay}"` ? `greeting_dialog_delay="${greetingDialogDelay}"`
: '' : ''
return { return {
__html: `<div __html: `<div
@@ -192,8 +219,8 @@ class MessengerCustomerChat extends Component {
const element = event.target const element = event.target
if ( if (
element.className && element.className &&
typeof element.className === 'string' && typeof element.className === 'string' &&
element.className.includes('fb_dialog') element.className.includes('fb_dialog')
) { ) {
this.controlPlugin() this.controlPlugin()
} }

View File

@@ -5,6 +5,7 @@ import ShareButtons from './ShareButtons'
const ShareBar = ({ post }) => { const ShareBar = ({ post }) => {
const router = useRouter() const router = useRouter()
const title = siteConfig('TITLE')
if (!JSON.parse(siteConfig('POST_SHARE_BAR_ENABLE')) || !post || post?.type !== 'Post') { if (!JSON.parse(siteConfig('POST_SHARE_BAR_ENABLE')) || !post || post?.type !== 'Post') {
return <></> return <></>
@@ -17,7 +18,7 @@ const ShareBar = ({ post }) => {
<ShareButtons shareUrl={shareUrl} title={post.title} image={post.pageCover} body={ <ShareButtons shareUrl={shareUrl} title={post.title} image={post.pageCover} body={
post?.title + post?.title +
' | ' + ' | ' +
siteConfig('TITLE') + title +
' ' + ' ' +
shareUrl + shareUrl +
' ' + ' ' +

View File

@@ -336,7 +336,7 @@ const ShareButtons = ({ shareUrl, title, body, image }) => {
} }
if (singleService === 'qq') { if (singleService === 'qq') {
return <button key={singleService} className='cursor-pointer bg-blue-600 text-white rounded-full mx-1'> return <button key={singleService} className='cursor-pointer bg-blue-600 text-white rounded-full mx-1'>
<a target='_blank' rel='noreferrer' href={`http://connect.qq.com/widget/shareqq/index.html?url=${shareUrl}&sharesource=qzone&title=${title}&desc=${body}`} > <a target='_blank' rel='noreferrer' aria-label="Share by QQ" href={`http://connect.qq.com/widget/shareqq/index.html?url=${shareUrl}&sharesource=qzone&title=${title}&desc=${body}`} >
<i className='fab fa-qq w-8' /> <i className='fab fa-qq w-8' />
</a> </a>
</button> </button>

View File

@@ -7,6 +7,27 @@ import { memo } from 'react'
*/ */
export const isBrowser = typeof window !== 'undefined' export const isBrowser = typeof window !== 'undefined'
/**
* google机器人
* @returns
*/
export const isSearchEngineBot = () => {
if (typeof navigator === 'undefined') {
return false
}
// 获取用户代理字符串
const userAgent = navigator.userAgent;
const isEngine = /Googlebot|bingbot|Baidu/.test(userAgent);
if (isEngine) {
console.warn('爬虫', userAgent)
} else {
console.error('u-a', userAgent)
}
// 使用正则表达式检测是否包含搜索引擎爬虫关键字
return isEngine
}
/** /**
* 组件持久化 * 组件持久化
*/ */

View File

@@ -6,10 +6,12 @@ import { siteConfig } from '@/lib/config'
* @returns * @returns
*/ */
export const TopBar = (props) => { export const TopBar = (props) => {
if (siteConfig('SIMPLE_TOP_BAR_CONTENT', null, CONFIG)) { const content = siteConfig('SIMPLE_TOP_BAR_CONTENT', null, CONFIG)
if (content) {
return <header className="flex justify-center items-center bg-black dark:bg-hexo-black-gray"> return <header className="flex justify-center items-center bg-black dark:bg-hexo-black-gray">
<div id='top-bar-inner' className='max-w-9/10 w-full z-20'> <div id='top-bar-inner' className='max-w-9/10 w-full z-20'>
<div className='text-xs text-center float-left text-white z-50 leading-5 py-2.5' dangerouslySetInnerHTML={{ __html: siteConfig('SIMPLE_TOP_BAR_CONTENT', null, CONFIG) }}/> <div className='text-xs text-center float-left text-white z-50 leading-5 py-2.5' dangerouslySetInnerHTML={{ __html: content }}/>
</div> </div>
</header> </header>
} }

View File

@@ -2,7 +2,7 @@ import CONFIG from './config'
import { BlogListPage } from './components/BlogListPage' import { BlogListPage } from './components/BlogListPage'
import { BlogListScroll } from './components/BlogListScroll' import { BlogListScroll } from './components/BlogListScroll'
import { useEffect } from 'react' import { useEffect } from 'react'
import { isBrowser, loadExternalResource } from '@/lib/utils' import { isBrowser } from '@/lib/utils'
import BlogArchiveItem from './components/BlogArchiveItem' import BlogArchiveItem from './components/BlogArchiveItem'
import { ArticleLock } from './components/ArticleLock' import { ArticleLock } from './components/ArticleLock'
import NotionPage from '@/components/NotionPage' import NotionPage from '@/components/NotionPage'
@@ -37,9 +37,6 @@ const LayoutBase = props => {
const { children, slotTop, meta } = props const { children, slotTop, meta } = props
const { onLoading } = useGlobal() const { onLoading } = useGlobal()
if (isBrowser) {
loadExternalResource('/css/theme-simple.css', 'css')
}
return ( return (
<div id='theme-simple' className='min-h-screen flex flex-col dark:text-gray-300 bg-white dark:bg-black'> <div id='theme-simple' className='min-h-screen flex flex-col dark:text-gray-300 bg-white dark:bg-black'>
{/* SEO相关 */} {/* SEO相关 */}