总体分析

主题是 vuepress1.x 中更新最多的部分,因为这块的需求量最大,ulivz 在第三届 vueconf 中的演讲中介绍了主题的一个总体思路,当时听还没有特别大的感觉;在使用过程中是觉得真的方便,不管是创建一个新的主题,还是继承主题上做一些修改,都是那么的轻而易举。特别是主题继承的理念,是其中的精华,当然其实只是用到了 webpack 的 alias 原理。

主题的大致思路

首先用了 vuepress-layout-components 插件,固定了页面只有 404 和 layout,不管如何都是从这 2 个页面中获取

在之前的配置中,通过 ClientComputedMixin 注入到页面中去,使 vue 页面可以获取到 $site 和 $page 的值。最终 theme 通过这些值可以完成不同页面的构建。

global-layout 和 layout

<template>
  <component :is="layout"/>
</template>

<script>
export default {
  computed: {
    layout () {
      if (this.$page.path) {
        const layout = this.$page.frontmatter.layout
        if (layout && (this.$vuepress.getLayoutAsyncComponent(layout)
          || this.$vuepress.getVueComponent(layout))) {
          return layout
        }
        return 'Layout'
      }
      return 'NotFound'
    }
  }
}
</script>

这里是 vuepress/core 中的 GlobalLayout 文件就把页面指向了 Layout 和 NotFound,其他的 vue 的 component 都是基于这 2 个文件扩展的。实际上 GloablLayout、layout、404 都是可以根据 alias 重写的,默认的 layout、404 是在 theme-default 里有。

总结

可以从这里看出,真正也是引入了插件的思路,最终在源码中的代码真的不多。而可扩展性让插件有更多的可操作空间。