# 使用Vuepress和Nginx搭建个人博客

# Vuepress

VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档而优化的默认主题,它的诞生初衷是为了支持 Vue 及其子项目的文档需求。
每一个由 VuePress 生成的页面都带有预渲染好的 HTML,也因此具有非常好的加载性能和搜索引擎优化(SEO)。同时,一旦页面被加载,Vue 将接管这些静态内容,并将其转换成一个完整的单页应用(SPA),其他的页面则会只在用户浏览到的时候才按需加载。

说白了,VuePress就是基于Vue,用了SSR渲染成本地静态页面,解决PWA在SEO方面的弱势。 而VuePress除了使用Vue外,还继承了Vue各项能力,比如使用stylus写css,也能通过enhanceApp来增强应用,比如在Vuepress中使用Vuex等等。 后续将介绍如果安装Vuepress,如果使用enhanceApp,如果使用stylus,如何在Vuepress中自定义主题,并且最终将vuepress内容发布到Nginx供internet访问。

# Vuepress安装和Nginx配置

# node和npm安装

sudo apt-get install nodejs
node --version
sudo apt-get install npm
npm --version

如果安装成功,node 和 npm都会有相应的版本号打印出来

# vuepress安装

// 初始化输入各种信息
npm init
// ... 各种初始化
npm install vuepress
// 当前目录下执行
sudo npm run docs:dev 

然后在本地浏览器访问localhost:8080可以看到调试页面 sudo npm run docs:build 命令可以编译生成所有的静态html文件,这些静态文件可以配置在nginx服务器直接访问

# vuepress目录结构

├── docs
│   ├── .vuepress (可选的)
│   │   ├── components (可选的)
│   │   ├── theme (可选的)
│   │   │   └── Layout.vue
│   │   ├── public (可选的)
│   │   ├── styles (可选的)
│   │   │   ├── index.styl
│   │   │   └── palette.styl
│   │   ├── templates (可选的, 谨慎配置)
│   │   │   ├── dev.html
│   │   │   └── ssr.html
│   │   ├── config.js (可选的)
│   │   └── enhanceApp.js (可选的)
│   │ 
│   ├── README.md
│   ├── guide
│   │   └── README.md
│   └── config.md
│ 
└── package.json

更多详细内容可以访问https://vuepress.vuejs.org/zh/guide/directory-structure.html (opens new window) 安装完vueress后,可以看到vuepress的目录结构如上:

  • .vuepress 博客主题(包括样式,资源文件,组件,应用增强等).
    • components 全局组件,vuepress编译时,可以作为全局组件使用
    • theme 博客布局,可以通过继承或者重写的方式更改vuepress的布局以及渲染内容,theme/layouts/Layout.vue是每个vuepress页面都会加载的一个布局组件,其中<Content/>组件会渲染完成的Markdown内容。
    • public 资源文件,如favi.icon, markdown中使用的资源文件等
    • styles 博客的css样式,可以支持stylus等
    • templates 模版,资深vuepress使用
    • config.js 博客的总体配置
    • enhanceApp.js Vue全局钩子,可以作为增强App,如使用Vuex等
  • README.md 或者(index.md) 编译后会作为博客首页即 index.html
  • guide 博客包含的所有内容,博客内容全部用md编写,vuepress会把它编译为html静态文件
  • config.md 与guide一样都会被编译为html静态文件

# vuepress中使用vuex

刚开始安装vuepress时,.vuepress目录下面是没有enhanceApp.js的,所以如果没有那么新建一个:

import Vuex from 'vuex'
import articles from './store/articles'

export default ({
  Vue, // VuePress 正在使用的 Vue 构造函数
  options, // 附加到根实例的一些选项
  router, // 当前应用的路由实例
  siteData, // 站点元数据
  isServer // 当前应用配置是处于 服务端渲染 或 客户端
}) => {
  Vue.use(Vuex)
  let store = new Vuex.Store({})
  // 注册tags store
  store.registerModule('articles',articles)
  Vue.mixin({store: store})
}

enhanceApp是Vuepress暴露出来的一个Vue全局钩子,在这里可以注册Vuex,可以做路由增强。

# Nginx配置

其实就是把生成的文件拷贝到nginx的发布目录 /disk/pinkcle/website_root

sudo apt-get install nginx

安装完后,修改nginx配置文件/etc/nginx/sites-enabled/default

server {
        listen 80;
        server_name pinkcle.com www.pinkcle.com
        root /disk/pinkcle/website_root;
        # 重定向到https
        rewrite ^(.*)$ https://$host$1 permanent; 
        location / {
                sendfile on;
                try_files $uri $uri/ =404;
        }
}
server {
        listen 443 ssl;
        root /disk/pinkcle/website_root;
        index index.html index.htm index.nginx-debian.html;
        server_name pinkcle.com www.pinkcle.com;
        # ssl 证书
        ssl_certificate pinkcle.com/1_pinkcle.com_bundle.crt;
        ssl_certificate_key pinkcle.com/2_pinkcle.com.key;
        ssl_session_timeout 5m;
        location / {
                try_files $uri $uri/ =404;
        }
}

# 自定义主题

建议参阅Vuepress官网https://vuepress.vuejs.org/zh/theme/writing-a-theme.html (opens new window)

本站是利用了Vuepress继承的特点,重写了默认主题的样式https://vuepress.vuejs.org/zh/theme/inheritance.html (opens new window) 继承跟编程语言里面的继承概念类似,如果有当前重写了默认样式,则会加载override的样式,否则会加载base样式 在.vuepress/theme 目录下新建index.js文件,然后在文件下增加如下内容,就表达了主题的继承

// 继承Vuepress默认布局
module.exports = {
  extend: '@vuepress/theme-default'
}

然后在./vuepress/theme/layouts/目录下添加Layout.vue 则编译后布局就变为了自定义的Layout.vue布局

Layout.vue 是vuepress的布局入口,一定需要。

// 重写Vuepress布局
<template>
  <div>
    <Navbar v-if="mainPage"/>
    <div v-if="mainPage" class="blog-layout">
      <Body class="blog-content" />
      <SideBar class="blog-sidebar" />
    </div>
    <div v-else class="blog-layout theme-container">
      <Navbar />
      <div class="blog-content">
        <Content class="theme-default-content" />
        <Comment class="theme-custom-content" />
        <div class="theme-custom-content">
          <RoutePage :type="'prev'"/>
          <RoutePage :type="'next'"/>
        </div>
      </div>
      <ArticleOutline class="outline-sidebar" v-if="$page.headers && $page.headers.length"/>
    </div>
  </div>
</template>

样式什么的暂时不写了,如果有需要留言,我再加上哈。

# 总结

只是简单的写了下vuepress的应用,本博客基于上述思路进行Layout以及样式,如果有想要样式及排版的,可以留言留下联系方式,发送到个人邮箱 目前样式还没整理好,待整理好后会发布github和npm。

*本博客基于以上内容搭建,如需主题,请留言联系方式,后续也会上传GitHub,以及发布npm。

* 转载请注明出处