Head 設置 (SEO and Meta) #
透過 <head>
相關設置,可以強化 Nuxt
應用程式 SEO 的表現。
在 Nuxt
中有不同的 Head 設置方式:
1️⃣ 全站靜態設置 config #
可以在 nuxt.config
檔案內,app.head
來設置 整個應用程式 需要的夾帶「靜態」資訊。 參考更多 app.head
默認生成的 meta 內容:
charset
: 'utf-8'viewport
: 'width=device-width, initial-scale=1'
js
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
app: {
head: {
title: 'Nuxt3 App',
meta: [
{ name: 'title', content: 'Nuxt3 title' },
{ name: 'description', content: '網站描述文字' },
{ property: 'og:title', content: '社群標題' },
{ property: 'og:type', content: 'website' },
{ property: 'og:image', content: 'https://miro.medium.com/max/1000/1*qJppTMduXXhjgU2tZt9SfQ.png'},
{ property: 'og:description', content: '社群描述文字'}
],
script: [
{ src: 'https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js' }
]
}
}
})
提示
這個設置方式是「靜態」資料,若內容是「動態」的資料,請使用 組件腳本設置 useHead。
2️⃣ 組件腳本設置 useHead #
Nuxt
提供了一個組合函式 useHead
可以讓你在想要的頁面或 app.vue
設置頁面 head
內容,這是可以使用「動態」的資料。
可設置參數: 更多設置
title
頁面標題script
腳本style
樣式meta
信息bodyAttrs
為<body>
添加屬性
Example
vue
<script setup>
const pageTitle = ref('')
const pageDescription = ref('')
pageTitle.value = 'About TITLE'
pageDescription.value = 'about description content'
const useOgTitle = () => ({
property: 'og:title',
content: pageTitle.value + 111,
})
useHead({
title: pageTitle,
meta: [
{ name: 'description', content: pageDescription },
useOgTitle()
],
bodyAttrs: {
class: 'body-class',
id: 'app'
}
})
</script>
提醒
在頁面內設置的 useHead
內容,會覆蓋過 全站靜態設置 config。
注意
優先權: 模板設置 > 腳本設置
3️⃣ 模板設置 template #
在元件中 Nuxt
也提供了類似原生 tag 的標籤方法,一般常見的 head
內容都可以直接設置,而且是「動態」的。
<Head>
<Meta>
<Title>
<NoScript>
注意
由於這些都跟原生 html 標籤一樣,所以必須是 大寫開頭 設置。
vue
<template>
<div>
<Head>
<Title>{{ title }}</Title>
<Meta property="og:title" :content="title" />
</Head>
<NuxtPage />
</div>
</template>
<script setup>
const title = ref('App Title')
</script>
標題模版 titleTemplate #
在 useHead
中 titleTemplate
屬性,可以客製化的調整整個應用程式的 title
,可以針對 每個頁面 標題做修改。 如果使用這個方法,就不需在在 nuxt.config
中設置 title
了,只需要一次性的在 app.vue
設置就可以了。
提供功能
當頁面沒有設置 title
它提供了基本的標題,或也可以一次性為所有頁面的標題「加料」。
app.vue
vue
<script setup>
useHead({
titleTemplate: (titleChunk) => {
return titleChunk ? titleChunk + ' - 加料文字 ' : '默認標題'
}
})
</script>
titleChunk
默認的title
設置
提醒
若 titleTemplate
為函式,回傳 null
時為默認 title
。
Body 插入腳本設置 #
基本 useHead
的設置都是加入在 <head>
當中,若在 script
設置中加入 body: true
可以讓 <script>
在 <body>
內的最未端置入。
操作
vue
<script setup>
useHead({
script: [
{
src: 'https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js',
body: true
},
{
src: 'https://cdnjs.cloudflare.com/ajax/libs/axios/1.2.2/axios.min.js',
body: true
}
]
})
</script>
html 生成
html
<body class="body-class" id="app">
...
<script type="module" src="/_nuxt/workspaces/nuxt3-test-20221223/node_modules/nuxt/dist/app/entry.mjs" crossorigin=""></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.2.2/axios.min.js"></script>
</body>
設置路由 meta 資料 #
可以使用 definePageMeta
設置頁面「元信息」與 useHead
搭配使用。
設置 meta 資料
在路由 pages/about.vue
設置頁面 meta
資料
vue
<script setup>
definePageMeta({
title: 'default title'
})
</script>
在佈局取得之前設置在 route.meta
的資料,來寫入供 SEO Head meta
的設置。
vue
<script setup>
const $route = useRoute()
useHead({
title: $route.meta.title,
meta: [{ property: 'og:title', content: $route.meta.title }]
})
</script>
引入 CSS #
在 useHead
可以使用 link
屬性來引入頁面需要的 css
。
假設在頁面引入 google fonts 字體 css
vue
<script setup>
useHead({
link: [
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.com' },
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;900&display=swap' }
]
})
/*
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;900&display=swap" rel="stylesheet">
*/
</script>