37% OFF during Black Friday at Mastering Nuxt.

Meta Tags

Learn how to migrate from Nuxt 2 to Nuxt Bridge new meta tags.

If you need to access the component state with head, you should migrate to using useHead .

If you need to use the Options API, there is a head() method you can use when you use defineNuxtComponent.

Migration

Set bridge.meta

import { defineNuxtConfig } from '@nuxt/bridge'
export default defineNuxtConfig({
  bridge: {
    meta: true,
    nitro: false // If migration to Nitro is complete, set to true
  }
})

Update head properties

In your nuxt.config, rename head to meta. (Note that objects no longer have a hid key for deduplication.)

export default {
  head: {
    titleTemplate: '%s - Nuxt',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'Meta description' }
    ]
  }
}

useHead Composables

Nuxt Bridge provides a new Nuxt 3 meta API that can be accessed with a new useHead composable.

<script setup lang="ts">
useHead({
  title: 'My Nuxt App',
})
</script>
This useHead composable uses @unhead/vue under the hood (rather than vue-meta) to manipulate your <head>.
We recommend not using the native Nuxt 2 head() properties in addition to useHead , as they may conflict.

For more information on how to use this composable, see the docs.

Options API

<script>
// if using options API `head` method you must use `defineNuxtComponent`
export default defineNuxtComponent({
  head (nuxtApp) {
    // `head` receives the nuxt app but cannot access the component instance
    return {
      meta: [{
        name: 'description',
        content: 'This is my page description.'
      }]
    }
  }
})
</script>
Possible breaking change: head receives the nuxt app but cannot access the component instance. If the code in your head tries to access the data object through this or this.$data, you will need to migrate to the useHead composable.

Title Template

If you want to use a function (for full control), then this cannot be set in your nuxt.config, and it is recommended instead to set it within your /layouts directory.

layouts/default.vue
<script setup lang="ts">
useHead({
  titleTemplate: (titleChunk) => {
    return titleChunk ? `${titleChunk} - Site Title` : 'Site Title';
  }
})
</script>