# 页面元信息

项目要做 SSR 渲染,其中很大一部分原因就是能够对 SEO 更加的友好。本文将会讲解如何使用vue-meta (opens new window)来管理页面的信息

# 安装依赖

npm install vue-meta

# 使用

TIP

在客户端的 entry-client.ts 和服务端的 entry-server.ts 文件都需要安装

import Vue from 'vue'
import VueMeta from 'vue-meta'

Vue.use(VueMeta)

在任意组件中使用

<template>
    <div class="app">
        ....
    </div>
</template>
<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
    name: 'app',
    metaInfo() {
        return {
            title: '标题'
        };
    }
});
</script>

# 获取 SEO 配置信息

import { RenderContext } from '@fmfe/genesis-core';
import Vue from 'vue';

/**
 * 服务端入口,需要导出一个方法,并且返回一个 Promise<Vue>
 */
export default async (renderContext: RenderContext): Promise<Vue> => {
    /**
     * 创建服务端应用程序
     */
    const app = new Vue({
        // options
    });
    /**
     * 等渲染完成后,将标题传输给 index.html 模板中
     */
    renderContext.beforeRender(() => {
        // 如果你需要设置网站的关键词、描述等等,请查阅相关文档:https://vue-meta.nuxtjs.org/
        const {
            title,
            meta,
            link,
            style,
            script,
            htmlAttrs,
            headAttrs,
            bodyAttrs,
            base,
            noscript
        } = app.$meta().inject();
        // 在 index.html 文件中使用 <%- meta.title %>  就可以渲染出标题了,其它的举一反三
        Object.defineProperty(renderContext.data, 'meta', {
            enumerable: false,
            value: {
                title: title?.text() || '',
                meta: meta?.text() || '',
                link: link?.text() || '',
                style: style?.text() || '',
                script: script?.text() || '',
                htmlAttrs: htmlAttrs?.text() || '',
                headAttrs: headAttrs?.text() || '',
                bodyAttrs: bodyAttrs?.text() || '',
                base: base?.text() || '',
                noscript: noscript?.text() || ''
            }
        });
    });
    return app;
};

# 自定义模板

import path from 'path';

const ssr = new SSR({
    build: {
        template: path.resolve(__dirname, './index.html')
    }
});

你需要自定义一个html模板,更多查看

# 在模板中使用

<!DOCTYPE html>
<html <%-meta.htmlAttrs%>>

<head <%-meta.bodyAttrs%>>
    <%-meta.meta%>
    <%-meta.title%>
    <%-meta.link%>
    <%-meta.style%>
    <%-style%>
</head>

<body <%-meta.headAttrs%>>
<%-html%>
<%-meta.noscript%>
<%-scriptState%>
<%-meta.script%>
<%-script%>
</body>

</html>