fix: migrate vueuse/head to unhead & scheme-org, close #232

This commit is contained in:
YunYouJun 2023-10-06 03:21:03 +08:00
parent d09a917916
commit d23649ed20
20 changed files with 118 additions and 111 deletions

View File

@ -9,6 +9,7 @@
"lightgallery",
"twikoo",
"unconfig",
"unhead",
"vala",
"valaxy",
"valaxyjs"

View File

@ -1,14 +1,21 @@
---
title: Schema.org for SEO
title_zh-CN: Schema.org for SEO
title: Schema.org And OPG for SEO
title_zh-CN: Schema.org And OPG for SEO
categories:
- third
top: 0
---
::: tip
[OpenGraph or Scheme.org](https://stackoverflow.com/questions/6402528/opengraph-or-schema-org)
- [The Open Graph protocol](https://ogp.me/)
- [Schema.org](https://schema.org/)
:::
采用 [Schema.org](https://schema.org/) 标准,可以让搜索引擎更好地理解网站内容,从而提高网站在搜索结果中的排名。
基于 [@vueuse/schema-org](https://unhead-schema-org.harlanzw.com/) 实现。
基于 [@unhead/schema-org](https://unhead.unjs.io/schema-org/) 实现。
- Identity 采用了 Person (Personal Website or Blog)

View File

@ -162,7 +162,7 @@ export interface ValaxyConfig {
```vue
<!-- valaxy-theme-yun/App.vue -->
<script lang="ts" setup>
import { useHead } from '@vueuse/head'
import { useHead } from '@unhead/vue'
import { useAppStore } from 'valaxy'
import { onMounted } from 'vue'

View File

@ -1,3 +1,13 @@
<script setup lang="ts">
import { defineArticle, useSchemaOrg } from '@unhead/schema-org'
useSchemaOrg([
defineArticle({
'@type': 'Article',
}),
])
</script>
<template>
<Layout>
<PressArticle />

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { useHead } from '@vueuse/head'
import { useHead } from '@unhead/vue'
import { useAppStore, useSiteConfig } from 'valaxy'
import { onMounted } from 'vue'
import { useThemeConfig } from './composables'

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { defineWebPage, useSchemaOrg } from '@vueuse/schema-org'
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org'
import { useFrontmatter, usePostTitle } from 'valaxy'
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { defineWebPage, useSchemaOrg } from '@vueuse/schema-org'
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org'
import { useFrontmatter, usePostTitle, useSiteStore } from 'valaxy'
import { useI18n } from 'vue-i18n'

View File

@ -3,7 +3,7 @@ import { computed } from 'vue'
import { useCategories, useFrontmatter, usePostTitle, useSiteStore } from 'valaxy'
import { useI18n } from 'vue-i18n'
import { useRoute } from 'vue-router'
import { defineWebPage, useSchemaOrg } from '@vueuse/schema-org'
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org'
const { t } = useI18n()

View File

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { defineWebPage, useSchemaOrg } from '@vueuse/schema-org'
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org'
import { useFrontmatter, usePostTitle, useRuntimeConfig } from 'valaxy'
import { computed, defineAsyncComponent } from 'vue'
import { useI18n } from 'vue-i18n'

View File

@ -2,7 +2,7 @@
import { computed } from 'vue'
import { useFrontmatter, useFullUrl, useSiteConfig } from 'valaxy'
import { defineArticle, useSchemaOrg } from '@vueuse/schema-org'
import { defineArticle, useSchemaOrg } from '@unhead/schema-org'
const siteConfig = useSiteConfig()
const frontmatter = useFrontmatter()

View File

@ -3,7 +3,7 @@ import { useFrontmatter, useInvisibleElement, usePostTitle, useSiteStore } from
import { useI18n } from 'vue-i18n'
import { computed, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { defineWebPage, useSchemaOrg } from '@vueuse/schema-org'
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org'
import { useThemeConfig, useYunTags } from '../composables'
useSchemaOrg([

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import { computed, onBeforeMount } from 'vue'
import { useHead, useSeoMeta } from '@vueuse/head'
import { useHead, useSeoMeta } from '@unhead/vue'
// @ts-expect-error virtual module
import ValaxyUserApp from '/@valaxyjs/UserAppVue'
@ -9,7 +9,7 @@ import ValaxyUserApp from '/@valaxyjs/UserAppVue'
import ValaxyThemeApp from '/@valaxyjs/ThemeAppVue'
import pkg from 'valaxy/package.json'
import { useI18n } from 'vue-i18n'
import { definePerson, defineWebPage, defineWebSite, useSchemaOrg } from '@vueuse/schema-org'
import { definePerson, defineWebPage, defineWebSite, useSchemaOrg } from '@unhead/schema-org'
import dayjs from 'dayjs'
import ValaxyAddons from './components/ValaxyAddons.vue'
import { isDark, useFrontmatter } from './composables'
@ -55,6 +55,12 @@ useHead({
content: `Valaxy ${pkg.version}`,
},
],
templateParams: {
schemaOrg: {
host: siteConfig.value.url,
},
},
})
// seo
@ -70,21 +76,22 @@ useSeoMeta({
ogSiteName: computed(() => siteConfig.value.title),
ogTitle: computed(() => fm.value.title || siteConfig.value.title),
ogImage: computed(() => fm.value.ogImage || fm.value.cover || siteConfig.value.favicon),
ogType: 'website',
ogUrl: siteUrl,
})
// for SEO
useSchemaOrg([
// https://unhead-schema-org.harlanzw.com//guide/guides/identity.html
// https://unhead.unjs.io/guide/guides/identity.html
// Personal Website or Blog
definePerson({
name: computed(() => siteConfig.value.author.name),
url: siteUrl,
image: computed(() => siteConfig.value.author.avatar),
sameAs: computed(() => siteConfig.value.social.map(s => s.link)),
name: siteConfig.value.author.name,
url: siteUrl.value,
image: siteConfig.value.author.avatar,
sameAs: siteConfig.value.social.map(s => s.link),
}),
defineWebSite({
name: title,
name: title.value,
datePublished: computed(() => fm.value.date),
dateModified: computed(() => fm.value.updated),
}),

View File

@ -1,5 +1,5 @@
import { useScriptTag } from '@vueuse/core'
import { useHead } from '@vueuse/head'
import { useHead } from '@unhead/vue'
import { computed } from 'vue'
import { useSiteConfig } from '../..'

View File

@ -1,4 +1,4 @@
import { useHead } from '@vueuse/head'
import { useHead } from '@unhead/vue'
/**
* @deprecated

View File

@ -9,7 +9,7 @@ export const install: UserModule = async ({ head, isClient, router }) => {
const valaxyConfig = initValaxyConfig()
const { SchemaOrgUnheadPlugin } = await import('@vueuse/schema-org')
const { SchemaOrgUnheadPlugin } = await import('@unhead/schema-org')
head?.use(SchemaOrgUnheadPlugin({
// config
host: valaxyConfig.value.siteConfig.url || 'https://valaxy.site',

View File

@ -12,9 +12,9 @@ import { getIndexHtml } from '../common'
* dependencies used by client
*/
const clientDeps = [
'@vueuse/schema-org',
'@unhead/schema-org',
'@unhead/vue',
'@vueuse/head',
'@vueuse/integrations/useFuse',
'body-scroll-lock',

View File

@ -8,6 +8,8 @@ import Layouts from 'vite-plugin-vue-layouts'
import Components from 'unplugin-vue-components/vite'
import VueI18n from '@intlify/unplugin-vue-i18n/vite'
import UnheadVite from '@unhead/addons/vite'
import type { ResolvedValaxyOptions, ValaxyServerOptions } from '../options'
import { setupMarkdownPlugins } from '../markdown'
@ -78,6 +80,7 @@ export async function ViteValaxyPlugins(
...valaxyConfig.vue,
}),
UnheadVite(),
createConfigPlugin(options),
createClientSetupPlugin(options),
createValaxyPlugin(options, serverOptions),

View File

@ -64,11 +64,12 @@
"@iconify-json/ri": "^1.1.12",
"@intlify/unplugin-vue-i18n": "^1.4.0",
"@types/body-scroll-lock": "^3.1.0",
"@unhead/addons": "^1.7.4",
"@unhead/schema-org": "^1.7.4",
"@unhead/vue": "^1.7.4",
"@vitejs/plugin-vue": "^4.4.0",
"@vueuse/core": "^10.4.1",
"@vueuse/head": "^2.0.0",
"@vueuse/integrations": "^10.4.1",
"@vueuse/schema-org": "^2.2.0",
"body-scroll-lock": "4.0.0-beta.0",
"consola": "^3.2.3",
"critters": "^0.0.20",

View File

@ -48,7 +48,8 @@ export interface SiteConfig {
timezone: string
/**
* You site url in web, required for ssg & rss
* @description URLSSG & RSS
* @description URLSSG & RSS
* @example 'https://valaxy.site'
* @default '/'
*/
url: string

View File

@ -217,21 +217,24 @@ importers:
'@types/body-scroll-lock':
specifier: ^3.1.0
version: 3.1.0
'@unhead/addons':
specifier: ^1.7.4
version: 1.7.4(rollup@3.29.0)
'@unhead/schema-org':
specifier: ^1.7.4
version: 1.7.4(@unhead/shared@1.7.4)(unhead@1.7.4)
'@unhead/vue':
specifier: ^1.7.4
version: 1.7.4(vue@3.3.4)
'@vitejs/plugin-vue':
specifier: ^4.4.0
version: 4.4.0(vite@4.4.11)(vue@3.3.4)
'@vueuse/core':
specifier: ^10.4.1
version: 10.4.1(vue@3.3.4)
'@vueuse/head':
specifier: ^2.0.0
version: 2.0.0(vue@3.3.4)
'@vueuse/integrations':
specifier: ^10.4.1
version: 10.4.1(fuse.js@6.6.2)(nprogress@0.2.0)(qrcode@1.5.3)(vue@3.3.4)
'@vueuse/schema-org':
specifier: ^2.2.0
version: 2.2.0(@unhead/vue@1.7.4)(@vueuse/head@2.0.0)(vue@3.3.4)
body-scroll-lock:
specifier: 4.0.0-beta.0
version: 4.0.0-beta.0
@ -754,7 +757,6 @@ packages:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.19
jsesc: 2.5.2
dev: true
/@babel/helper-annotate-as-pure@7.22.5:
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
@ -3336,11 +3338,19 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
/@unhead/dom@1.7.3:
resolution: {integrity: sha512-igJ2ZxU5x4CQQQ3iM+CPOPHdjpam/Q89xIvDSE0crK11TU00WOl0bWl1yQp/EI0pyza1G3ZQ1JyDmi7OcCM9eQ==}
/@unhead/addons@1.7.4(rollup@3.29.0):
resolution: {integrity: sha512-7WdtWujO9H7R+25Pygr+UjJgP19SVNnyVRVJS5DC985pMMeWaaweS7G/ibLJKPWx32s/Af1UEAkWu9dLyoAxTg==}
dependencies:
'@unhead/schema': 1.7.3
'@unhead/shared': 1.7.3
'@rollup/pluginutils': 5.0.4(rollup@3.29.0)
'@unhead/schema': 1.7.4
'@unhead/shared': 1.7.4
magic-string: 0.30.3
mlly: 1.4.2
ufo: 1.3.0
unplugin: 1.4.0
unplugin-ast: 0.8.2(rollup@3.29.0)
transitivePeerDependencies:
- rollup
dev: false
/@unhead/dom@1.7.4:
@ -3350,20 +3360,15 @@ packages:
'@unhead/shared': 1.7.4
dev: false
/@unhead/schema-org-vue@0.6.0(@unhead/vue@1.7.4):
resolution: {integrity: sha512-2zTVczJ8iI8jDOzaz2md8fr8j+jWqkmMdo89OI/VVPYWpA6Cy2BFCMvDqrptBZ2h3ieOZ/lhA/y+cTobBZEvaQ==}
engines: {node: '>=14.0.0'}
/@unhead/schema-org@1.7.4(@unhead/shared@1.7.4)(unhead@1.7.4):
resolution: {integrity: sha512-9mXvkg7ZdIdgi5bynZsJpc/hoy+ES3K6+QrC8G1VsJhvkBj2wOpxkw+CZXAoajc09A1UWG2TlIGqhZpx3SavvQ==}
peerDependencies:
'@unhead/vue': '>=1.1.9'
'@unhead/shared': 1.7.4
unhead: '>=1.7.3'
dependencies:
'@unhead/vue': 1.7.4(vue@3.3.4)
dev: false
/@unhead/schema@1.7.3:
resolution: {integrity: sha512-w2Yvt1++bAnSmsYc7bwLTMalSbff6HFnNmlpFIjNUTSkquOg+oavm62TrgxAwq753dedDOzCXr5cUvzCswc2Yg==}
dependencies:
hookable: 5.5.3
zhead: 2.1.1
'@unhead/shared': 1.7.4
ufo: 1.3.0
unhead: 1.7.4
dev: false
/@unhead/schema@1.7.4:
@ -3373,37 +3378,12 @@ packages:
zhead: 2.1.1
dev: false
/@unhead/shared@1.7.3:
resolution: {integrity: sha512-eqAn3n+T6WMecDUzdqGyedpZwT0u04pZwHEvD0bxmVen1FU6VHiL49azyv1W7MCiCHNFNAcR1py2Eolsr6+E7g==}
dependencies:
'@unhead/schema': 1.7.3
dev: false
/@unhead/shared@1.7.4:
resolution: {integrity: sha512-YUNA2UxAuDPnDps41BQ8aEIY5hdyvruSB1Vs3AALhRo07MxMivSq5DjNKfYr/JvRN6593RtfI1NHnP9x5M57xA==}
dependencies:
'@unhead/schema': 1.7.4
dev: false
/@unhead/ssr@1.7.3:
resolution: {integrity: sha512-icN3OmrbuXd0NbqarGRa3ixeqdpQzhldTzcN3LPHpmfgN+CFVS7kI9oo5znoIjW7nZaxAUH95knyAi1+Mt6ThQ==}
dependencies:
'@unhead/schema': 1.7.3
'@unhead/shared': 1.7.3
dev: false
/@unhead/vue@1.7.3(vue@3.3.4):
resolution: {integrity: sha512-QSy2Qsc4IurrRrvpnnNzBWL/g4ecz3eblSVJ41QwqBnaUIRdPaSY8EdobA/NR0rtWzHicV6Fy3nEYXSXSRDELQ==}
peerDependencies:
vue: '>=2.7 || >=3'
dependencies:
'@unhead/schema': 1.7.3
'@unhead/shared': 1.7.3
hookable: 5.5.3
unhead: 1.7.3
vue: 3.3.4
dev: false
/@unhead/vue@1.7.4(vue@3.3.4):
resolution: {integrity: sha512-ZfgzOhg1Bxo9xwp3upawqerw4134hc9Lhz6t005ixcBwPX+39Wpgc9dC3lf+owFQEVuWkf8F+eAwK2sghVBK4A==}
peerDependencies:
@ -3805,18 +3785,6 @@ packages:
- '@vue/composition-api'
- vue
/@vueuse/head@2.0.0(vue@3.3.4):
resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==}
peerDependencies:
vue: '>=2.7 || >=3'
dependencies:
'@unhead/dom': 1.7.3
'@unhead/schema': 1.7.3
'@unhead/ssr': 1.7.3
'@unhead/vue': 1.7.3(vue@3.3.4)
vue: 3.3.4
dev: false
/@vueuse/integrations@10.4.1(focus-trap@7.5.2)(vue@3.3.4):
resolution: {integrity: sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==}
peerDependencies:
@ -3922,20 +3890,6 @@ packages:
/@vueuse/metadata@10.4.1:
resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==}
/@vueuse/schema-org@2.2.0(@unhead/vue@1.7.4)(@vueuse/head@2.0.0)(vue@3.3.4):
resolution: {integrity: sha512-9x3ZPiRoX4Q2U42jzqOdHTkrJRd0m3p7cVg/4pByqwOub/dWSq53OdNEqZjaa12w0/R0FIGTWkKV1uwonhqPnA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@vueuse/head': '>=1.0.21'
vue: '>=3.2.0'
dependencies:
'@unhead/schema-org-vue': 0.6.0(@unhead/vue@1.7.4)
'@vueuse/head': 2.0.0(vue@3.3.4)
vue: 3.3.4
transitivePeerDependencies:
- '@unhead/vue'
dev: false
/@vueuse/shared@10.4.1(vue@3.3.4):
resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==}
dependencies:
@ -4173,6 +4127,17 @@ packages:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
dev: true
/ast-kit@0.6.9(rollup@3.29.0):
resolution: {integrity: sha512-2XZi+wqlluYQcxJ1G8qE/U0IeO5CbxUyv1lnSdD7ByJtd5Z3+1063Q6IHbRaYkka1Kb6WgGqEkBrSMaBtbHuFQ==}
engines: {node: '>=16.14.0'}
dependencies:
'@babel/parser': 7.22.10
'@rollup/pluginutils': 5.0.4(rollup@3.29.0)
pathe: 1.1.1
transitivePeerDependencies:
- rollup
dev: false
/astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
@ -7036,7 +7001,6 @@ packages:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'}
hasBin: true
dev: true
/jsesc@3.0.2:
resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
@ -7359,6 +7323,13 @@ packages:
dependencies:
yallist: 4.0.0
/magic-string-ast@0.1.3:
resolution: {integrity: sha512-nnNhBSh8QAd90n3CQeyxKlXY4TKJ4PNjFRi7Ofs1dAr239k6H4CYAaAR4ZKRrWZNBvh1IUTl5dYP91t9dKDjig==}
engines: {node: '>=16.14.0'}
dependencies:
magic-string: 0.30.3
dev: false
/magic-string@0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
dependencies:
@ -9474,15 +9445,6 @@ packages:
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
dev: true
/unhead@1.7.3:
resolution: {integrity: sha512-6LbBOVgsr+JCmeWH9okxlBtMtFHGIECX93ySWBnposnOqzSUtnUsEgB0nVB8Qa7uozfHlmJfSBJMUeTztzPfSQ==}
dependencies:
'@unhead/dom': 1.7.3
'@unhead/schema': 1.7.3
'@unhead/shared': 1.7.3
hookable: 5.5.3
dev: false
/unhead@1.7.4:
resolution: {integrity: sha512-oOv+9aQS85DQUd0f1uJBtb2uG3SKwCURSTuUWp9WKKzANCb1TjW2dWp5TFmJH5ILF6urXi4uUQfjK+SawzBJAA==}
dependencies:
@ -9585,6 +9547,21 @@ packages:
engines: {node: '>= 0.8'}
dev: true
/unplugin-ast@0.8.2(rollup@3.29.0):
resolution: {integrity: sha512-PS8t1Ig8O0Pzn1Zpi9pRMTiAS/Xa+TgYZOPwe7s5JBte5aVBpZ7YKmd3cfvliahO+YMRgphAGZtUYi6RLqs0YQ==}
engines: {node: '>=16.14.0'}
dependencies:
'@antfu/utils': 0.7.6
'@babel/generator': 7.22.10
'@babel/parser': 7.22.10
'@rollup/pluginutils': 5.0.4(rollup@3.29.0)
ast-kit: 0.6.9(rollup@3.29.0)
magic-string-ast: 0.1.3
unplugin: 1.4.0
transitivePeerDependencies:
- rollup
dev: false
/unplugin-vue-components@0.25.2(rollup@3.29.0)(vue@3.3.4):
resolution: {integrity: sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==}
engines: {node: '>=14'}