1
1
import { siteConfig } from '@/lib/config'
2
2
import { useGlobal } from '@/lib/global'
3
+ import { loadExternalResource } from '@/lib/utils'
3
4
import Head from 'next/head'
4
5
import { useRouter } from 'next/router'
6
+ import { useEffect } from 'react'
5
7
6
8
/**
7
9
* 页面的Head头,通常有用于SEO
@@ -10,7 +12,9 @@ import { useRouter } from 'next/router'
10
12
*/
11
13
const GlobalHead = props => {
12
14
const { children, siteInfo } = props
13
- let url = siteConfig ( 'PATH' ) ?. length ? `${ siteConfig ( 'LINK' ) } /${ siteConfig ( 'SUB_PATH' , '' ) } ` : siteConfig ( 'LINK' )
15
+ let url = siteConfig ( 'PATH' ) ?. length
16
+ ? `${ siteConfig ( 'LINK' ) } /${ siteConfig ( 'SUB_PATH' , '' ) } `
17
+ : siteConfig ( 'LINK' )
14
18
let image
15
19
const router = useRouter ( )
16
20
const meta = getSEOMeta ( props , router , useGlobal ( ) )
@@ -24,19 +28,50 @@ const GlobalHead = props => {
24
28
const keywords = meta ?. tags || siteConfig ( 'KEYWORDS' )
25
29
const lang = siteConfig ( 'LANG' ) . replace ( '-' , '_' ) // Facebook OpenGraph 要 zh_CN 這樣的格式才抓得到語言
26
30
const category = meta ?. category || siteConfig ( 'KEYWORDS' ) // section 主要是像是 category 這樣的分類,Facebook 用這個來抓連結的分類
31
+ const favicon = siteConfig ( 'BLOG_FAVICON' )
32
+ const webFontUrl = siteConfig ( 'FONT_URL' )
33
+
34
+ useEffect ( ( ) => {
35
+ // 使用WebFontLoader字体加载
36
+ loadExternalResource (
37
+ 'https://cdnjs.cloudflare.com/ajax/libs/webfont/1.6.28/webfontloader.js' ,
38
+ 'js'
39
+ ) . then ( url => {
40
+ const WebFont = window ?. WebFont
41
+ if ( WebFont ) {
42
+ console . log ( 'LoadWebFont' , webFontUrl )
43
+ WebFont . load ( {
44
+ custom : {
45
+ // families: ['"LXGW WenKai"'],
46
+ urls : webFontUrl
47
+ }
48
+ } )
49
+ }
50
+ } )
51
+ } , [ ] )
27
52
28
53
return (
29
54
< Head >
55
+ < link rel = 'icon' href = { favicon } />
30
56
< title > { title } </ title >
31
57
< meta name = 'theme-color' content = { siteConfig ( 'BACKGROUND_DARK' ) } />
32
- < meta name = 'viewport' content = 'width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0' />
58
+ < meta
59
+ name = 'viewport'
60
+ content = 'width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0'
61
+ />
33
62
< meta name = 'robots' content = 'follow, index' />
34
63
< meta charSet = 'UTF-8' />
35
64
{ siteConfig ( 'SEO_GOOGLE_SITE_VERIFICATION' ) && (
36
- < meta name = 'google-site-verification' content = { siteConfig ( 'SEO_GOOGLE_SITE_VERIFICATION' ) } />
65
+ < meta
66
+ name = 'google-site-verification'
67
+ content = { siteConfig ( 'SEO_GOOGLE_SITE_VERIFICATION' ) }
68
+ />
37
69
) }
38
70
{ siteConfig ( 'SEO_BAIDU_SITE_VERIFICATION' ) && (
39
- < meta name = 'baidu-site-verification' content = { siteConfig ( 'SEO_BAIDU_SITE_VERIFICATION' ) } />
71
+ < meta
72
+ name = 'baidu-site-verification'
73
+ content = { siteConfig ( 'SEO_BAIDU_SITE_VERIFICATION' ) }
74
+ />
40
75
) }
41
76
< meta name = 'keywords' content = { keywords } />
42
77
< meta name = 'description' content = { description } />
@@ -57,13 +92,17 @@ const GlobalHead = props => {
57
92
rel = 'webmention'
58
93
href = { `https://webmention.io/${ siteConfig ( 'COMMENT_WEBMENTION_HOSTNAME' ) } /webmention` }
59
94
/>
60
- < link rel = 'pingback' href = { `https://webmention.io/${ siteConfig ( 'COMMENT_WEBMENTION_HOSTNAME' ) } /xmlrpc` } />
95
+ < link
96
+ rel = 'pingback'
97
+ href = { `https://webmention.io/${ siteConfig ( 'COMMENT_WEBMENTION_HOSTNAME' ) } /xmlrpc` }
98
+ />
61
99
</ >
62
100
) }
63
101
64
- { siteConfig ( 'COMMENT_WEBMENTION_ENABLE' ) && siteConfig ( 'COMMENT_WEBMENTION_AUTH' ) !== '' && (
65
- < link href = { siteConfig ( 'COMMENT_WEBMENTION_AUTH' ) } rel = 'me' />
66
- ) }
102
+ { siteConfig ( 'COMMENT_WEBMENTION_ENABLE' ) &&
103
+ siteConfig ( 'COMMENT_WEBMENTION_AUTH' ) !== '' && (
104
+ < link href = { siteConfig ( 'COMMENT_WEBMENTION_AUTH' ) } rel = 'me' />
105
+ ) }
67
106
68
107
{ JSON . parse ( siteConfig ( 'ANALYTICS_BUSUANZI_ENABLE' ) ) && (
69
108
< meta name = 'referrer' content = 'no-referrer-when-downgrade' />
@@ -73,7 +112,10 @@ const GlobalHead = props => {
73
112
< meta property = 'article:published_time' content = { meta . publishDay } />
74
113
< meta property = 'article:author' content = { siteConfig ( 'AUTHOR' ) } />
75
114
< meta property = 'article:section' content = { category } />
76
- < meta property = 'article:publisher' content = { siteConfig ( 'FACEBOOK_PAGE' ) } />
115
+ < meta
116
+ property = 'article:publisher'
117
+ content = { siteConfig ( 'FACEBOOK_PAGE' ) }
118
+ />
77
119
</ >
78
120
) }
79
121
{ children }
@@ -181,7 +223,9 @@ const getSEOMeta = (props, router, global) => {
181
223
}
182
224
default :
183
225
return {
184
- title : post ? `${ post ?. title } | ${ siteInfo ?. title } ` : `${ siteInfo ?. title } | loading` ,
226
+ title : post
227
+ ? `${ post ?. title } | ${ siteInfo ?. title } `
228
+ : `${ siteInfo ?. title } | loading` ,
185
229
description : post ?. summary ,
186
230
type : post ?. type ,
187
231
slug : post ?. slug ,
0 commit comments