Package detail

@unhead/vue

unjs4.7mMIT2.0.19

Full-stack <head> manager built for Vue.

readme

@unhead/vue

Full-stack <head> management for Vue applications

npm version npm downloads License

Features

  • 🖖 Vue-optimized head management
  • 🔄 Reactive titles, meta tags, and other head elements
  • 🔍 SEO-friendly head control
  • 🖥️ Server-side rendering support
  • 📦 Lightweight with zero dependencies (except for Vue & unhead)

Installation

# npm
npm install @unhead/vue

# yarn
yarn add @unhead/vue

# pnpm
pnpm add @unhead/vue

Usage

Setup

Client-side (SPA)

import { createHead } from '@unhead/vue/client'
// main.ts
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)
const head = createHead()
app.use(head)

app.mount('#app')

Server-side (SSR)

import { createHead } from '@unhead/vue/server'
// entry-server.ts
import { renderToString } from 'vue/server-renderer'
import { createApp } from './main'

export async function render(url: string) {
  const { app } = createApp()
  const head = createHead()
  app.use(head)

  const html = await renderToString(app)
  return { html, head }
}
import { createHead } from '@unhead/vue/client'
// entry-client.ts (for hydration)
import { createApp } from './main'

const { app } = createApp()
const head = createHead()
app.use(head)

app.mount('#app')

Basic Usage

<!-- Home.vue -->
<script setup lang="ts">
import { useHead } from '@unhead/vue'

useHead({
  title: 'Home Page',
  meta: [
    {
      name: 'description',
      content: 'Welcome to our website'
    }
  ]
})
</script>

<template>
  <h1>Home</h1>
</template>

Setting Meta Tags

<!-- About.vue -->
<script setup lang="ts">
import { useSeoMeta } from '@unhead/vue'

useSeoMeta({
  title: 'About Us',
  description: 'Learn more about our company',
  ogTitle: 'About Our Company',
  ogDescription: 'Our fantastic about page',
  ogImage: 'https://example.com/image.jpg',
})
</script>

<template>
  <h1>About Us</h1>
</template>

Reactive Head Elements

<!-- Profile.vue -->
<script setup lang="ts">
import { useHead } from '@unhead/vue'
import { ref } from 'vue'

const userName = ref('User')

// Vue automatically tracks reactive changes
useHead({
  title: () => `${userName.value} - Profile`, // Reactive title
  meta: [
    {
      name: 'description',
      content: () => `${userName.value}'s profile page`, // Reactive description
    },
  ],
})

function updateName() {
  userName.value = 'New Name'
  // Title and meta automatically update!
}
</script>

<template>
  <h1>{{ userName }}'s Profile</h1>
  <button @click="updateName">
    Update Name
  </button>
</template>

Development

# Install dependencies
npm install

# Generate build files
npm run build

# Run tests
npm run test

License

MIT