API Reference

Plugin properties

VueMeta exports a Vue plugin as default export. This section describes the properties of that default export

version

  • type string

The version of the plugin, it is the same as the package version

install

The method used by Vue to install the plugin

hasMetaInfo

  • argument:
    • vm (a Vue component)
  • returns boolean

A helper function which returns true when the Vue component passed as argument has metaInfo defined

generate (since v2.2)

This method is not available in the browser builds

  • arguments:
    • metaInfo
    • options (optional)
  • returns metaInfo

This method is similar to $meta.inject() but works without the need for a Vue instance

import VueMeta from 'vue-meta'

const { generate } = VueMeta

const rawMetaInfo = {
  meta: [{ charset: 'utf-8' }]
}

const metaInfo = generate(rawMetaInfo /*, yourOptions*/)

const HEAD = metaInfo.script.text() + metaInfo.meta.text()

will result In

<meta charset="utf-8">

Plugin options

keyName

  • type string
  • default metaInfo

The name of the component option that contains all the information that gets converted to the various meta tags & attributes for the page

attribute

  • type string
  • default data-vue-meta

The name of the attribute vue-meta arguments on elements to know which it should manage and which it should ignore.

ssrAttribute

  • type string
  • default data-vue-meta-server-rendered

The name of the attribute that is added to the html tag to inform vue-meta that the server has already generated the meta tags for the initial render

See How to prevent update on page load

ssrAppId

  • type string
  • default ssr

The app id for a server side rendered app. You shouldnt have to change this normally

tagIDKeyName

  • type string
  • default vmid

The property that tells vue-meta to overwrite (instead of append) an item in a tag list. For example, if you have two meta tag list items that both have vmid of 'description', then vue-meta will overwrite the shallowest one with the deepest one.

contentKeyName

  • type string
  • default content

The key name for the content-holding property

metaTemplateKeyName

  • type string
  • default template

The key name for possible meta templates

refreshOnceOnNavigation

  • type boolean
  • default false

When true then vue-meta will pause updates once page navigation starts and resumes updates when navigation finishes (resuming also triggers an update). This could both be a performance improvement as a possible fix for 'flickering' when you are e.g. replacing stylesheets

Plugin methods

The vue-meta plugin injects a $meta() function in the Vue prototype which provides the following methods

Note

$meta() is a function so we only need to insert it once in the Vue.prototype, but still use this to reference the component it was called from

$meta().getOptions

Could be used by third-party libraries who wish to interact with vue-meta

$meta().refresh

Updates the current metadata with new metadata. Useful when updating metadata as the result of an asynchronous action that resolves after the initial render takes place.

$meta().inject

SSR only

inject is available in the server plugin only and is not available on the client

It returns a special metaInfo object where all keys have an object as value which contains a text() method for returning html code

See Rendering with renderToString for an example

Passing arguments to text()

In some cases you can pass an argument to the text method. E.g. to automatically add the ssrAttribute on ssr or render properties in the body

$meta().pause

  • arguments:
    • refresh (type boolean, default false)
  • returns resume()

Pauses global metadata updates until either the returned resume method is called or resume

$meta().resume

  • arguments:
    • refresh (type boolean, default false)
  • returns metaInfo (optional)

Resumes metadata updates after they have been paused. If refresh is true it immediately initiates a metadata update by calling refresh

metaInfo properties

Note

The documentation below uses metaInfo as keyName in the examples, please note that this is configurable and could be different in your case

title

  • type string

Maps to the inner-text value of the <title> element.

{
  metaInfo: {
    title: 'Foo Bar'
  }
}
<title>Foo Bar</title>

titleTemplate

  • type string | Function

The value of title will be injected into the %s placeholder in titleTemplate before being rendered. The original title will be available on metaInfo.titleChunk.

{
  metaInfo: {
    title: 'Foo Bar',
    titleTemplate: '%s - Baz'
  }
}
<title>Foo Bar - Baz</title>

The property can also be a function:

titleTemplate: (titleChunk) => {
  // If undefined or blank then we don't need the hyphen
  return titleChunk ? `${titleChunk} - Site Title` : 'Site Title';
}

htmlAttrs

headAttrs

bodyAttrs

  • type object

Each key:value maps to the equivalent attribute:value of the <body> element.

Since v2.0 value can also be an Array<string>

{
  metaInfo: {
    htmlAttrs: {
      lang: 'en',
      amp: true
    },
    bodyAttrs: {
      class: ['dark-mode', 'mobile']
    }
  }
}
<html lang="en" amp>
<body class="dark-mode mobile">Foo Bar</body>

base

  • type object

Maps to a newly-created <base> element, where object properties map to attributes.

{
  metaInfo: {
    base: { target: '_blank', href: '/' }
  }
}
<base target="_blank" href="/">

meta

  • type collection

Each item in the array maps to a newly-created <meta> element, where object properties map to attributes.

{
  metaInfo: {
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' }
    ]
  }
}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

Content templates

Since v1.5.0, you can now set up meta templates that work similar to the titleTemplate:

{
  metaInfo: {
    meta: [
      { charset: 'utf-8' },
      {
        property: 'og:title',
        content: 'Test title',
        // following template options are identical
        // template: '%s - My page',
        template: chunk => `${chunk} - My page`,
        vmid: 'og:title'
      }
    ]
  }
}
<meta charset="utf-8">
<meta name="og:title" property="og:title" content="Test title - My page">
  • type collection

Each item in the array maps to a newly-created <link> element, where object properties map to attributes.

{
  metaInfo: {
    link: [
      { rel: 'stylesheet', href: '/css/index.css' },
      { rel: 'favicon', href: 'favicon.ico' }
    ]
  }
}
<link rel="stylesheet" href="/css/index.css">
<link rel="favicon" href="favicon.ico">

style

  • type object

Each item in the array maps to a newly-created <style> element, where object properties map to attributes.

{
  metaInfo: {
    style: [
      { cssText: '.foo { color: red }', type: 'text/css' }
    ]
  }
}
<style type="text/css">.foo { color: red }</style>

script

  • type collection

Each item in the array maps to a newly-created <script> element, where object properties map to attributes.

{
  metaInfo: {
    script: [
      { src: 'https://cdn.jsdelivr.net/npm/vue/dist/vue.js', async: true, defer: true }
    ],
  }
}
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" async defer></script>

Add JSON data (since v2.1)

If you wish to use a JSON variable within a script tag (e.g. for JSON-LD), you can directly pass your variable by using the json property.

When passing an array or object to the json property the keys and values of the variable will still be sanitized to prevent XSS

{
  metaInfo: {
    script: [{
      type: 'application/ld+json'
      json: {
        '@context': 'http://schema.org',
        unsafe: '<p>hello</p>'
      }
    }]
  }
}
<script type="application/ld+json">
  { "@context": "http://schema.org", "unsafe": "&lt;p&gt;hello&lt;/p&gt;" }
</script>

Add other raw data

You have to disable sanitizers so the content of innerHTML won't be escaped. Please see __dangerouslyDisableSanitizersByTagID for more info on related risks

{
  metaInfo: {
    script: [{
      vmid: 'ldjson-schema',
      innerHTML: '{ "@context": "http://schema.org" }',
      type: 'application/ld+json'
    }],
    __dangerouslyDisableSanitizersByTagID: {
      'ldjson-schema': ['innerHTML']
    },
  }
}
<script type="application/ld+json">{ "@context": "http://schema.org" }</script>

noscript

  • type collection

Each item in the array maps to a newly-created <noscript> element, where object properties map to attributes.

{
  metaInfo: {
    noscript: [
      { innerHTML: 'This website requires JavaScript.' }
    ]
  }
}
<noscript>This website requires JavaScript.</noscript>

__dangerouslyDisableSanitizers

  • type Array<string>

If you need to disable sanitation, please always use __dangerouslyDisableSanitizersByTagID when possible

By disabling sanitization, you are opening potential vectors for attacks such as SQL injection & Cross-Site Scripting (XSS). Be very careful to not compromise your application.

By default, vue-meta sanitizes HTML entities in every property. You can disable this behaviour on a per-property basis using __dangerouslyDisableSantizers. Just pass it a list of properties you want sanitization to be disabled on:

{
  metaInfo: {
    title: '<I will be sanitized>',
    meta: [{
      vmid: 'description',
      name: 'description',
      content: '& I will not be <sanitized>'
    }],
    __dangerouslyDisableSanitizers: ['meta']
  }
}
<title>&lt;I will be sanitized&gt;</title>
<meta vmid="description" name="description" content="& I will not be <sanitized>">

__dangerouslyDisableSanitizersByTagID

  • type object

By disabling sanitation, you are opening potential vectors for attacks such as SQL injection & Cross-Site Scripting (XSS). Be very careful to not compromise your application.

Provides same functionality as __dangerouslyDisableSanitizers but you can specify which property for which tagIDKeyName sanitation should be disabled. It expects an object with the vmid as key and an array with property keys as value:

{
  metaInfo: {
    title: '<I will be sanitized>',
    meta: [{
      vmid: 'description',
      name: 'still-&-sanitized',
      content: '& I will not be <sanitized>'
    }],
    __dangerouslyDisableSanitizersByTagID: {
      description: ['content']
    }
  }
}
<title>&lt;I will be sanitized&gt;</title>
<meta vmid="description" name="still-&amp;-sanitized" content="& I will not be <sanitized>">

changed

  • type Function

A callback function which is called whenever the metaInfo updates / changes.

The callback receives the following arguments:

  • newInfo
  • addedTags
    • type Array<HTMLElement>
      List of elements that were added
  • removedTags
    • type Array<HTMLElement>
      List of elements that were removed
{
  metaInfo: {
    changed (newInfo, addedTags, removedTags) {
      console.log('Metadata was updated!')
    }
  }
}

afterNavigation

  • type Function

A callback function which is called when vue-meta has updated the metadata after navigation occurred. This can be used to track page views with the updated document title etc.

Adding a afterNavigation callback behaves the same as when refreshOnceOnNavigation is true

The callback receives the following arguments:

  • newInfo
{
  metaInfo: {
    afterNavigation(metaInfo) {
      trackPageView(document.title)
      // is the same as
      trackPageView(metaInfo.title)
    }
  }
}

Special metaInfo attributes

These attributes define specific features when used in a metaInfo property

once

When adding a metaInfo property that should be added once without reactivity (thus will never be updated) you can add once: true to the property.

{
  metaInfo: {
    link: [{
      once: true,
      rel: 'stylesheet'
      href: 'style.css'
    }]
  }
}

skip (since v2.1)

When a metaInfo property has a skip attribute with truthy value it will not be rendered. This attribute helps with e.g. chaining scripts (see callback attribute)

{
  metaInfo: {
    script: [{
      skip: true,
      innerHTML: 'console.log("you wont see me")'
    }]
  }
}

body

pbody (since v2.1)

tags

VueMeta supports the body and pbody attributes on all metaInfo properties, but its up to you or your framework to support these attributes during SSR

Using these body attributes without SSR support could result in hydration errors / re-rendering or missing tags.

You can filter tags to be included in the <body> instead of the <head> to e.g. force delayed execution of a script.

Use pbody: true if you wish to prepend the tag to the body (so its rendered just after <body>) or use body: true to append the tag to the body (the tag is rendered just before </body>).

{
  metaInfo: {
    script: [{
      innerHTML: 'console.log("I am in body");',
      type: 'text/javascript',
      body: true
    }]
  }
}

SSR Support

When rendering your template on SSR make sure to pass an object as first argument to the text method of the metaInfo property with either a value body: true or pbody: true

<head>
  <!-- render script tags in HEAD, no argument -->
  ${script.text()}
</head>
<body>
  ${script.text({ pbody: true })}

  <div id="app"></div>

  ${script.text({ body: true })}
</body>

callback (since v2.1)

vmid required on SSR

When using SSR it is required to define a vmid property for the metaInfo property

The vmid is needed to resolve the corresponding callback for that element on hydration

The callback attribute should specificy a function which is called once the corresponding tag has been loaded (i.e. the onload event is triggered). Use this to chain javascript if one depends on the other.

{
  metaInfo() {
    return {
      script: [
        {
          vmid: 'extscript',
          src: '/my-external-script.js',
          callback: () => (this.externalLoaded = true)
        },
        {
          skip: !this.externalLoaded,
          innerHTML: `
            /* this is only added once external script has been loaded */
            /* and e.g. window.$externalVar exists */
          `
        }
      ]
    }
  },
  data() {
    return {
      externalLoaded: false
    }
  }
}