<head>
tags
You can define meta tags inside <head>
by using following settings.
Setting | Sets |
---|---|
title | |
description | |
image |
|
viewport | |
Head | Other <head> tags such as:
|
You can set these settings dynamically:
- Inside your
+data
hook, by using theuseConfig()
hook.- Inside your components, by using the
<Config>
and<Head>
components.
See API > Settings > HTML for other HTML settings (most notably
bodyAttributes
,htmlAttributes
,lang
).
These settings are provided by
vike-react
/vike-vue
/vike-solid
. If you don't usevike-react
/vike-vue
/vike-solid
then see<head>
tags withoutvike-{react,vue,solid}
.
You can create your own custom settings.
Defaults
You can set defaults (that pages can override).
// pages/+config.js
import image from './previewImage.jpg'
export default {
// Default <title>
title: 'Awesome Rockets',
// Default <meta name="description">
description: 'We deliver payload to space',
// Default <meta property="og:image">
image
}
Page-specific
You can set values for one page or a group of pages (potentially overriding defaults).
// pages/starship/+config.js
export default {
title: 'Rocket: Starship',
description: 'The Starship is the largest rocket ever built.'
}
Head
setting
For other <head>
tags, you can use the Head
setting:
// pages/+Head.jsx or
// pages/+Head.vue
import favicon from './favicon.svg'
// Applies to all pages (cannot be overridden)
export function Head() {
// All pages share the same favicon
return <>
<link rel="icon" href={favicon} type="image/svg+xml">
</>
}
Unlike
title
/description
/image
, theHead
setting is cumulative which means thatpages/+Head.js
cannot be overridden, see API >Head
> Cumulative.
Data
You can set <head>
tags based on fetched data:
// pages/rocket/starship/+data.js
export async function data() {
const data = await sql.run(
'SELECT { title, description } FROM rockets WHERE name = "starship";'
)
return data
}
// pages/rocket/starship/+title.ts
import type { PageContext } from 'vike/types'
import type { Data } from './+data'
// Overrides the default <title>
export default (pageContext: PageContext<Data>) => pageContext.data.title
You can define the logic once and apply it to all pages:
// pages/+title.js
// Applies to all pages: if a page fetches data and data.title is defined then
// use it to set the page's title.
export default (pageContext) => pageContext.data?.title || 'Some Default Title'
You can use:
useData()
andusePageContext()
inside the+Head
setting, see API >Head
> Using data.- The
useConfig()
hook to set<head>
tags inside your+data
hook (or any Vike hook). - The
<Config>
and<Head>
components to set<head>
tags inside your components.The
<Config>
and<Head>
components are particularly relevant when using integrations that enable data-fetching components, such asvike-react-query
andvike-react-apollo
.
The settings
description
andimage
can also access thepageContext
like this.
Custom settings
You can create your own custom settings.
For example, let's create a new setting dynamicFavicon
that allows different favicons to be set for different pages.
Setting creation
// pages/+config.js
export default {
meta: {
dynamicFavicon: {
env: { server: true, client: true }
}
}
}
See: API >
meta
// pages/+Head.jsx
import { usePageContext } from 'vike-react/usePageContext' // or vike-vue / vike-solid
export default () => {
const pageContext = usePageContext()
const { dynamicFavicon } = pageContext.config
return <>
{ dynamicFavicon && <link rel="icon" href={dynamicFavicon}> }
<>
}
// pages/+onAfterRenderClient.js
export default (pageContext) => {
if (!pageContext.isHydration) {
const { dynamicFavicon } = pageContext.config
updateFavicon(dynamicFavicon)
}
}
// https://stackoverflow.com/questions/260857/changing-website-favicon-dynamically
function updateFavicon(dynamicFavicon) {
let link = document.querySelector("link[rel~='icon']")
if (!dynamicFavicon) {
if (link) document.head.removeChild(link)
return
}
if (!link) {
link = document.createElement('link')
link.rel = 'icon'
document.head.appendChild(link)
}
link.href = dynamicFavicon
}
For TypeScript users:
// pages/+config.js
declare global {
namespace Vike {
interface Config {
dynamicFavicon?: string
}
}
}
Setting usage
// pages/+config.js
import favicon from './favicon.svg'
export {
// Default favicon
dynamicFavicon: favicon
}
// pages/premium-members/+config.js
import favicon from './favicon.svg'
export {
// Favicon for /premium-members
dynamicFavicon: favicon
}
Internationalization
Example of internationalizing (i18n) <head>
tags:
// pages/+Head.js
// Environment: server
export { Head }
import { usePageContext } from 'vike-react/usePageContext' // or 'vike-vue' / 'vike-solid'
function Head() {
const pageContext = usePageContext()
const description = pageContext.locale === 'de-DE' ?
'Wir liefern zum Weltall.' :
'We deliver payload to space.'
return <>
<meta name="description" content={description}>
</>
}
// pages/+title.js
// Environment: server, client
export function title(pageContext) {
const title = pageContext.locale === 'de-DE' ?
'AwesomeRockets | Das Weltall Unternehmen' :
'AwesomeRockets | The space company'
return title
}
See also:
Markdown
See Integration > Markdown > Metadata.