---
title: useServerHead()
description: Learn about server-only head tags and modern alternatives
deprecated: true
---

::warning
**DEPRECATED:** All `useServer*` composables (including `useServerHead`, `useServerSeoMeta`, etc.) are deprecated.
Use `useHead()`{lang="ts"} with `import.meta.server` conditionals instead, as described in the [Bundle Optimizations](/docs/head/guides/advanced/client-only-tags) guide.
::

## Modern Alternative

Instead of using the deprecated `useServerHead`, use the `useHead()`{lang="ts"} composable with environment conditionals:

```ts
import { useHead } from '@unhead/dynamic-import'

// Only runs on the server
if (import.meta.server) {
  useHead({
    title: 'My Page',
    meta: [
      {
        name: 'description',
        content: 'My page description',
      },
    ],
  })
}
```

Or use the `mode` option for more declarative code:

```ts
import { useHead } from '@unhead/dynamic-import'

useHead({
  title: 'My Page',
  meta: [
    {
      name: 'description',
      content: 'My page description',
    },
  ],
}, { mode: 'server' })
```

For a complete guide on optimizing your bundle with server and client-only tags, see the [Bundle Optimizations](/docs/head/guides/advanced/client-only-tags) guide.

## Use Cases for Server-Only Tags

Server-only tags are beneficial in several scenarios:

1. **Performance optimization**: Reduces client-side JavaScript bundle size
2. **SEO focus**: Most search engines only read the initial HTML response
3. **Server-specific resources**: Enables use of tags with values only available during server rendering

## Safe Usage with Untrusted Data

When working with user-generated content, use the `safe` option to ensure proper sanitization:

```ts
import { useHead } from '@unhead/dynamic-import'

useHead({
  title: userProvidedTitle,
  meta: [
    {
      name: 'description',
      content: userProvidedDescription,
    },
  ],
}, {
  mode: 'server',
  // Enable sanitization for user-provided content
  safe: true
})
```

## Tree Shaking

Server-only tags can be tree-shaken from your client bundle in most frameworks when using the recommended approach:

- **Import.meta conditionals**: Code inside `if (import.meta.server)` blocks is automatically tree-shaken
- **Mode option**: When using `{ mode: 'server' }`, most bundlers can optimize this
- **Additional optimization**: Use the [Unhead Vite Plugin](/docs/head/guides/advanced/vite-plugin) for enhanced tree-shaking

## Important Considerations

### No Lifecycle Events

Server-rendered tags do not have lifecycle events. If you use server-rendered tags on a specific page, they **won't be automatically removed** when navigating away from that page.

### Tag Persistence

Consider this example:

```ts
// pages/about.vue
if (import.meta.server) {
  useHead({
    meta: [
      {
        name: 'description',
        content: 'About page description',
      },
    ],
  })
}
```

When this page is server-rendered, the meta tag is included in the HTML. However, when you navigate from `/about` to another page, the tag will remain in the document `<head>` because there's no client-side code to remove it.

### Solutions for Tag Management

To manage server-rendered tags effectively:

1. **Add keys to all tags**: Use the `key` property to enable replacement
2. **Use in app root only**: Place server-only tags in root components for app-wide metadata
3. **Manual cleanup**: Register empty tags with matching keys on other pages to remove them
4. **Prefer client tags**: Use regular `useHead()`{lang="ts"} without mode restrictions for page-specific tags that need to change with navigation

## Working Example: Managing Page-Specific Scripts

This pattern demonstrates how to add a page-specific script and properly remove it when navigating away:

```ts
// pages/about.vue
import { useHead } from '@unhead/dynamic-import'

if (import.meta.server) {
  useHead({
    script: [
      {
        src: await import('~/assets/js/about.js?url'),
        key: 'page-script'
      }
    ]
  })
}
```

```ts
// pages/contact.vue
import { useHead } from '@unhead/dynamic-import'

useHead({
  script: [
    {
      // This removes the script when navigating to this page
      key: 'page-script'
    }
  ]
})
```

## Best Practices

- Use server-only tags primarily for static metadata that doesn't change between pages
- Always add keys to server-rendered tags that might need to be replaced later
- Use `useHead()`{lang="ts"} with environment conditionals instead of legacy `useServer*` composables
- Test navigation flows to ensure proper tag management

For complete documentation on bundle optimization strategies, see the [Bundle Optimizations](/docs/head/guides/advanced/client-only-tags) guide.