Coder Social home page Coder Social logo

vue-meta-info's Introduction

vue-meta

基于Vue 2.0 的单页面 meta info 管理.

Standard - JavaScript Style

npm version

<template>
  ...
</template>

<script>
  export default {
    metaInfo: {
      title: 'My Example App', // set a title
      meta: [{                 // set meta
        name: 'keyWords',
        content: 'My Example App'
      }]
      link: [{                 // set link
        rel: 'asstes',
        href: 'https://assets-cdn.github.com/'
      }]
    }
  }
</script>

description

vue-meta-info 是一个基于vue 2.0的插件,它会让你更好的管理你的 app 里面的 meta 信息。你可以直接 在组件内设置 metaInfo 便可以自动挂载到你的页面中。如果你需要随着数据的变化,自动更新你的title、meta等信息,那么用此 插件也是再合适不过了。 当然,有时候我们也可能会遇到让人头疼的SEO问题,那么使用此插件配合 prerender-spa-plugin 也是再合适不过了

更多使用介绍:https://zhuanlan.zhihu.com/p/29148760?group_id=890298677627879424

Disclaimer

You have been warned. 有些情况下可能会存在一些还没有测到的bug,测试用例并没有完全覆盖所有的语句.

Installation

Yarn

$ yarn add vue-meta-info

NPM

$ npm install vue-meta-info --save

Usage

步骤1:全局引入vue-meta-info

import Vue from 'vue'
import MetaInfo from 'vue-meta-info'

Vue.use(MetaInfo)

步骤2:组件内静态使用 metaInfo

<template>
  ...
</template>

<script>
  export default {
    metaInfo: {
      title: 'My Example App', // set a title
      meta: [{                 // set meta
        name: 'keyWords',
        content: 'My Example App'
      }]
      link: [{                 // set link
        rel: 'asstes',
        href: 'https://assets-cdn.github.com/'
      }]
    }
  }
</script>

Tips

如果你的title或者meta是异步加载的,那么你可能需要这样使用

<template>
  ...
</template>

<script>
  export default {
    name: 'async',
    metaInfo () {
      return {
        title: this.pageName
      }
    },
    data () {
      return {
        pageName: 'loading'
      }
    },
    mounted () {
      setTimeout(() => {
        this.pageName = 'async'
      }, 2000)
    }
  }
</script>

SSR

如果您使用了Vue SSR 来渲染页面,那么您需要注意的是:

由于没有动态更新,所有的生命周期钩子函数中,只有 beforeCreate 和 created 会在服务器端渲染(SSR)过程中被调用。这就是说任何其他生命周期钩子函数中的代码(例如 beforeMount 或 mounted),只会在客户端执行。 此外还需要注意的是,你应该避免在 beforeCreate 和 created 生命周期时产生全局副作用的代码,例如在其中使用 setInterval 设置 timer。在纯客户端(client-side only)的代码中,我们可以设置一个 timer,然后在 beforeDestroy 或 destroyed 生命周期时将其销毁。但是,由于在 SSR 期间并不会调用销毁钩子函数,所以 timer 将永远保留下来。为了避免这种情况,请将副作用代码移动到 beforeMount 或 mounted 生命周期中。

基于以上约束,我们目前可以使用静态的数据来渲染我们的metaInfo,下面给出一个使用示例:

<template>
  ...
</template>

<script>
  export default {
    metaInfo: {
      title: 'My Example App', // set a title
      meta: [{                 // set meta
        name: 'keyWords',
        content: 'My Example App'
      }]
      link: [{                 // set link
        rel: 'asstes',
        href: 'https://assets-cdn.github.com/'
      }]
    }
  }
</script>

此时vueMetaInfo会帮我们在ssr的context中挂载出一个title变量和一个render对象。类似于这样:

context = {
  ...
  title: 'My Example App',
  render: {
    meta: function () { ... },
    link: function () { ... }
  }
}

至此,我们可以改造我们的模板:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{{title}}</title>
    {{{render.meta && render.meta()}}}
    {{{render.link && render.link()}}}
  </head>
  <body>
    <!--vue-ssr-outlet-->
  </body>
</html>

这样便可以渲染出需要的数据。值得注意的是:虽然我们可以使用

<template>
  ...
</template>

<script>
  export default {
    name: 'async',
    metaInfo () {
      return {
        title: this.pageName
      }
    },
    data () {
      return {
        pageName: 'loading'
      }
    },
    mounted () {
      setTimeout(() => {
        this.pageName = 'async'
      }, 2000)
    }
  }
</script>

这种形式来定义数据,但是最终渲染出来的title 依然是 loading,因为服务端渲染除了created beforeCreate并没有mounted钩子。

Examples

To run the examples; clone this repository & run npm install in the root directory, and then run npm run dev. Head to http://localhost:8080.

vue-meta-info's People

Contributors

berwin avatar muwoo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-meta-info's Issues

使用VUE-SSR渲染,采用vue-meta-info的一些异常

1、新增加的meta标签,在源码里找不到,只能在F12里看到,且老的mata不会被删除,F12里会出现新、老两份mata,没有达到SEO的目的。
2、title设置后,源码里的title也不会更新,页头的标题会更新,没有达到SEO的目的。

在SSR环境下无法渲染title,建议修改server.js,文中给出了如何修复这个bug

无法在SSR环境下成功渲染出title信息。也就是说在查看源码里是看不到title的。

因为一个路由下有可能有很多个组件,然后一个路由被匹配时通常只有一个组件设置了meta信息。

所以代码中的逻辑会导致后面没有设置meta信息的组件将前面设置了meta信息的组件覆盖掉。导致meta信息失效。

经过排查发现问题是因为项目最后一次commit导致的 7a98388

当时是在参数中给了一个默认值,这会导致在SSR环境下无法渲染Title的问题。

代码中是这样写的

export default function (context, metaInfo = {title: ''}) {
  if (context && metaInfo) {
    context.title = metaInfo.title
    context.render = {}
    Object.keys(metaInfo).forEach(info => {
      if (info === 'title') return
      context.render[info] = function () {
        let metaNd = ''
        if (metaInfo[info]) {
          metaInfo[info].forEach((item) => {
            let str = `<${info} data-vue-meta-info="true"`
            Object.keys(item).forEach(key => {
              str += `${key}="${item[key]}"`
            })
            str += `></${info}>\n`
            metaNd += str
          })
        }
        return metaNd
      }.bind(this)
    })
  }
}

这就导致下面这行代码实际上是无效的判断。

if (context && metaInfo) {

因为无论怎样都是为true

所以导致SSR环境下无法成功设置title。因为context.title = metaInfo.title这行代码会将已经设置了Title的context.title被没有设置Title的metaInfo.title覆盖掉。

建议将代码改成下面这样:

export default function (context) {
  if (context && metaInfo) {
    context.title = metaInfo.title || ''

vue-meta-info 配合 prerender-spa-plugin 使用, 源码里面没有 生成mate标签

vue-meta-info 配合 prerender-spa-plugin 使用, prerender-spa-plugin 打包出来的html文件里面没有mate 标签,但是在f12 的控制台里面会生成 mate 标签,这样会对seo有影响吗?我看网上的教程在源码里面也会生成 mate标签,是不是哪里设置有问题或者 vue-meta-info版本不一样导致的这种问题?

抄vue-meta的

这个vue-meta-info 抄的nuxtJs 的vue-meta,,搞得我查资料混乱,都怪你这抄袭者在捣乱

异步加载的title能被seo爬到吗?

如题,比如我有一个“文章”页面,其标题和关键词、作者等信息需要从后端异步加载,再把它放到title和meta标签里,请问这样的异步加载能被SEO爬取到吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.