getting started
To reduce boilerplate, the package will aim to re-use existing metadata about the page where possible. Such as it will infer at runtime what data it can make use of.
For example, if you have a <title>
on your page, then it's likely we can use this same title to generate the Schema.org WebPage's name
.
Inferences are made from the following, in this order:
You can define Schema at different scopes of the Vue app and the most inner node will be rendered.
In practice this means you can provide the "global" schema (WebPage
, WebSite
and an identity) within
an app.vue
(or a layout file).
Child components will inherent the parent Schema if nothing is defined, otherwise it will replace it.
The applications of this design can be used in creative ways, for example: if you have an article layout file, you can
make use of defineBreadcrumb
to have all articles generate Breadcrumbs.
There's numerous resolvers available to help minimise the work in maintaining and developing Schema.
Any URL field allows a relevant link to be provided. This link will either be prefixed with the canonical host or the canonical page URL.
defineComment({
text: 'This is really cool!',
author: {
name: 'Harlan Wilton',
url: '/user/harlan-wilton',
}
})
[
{
"@id": "https://example.com/#/schema/person/1230192103",
"@type": "Person",
"name": "Harlan Wilton",
"url": "https://example.com/user/harlan-wilton"
},
{
"@id": "https://example.com/#/schema/comment/2288441280",
"@type": "Comment",
"author": {
"@id": "https://example.com/#/schema/person/1230192103"
},
"text": "This is really cool!"
}
]
Image resolving uses the same relative link logic as above.
Additionally, single string images will be transformed to an ImageObject and added as a root node and an
applicable link to the @id
will be added.
defineWebPage({
image: '/my-image.png',
})
{
"@id": "https://example.com/#/schema/image/1571960974",
"@type": "ImageObject",
"contentUrl": "https://example.com//my-image.png",
"url": "https://example.com//my-image.png"
}
Providing an @id
for a Schema node is sometimes useful to setup your own relations. When configuring the @id
you can
provide it as a simple string beginning with #
.
The ID will be resolved to use the canonical host or the canonical page path as a prefix.
defineBreadcrumb({
'@id': '#subbreadcrumb',
'itemListElement': [
{ name: 'Sub breadcrumb link', item: '/blog/test' },
],
})
{
"@id": "https://example.com/#subbreadcrumb",
"@type": "BreadcrumbList"
}
Providing a string of @type
will be augmented with the default type. This is to allow fallbacks when the specific @type
is not supported by Google.
defineWebPage({
'@type': 'FAQPage',
})
{
"@type": [
"WebPage",
"FAQPage"
]
}
Any date can be provided as a string or a js Date
object. When a Date
object is provided it will be transformed to the
ISO 8601 format.
defineWebPage({
datePublished: new Date(2022, 1, 10, 0, 0, 0),
})
{
"datePublished": "2022-01-10T00:00:0+00:00"
}
Route meta and document meta tags will be used to infer default Schema values.
For example, having a document.title
can be inferred as the WebPage title
.
The following meta keys are supported:
string
- The page titlestring
- A short description of the pagestring|Date
- The date the page was last modified.string|Date
- The date the page was publishedstring
- Will be used as the primaryImage of the page