diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000..220d480 --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,70 @@ +module.exports = { + locales: { + '/': { + lang: 'en-US', + title: 'Vue Meta', + description: 'Metadata manager for Vue.js' + }, + }, + serviceWorker: true, + theme: 'vue', + themeConfig: { + repo: 'nuxt/vue-meta', + docsDir: 'docs', + locales: { + '/': { + label: 'English', + selectText: 'Languages', + editLinkText: 'Edit this page on GitHub', + nav: [{ + text: 'Guide', + link: '/guide/' + }, { + text: 'API', + link: '/api/' + }, { + text: 'Release Notes', + link: 'https://github.com/nuxt/vue-meta/releases' + }], + sidebar: [ + '/installation.md', + '/', + { + title: 'Usage', + collapsable: false, + children: [ + '/guide/', + '/guide/ssr', + '/guide/metainfo', + '/guide/special', + '/guide/caveats', + ] + }, + { + title: 'FAQ', + collapsable: false, + children: [ + '/faq/', + '/faq/performance.md', + '/faq/prevent-initial.md', + '/faq/component-props.md', + '/faq/async-action.md', + ] + }, + /*{ + title: 'Advanced', + collapsable: false, + children: [ + '/guide/advanced/navigation-guards.md', + '/guide/advanced/meta.md', + '/guide/advanced/transitions.md', + '/guide/advanced/data-fetching.md', + '/guide/advanced/scroll-behavior.md', + '/guide/advanced/lazy-loading.md' + ] + }*/ + ] + }, + } + } +} diff --git a/docs/.vuepress/public/logo.png b/docs/.vuepress/public/logo.png new file mode 100644 index 0000000..1b1e1c9 Binary files /dev/null and b/docs/.vuepress/public/logo.png differ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..dbf5d7f --- /dev/null +++ b/docs/README.md @@ -0,0 +1,14 @@ +vue-meta + +::: tip We need your help +We are working on defining the RFC for Vue Meta v3.0. It will be a ground-breaking release built from the ground up. + +We would like your help with this! Please visit the [Vue Meta v3.0 rfc](https://github.com/nuxt/rfcs/issues/19) and let us know your thoughts. +::: + +# Introduction +Vue Meta is a [Vue.js](https://vuejs.org) plugin that allows you to manage your app's metadata, much like [`react-helmet`](https://github.com/nfl/react-helmet) does for React. However, instead of setting your data as props passed to a proprietary component, you simply export it as part of your component's data using the `metaInfo` property. + +These properties, when set on a deeply nested component, will cleverly overwrite their parent components' `metaInfo`, thereby enabling custom info for each top-level view as well as coupling meta info directly to deeply nested subcomponents for more maintainable code. + +[Get started](/guide) or play with the [examples](https://github.com/nuxt/vue-meta/tree/master/examples) diff --git a/docs/api/README.md b/docs/api/README.md new file mode 100644 index 0000000..2d628e6 --- /dev/null +++ b/docs/api/README.md @@ -0,0 +1,470 @@ +--- +sidebar: auto +--- + +# API Reference + +## 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 aded 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](/faq/prevent-initial) + +### 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 + +:::tip 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 +- returns [`pluginOptions`](/api/#plugin-options) + +Could be used by third-party libraries who wish to interact with `vue-meta` + +### $meta().refresh +- returns [`metaInfo`](/api/#metaInfo-properties) + +Updates the current meta info with new meta info. +Useful when updating meta info as the result of an asynchronous action that resolves after the initial render takes place. + +### $meta().inject +- returns [`metaInfo`](/api/#metaInfo-properties) + +:::tip 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](/guide/ssr.html#simple-rendering-with-rendertostring) for an example + +### $meta().pause +- arguments: + - refresh (type `boolean`, default `false`) +- returns `resume()` + +Pauses global metadata updates until either the returned resume method is called or [resume](/api/#meta-resume) + +### $meta().resume +- arguments: + - refresh (type `boolean`, default `false`) +- returns [`metaInfo`](/api/#metaInfo-properties) (optional) + +Resumes metadata updates after they have been paused. If `refresh` is `true` it immediately initiates a metadata update by calling [refresh](/api/#meta-refresh) + +## metaInfo properties + +::: tip Note +The documentation below uses `metaInfo` in the examples, please note that this keyName is [configurable](/api/#keyname) and could be different in your case +::: + +### title +- type `string` + +Maps to the inner-text value of the `` element. + +```js +{ + metaInfo: { + title: 'Foo Bar' + } +} +``` + +```html +<title>Foo Bar +``` + +### 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`. + +```js +{ + metaInfo: { + title: 'Foo Bar', + titleTemplate: '%s - Baz' + } +} +``` + +```html +Foo Bar - Baz +``` + +The property can also be a function: + +```js +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 `` element. + +Since `v2.0` value can also be an `Array` + +```js +{ + metaInfo: { + htmlAttrs: { + lang: 'en', + amp: true + }, + bodyAttrs: { + class: ['dark-mode', 'mobile'] + } + } +} +``` + +```html + +Foo Bar +``` + +### base +- type `object` + +Maps to a newly-created `` element, where object properties map to attributes. + +```js +{ + metaInfo: { + base: { target: '_blank', href: '/' } + } +} +``` + +```html + +``` + +### meta +- type `collection` + +Each item in the array maps to a newly-created `` element, where object properties map to attributes. + +```js +{ + metaInfo: { + meta: [ + { charset: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' } + ] + } +} +``` + +```html + + +``` + +#### Content templates + +Since `v1.5.0`, you can now set up meta templates that work similar to the titleTemplate: + +```js +{ + metaInfo: { + meta: [ + { charset: 'utf-8' }, + { + 'property': 'og:title', + 'content': 'Test title', + 'template': chunk => `${chunk} - My page`, //or as string template: '%s - My page', + 'vmid': 'og:title' + } + ] + } +} +``` + +```html + + +``` + +### link +- type `collection` + + +Each item in the array maps to a newly-created `` element, where object properties map to attributes. + +```js +{ + metaInfo: { + link: [ + { rel: 'stylesheet', href: '/css/index.css' }, + { rel: 'favicon', href: 'favicon.ico' } + ] + } +} +``` + +```html + + +``` + +### style +- type `object` + +Each item in the array maps to a newly-created ` +``` + +### script +- type `collection` + +Each item in the array maps to a newly-created ` +``` + +#### Add json or other raw data +::: warning +You have to disable sanitizers so the content of `innerHTML` won't be escaped. Please see [__dangerouslyDisableSanitizersByTagID](/api/#dangerouslydisablesanitizersbytagid) for more info on related risks +::: + +```js +{ + metaInfo: { + script: [{ + vmid: 'ldjson-schema', + innerHTML: '{ "@context": "http://schema.org" }', + type: 'application/ld+json' + }], + __dangerouslyDisableSanitizersByTagID: { + 'ldjson-schema': ['innerHTML'] + }, + } +} +``` + +```html + +``` +#### Special attribute: `body: true` + +If you e.g. wish to force delayed execution of a script or just want the script to be included in the `` of the page, add `body: true`. +Script tags with `body: true` are rendered just before `` + +```js +{ + metaInfo: { + script: [{ + innerHTML: 'console.log("I am in body");', + type: 'text/javascript', + body: true + }] + } +} +``` + +### noscript +- type `collection` + +Each item in the array maps to a newly-created `