什么是 VuePress ?

官网上给出的说明是: Vue驱动的静态网站生成器

从名字可以看出来,这套生成器需要依赖Vue,vue安装又要依赖Node.js,所以安装它的前提就是安装Node.js,并且,Node.js 版本 >= 8.6。

通过 VuePress 能做什么?

  • 以 Markdown 为中心的项目结构,以最少的配置帮助你专注于写作。
  • 享受 Vue + webpack 的开发体验,可以在 Markdown 中使用 Vue 组件,又可以使用 Vue 来开发自定义主题。
  • VuePress 会为每个页面预渲染生成静态的 HTML,同时,每个页面被加载的时候,将作为 SPA 运行。(SPA:Single Page Application 单页面应用)
  • VuePress 的优点?

  • 自定义开发主题
  • 具有非常好的加载性能和搜索引擎优化(SEO)
  • 新建一个空文件夹,进入该文件夹;

    初始化项目:npm init 全部直接敲回车跳过,执行完之后,根目录下会生成一个package.json文件,里面有一些基本的配置;

    安装 vuepress:npm install -D vuepress 需要等一段时间

    在根目录下新建一个docs文件夹,在这个docs下边新建一个README.md文件,内容按官网的默认主题配置里的写,直接拷贝过来:

    README.md

    home: true heroImage: /hero.png heroText: Hero 标题 tagline: Hero 副标题 actionText: 快速上手 → actionLink: /zh/guide/ features: - title: 简洁至上 details: 以 Markdown 为中心的项目结构,以最少的配置帮助你专注于写作。 - title: Vue驱动 details: 享受 Vue + webpack 的开发体验,在 Markdown 中使用 Vue 组件,同时可以使用 Vue 来开发自定义主题。 - title: 高性能 details: VuePress 为每个页面预渲染生成静态的 HTML,同时在页面被加载的时候,将作为 SPA 运行。

    上面代码里面有一个图片的路径,这里的 " / " 指的是是打包后的 public 目录(后面会提到);

    在docs文件夹下新建一个.vuepress文件夹,在它的根目录下新建一个配置文件config.js,用来配置网站的一些信息和功能,具体配置属性和值可以去官网的 配置 里了解;下面是一些主要的配置信息,可扩充:

    config.js

    module.exports = {
        title: '琳珰的博客', 
        description: '测试',
        themeConfig: {
            search: true,//搜索
            searchMaxSuggestions: 10,
            nav: [
                { text: '首页', link: '/' },
                { text: '指南', link: '/guide/' },
                { text: '更多', link: 'https://google.com' },
    

    到这里,还需要一个公共静态资源的存放位置,在.vuepress文件夹目录下新建一个public文件夹,把静态资源(image、css、js)都放在这个文件夹里面;

    配置 项目根目录下的 package.json 文件,运行和打包的命令声明一下:

    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "dev": "vuepress dev docs",
        "build": "vuepress build docs"
    

    开始本地运行项目 npm run dev ,成功后访问生成的本地连接地址,一般是 localhost:8080 ;

    如果运行成功的话,大概是下面这个样子:

    部署到 github 上

    在自己的github里面新建一个仓库。名字为<你的用户名>.github.io(必要)这样才能通过<你的用户名>.github.io访问到你的网站

    回到项目根目录下,运行 npm run build , 构建一下项目

    在构建完之后,进入生成的dist文件目录下,运行以下命令:

    git init
    git add .
    git commit -m '提交'
    git push -f git@github.com:<用户名>/<用户名>.github.io.git master
    

    提交到github上之后,在浏览器地址栏输入<你的用户名>.github.io ,就可以访问到网站首页

    由于该搜索组件使用了内置调色板,你可以通过 styles/palette.styl 来调整搜索框的默认颜色:

    // 你现在看到的这个搜索栏的颜色,可以根据需求修改
    $accentColor = #3eaf7c
    $textColor = #2c3e50
    $borderColor = #eaecef
    $codeBgColor = #282c34
    $arrowBgColor = #ccc
    

    plugin-search 这个插件只能实现文章查找,最后的显示结果由文章列表组成,不能实现全文搜索。

    全文搜索插件

    可以实现在所有文章中查找关键字

  • 用下划线跟不同颜色区分关键字,不高亮
  • 不能限制搜索结果数量,默认显示所有搜索结果
  • vuepress-plugin-flexsearch

    也能实现全文检索,并且提供了许多配置项

    // .vuepress/config.js
    module.exports = {
        plugins: [
          ['flexsearch', {
              Plugin custom options
            maxSuggestions: 10,    // 要在菜单上显示多少搜索建议,默认值为10
            searchPaths: ['path1', 'path2'],    // 搜索的路径限制,如果要实现全文检索请把它置空
            searchHotkeys: ['s'],    // 触发搜索的按键,默认是s键,您可以添加更多
            searchResultLength: 60,    // 展示多少条搜索结果,默认是60条
            splitHighlightedWords: ' ',  // regex or string to split highlighted words by, keep it null to use flexsearch.split
            noExtraSpaceAfterHtmlTag: false,   // don't add extra spaces in highlighted results
              Default FlexSearch options
              To override the default options you can see available options at https://github.com/nextapps-de/flexsearch
            search_options: {
              encode: "icase",
              tokenize: "forward",
              resolution: 9,
              doc: {
                id: "key",
                field: ["title", "content", "headers"],
          // other plugins
    
    集成第三方免费搜索服务 algolia

    vuepress官网用的就是这个服务,但是验证通过时间比较久,网站未完善的话不建议使用

    sidebar: [
          '/page-a',
          ['/page-b', 'Explicit link text']
    

    多个侧边栏内容

    根据不同页面路由展示不同的侧边栏。

  • 确保 docs 文件夹下结构与下面的结构相似:
  • ├─ README.md ├─ contact.md ├─ about.md ├─ foo/ │ ├─ README.md │ ├─ one.md │ └─ two.md └─ bar/ ├─ README.md ├─ three.md └─ four.md

    ​ 我的目录结构如下

  • sidebar配置如下(以我现在的例子为例):
  • // .vuepress/config.js
    module.exports = {
      themeConfig: {
        sidebar: {
                '/appTechnology/': '',
                '/guide/': '',
                '/mascot/': '',
                '/openApi/': '',
                '/otherSource/': '',
                '/overview/': [
                    'start',
                    'deployment'
                '/platformTechnology/': [
                    'CAP',
                    'CIP',
                    'CMP',
                    'CTP'
                '/': ['']
    

    不能动态切换主题,只能下载开源主题或者自定义主题,重新构建代码运行。

    自定义主题

    在 .vuepress 目录底下新建一个theme文件夹,按照 vue 项目结构的方式创建目录结构,layout.vue、components、main.js等。

    theme
    ├── global-components
    │   └── xxx.vue
    ├── components
    │   └── xxx.vue
    ├── layouts
    │   ├── Layout.vue (必要的)
    │   └── 404.vue
    ├── styles
    │   ├── index.styl
    │   └── palette.styl
    ├── templates
    │   ├── dev.html
    │   └── ssr.html
    ├── index.js
    ├── enhanceApp.js
    └── package.json
    

    关于路由:路由是以docs目录下的文件目录为路径的,并且每个需要跳转的路由都需要在md文件的formatter里面添加上layout属性,否则不能正常渲染;

    网站元数据、页面元数据

    $site: 现在看到的这个网站的对象结构:

    "title": "VuePress", "description": "Vue 驱动的静态网站生成器", "base": "/", "pages": [ "lastUpdated": 1524027677000, "path": "/", "title": "VuePress", "frontmatter": {}

    $page:正在看的这个页面对象的结构:

    "lastUpdated": 1524847549000, "path": "/custom-themes.html", "title": "自定义主题", "headers": [/* ... */], "frontmatter": {}

    $page 和 $site 中的frontmatter里面的数据是从每个md文件的配置中来的,语法是三个短横线开头结尾

    我们可以在这个配置里面定义变量,我们在使用的时候,可以从$page.frontmatter里面获取到。

    vuepress 可以支持在 markdown 文件里面编写 vue 语法代码

    访问 leanCloud,注册一个账号,然后新建一个开发版本的应用,创建成功之后,进入这个应用,在左侧栏左下角有个设置,点击展开,选择应用凭证,就能看到 appId 和 appKey,后面会用到。

    复制默认主题的代码到 theme 文件夹,默认主题的代码在 node_modules/@vuepress/theme-default 底下,其实就是复用了默认主题,并在默认主题的基础上做布局修改。

    在theme文件夹下的 global-components 下面新建一个 Comment.vue ,这就是我们要加的评论组件,代码大致这样:

    <template>
      <div class="ValineComment" v-if="comment">
          :id="page.path"
          class="leancloud-visitors"
          :data-flag-title="page.title"
          <em class="post-meta-item-text">文章阅读量 </em>
          <i class="leancloud-visitors-count">1000000+</i>
        </span>
        <div id="vcomments"></div>
    </template>
    <script>
    export default {
      computed: {
        comment: function () {
          let { comment } = this.$frontmatter;
          if (typeof comment === "undefined") {
            return true;
          return comment;
        page: function () {
          let { path = "/", title = "首页" } = this.$page;
          return { path, title };
      mounted() {
        this.renderValine();
      watch: {
        $route: {
          handler: function (to, from) {
            if (to.path !== from.path) {
              this.$nextTick(() => {
                this.renderValine();
      methods: {
        renderValine() {
          if (typeof window !== "undefined") {
            this.window = window;
            window.AV = require("leancloud-storage");
          const Valine = require("valine");
          // Valine 配置
          new Valine({
            el: "#vcomments",
            appId: "cNKG0KJrBgAefTH2MFT5OtYJ-gzGzoHsz", // 换成自己的appId
            appKey: "qt3wP5EjrTRHOR5eOmA7y6d2", // 换成自己的appKey
            notify: false,
            verify: false,
            avatar: "retro",
            path: window.location.pathname,
            meta: [],
            pageSize: 10,
            visitor: true,
            placeholder: "欢迎留言...",
    </script>
    <style lang="stylus" scoped>
    .ValineComment {
      padding: 0 2rem;
    .leancloud-visitors {
      display: inline-block;
      margin-bottom: 1rem;
    </style>
    

    把 Comment 组件添加到每个页面。找到theme/components/Page.vue,在Pagenav组件标签下方添加 <Comment />

    <template>
         <main class="page">
           <slot name="top" /><Content class="theme-default-content" />
           <PageEdit /><PageNav v-bind="{ sidebarItems }" />
           <Comment /><slot name="bottom" />
         </main>
    </template>