aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vuepress/lib/app/root-mixins/updateMeta.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/vuepress/lib/app/root-mixins/updateMeta.js')
-rw-r--r--node_modules/vuepress/lib/app/root-mixins/updateMeta.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/node_modules/vuepress/lib/app/root-mixins/updateMeta.js b/node_modules/vuepress/lib/app/root-mixins/updateMeta.js
new file mode 100644
index 00000000..ff2703ac
--- /dev/null
+++ b/node_modules/vuepress/lib/app/root-mixins/updateMeta.js
@@ -0,0 +1,59 @@
+export default {
+ created () {
+ if (this.$ssrContext) {
+ this.$ssrContext.title = this.$title
+ this.$ssrContext.lang = this.$lang
+ this.$ssrContext.description = this.$page.description || this.$description
+ }
+ },
+
+ mounted () {
+ // update title / meta tags
+ this.currentMetaTags = new Set()
+
+ const updateMeta = () => {
+ document.title = this.$title
+ document.documentElement.lang = this.$lang
+ const userMeta = this.$page.frontmatter.meta || []
+ const meta = userMeta.slice(0)
+ const useGlobalDescription = userMeta.filter(m => m.name === 'description').length === 0
+
+ // #665 Avoid duplicate description meta at runtime.
+ if (useGlobalDescription) {
+ meta.push({ name: 'description', content: this.$description })
+ }
+
+ // Including description meta coming from SSR.
+ const descriptionMetas = document.querySelectorAll('meta[name="description"]')
+ if (descriptionMetas.length) {
+ descriptionMetas.forEach(m => this.currentMetaTags.add(m))
+ }
+
+ this.currentMetaTags = new Set(updateMetaTags(meta, this.currentMetaTags))
+ }
+ this.$watch('$page', updateMeta)
+ updateMeta()
+ },
+
+ beforeDestroy () {
+ updateMetaTags(null, this.currentMetaTags)
+ }
+}
+
+function updateMetaTags (meta, current) {
+ if (current) {
+ [...current].forEach(c => {
+ document.head.removeChild(c)
+ })
+ }
+ if (meta) {
+ return meta.map(m => {
+ const tag = document.createElement('meta')
+ Object.keys(m).forEach(key => {
+ tag.setAttribute(key, m[key])
+ })
+ document.head.appendChild(tag)
+ return tag
+ })
+ }
+}