VuePressで作成した静的サイトをGitHub Pagesで公開する

# 概要

VuePressを利用して作成した静的サイトをGitHub Pagesで公開するまでの手順のまとめです。

ソースコードは[rubytomato/bio] (https://github.com/rubytomato/bio)にあります。

**環境**

* Windows 10 Professional
* Node.js 8.11.2
* VuePress 0.10.2
* yarn 1.7.0
* VSCode 1.24.1

**参考**

* [VuePress] (https://vuepress.vuejs.org/)

# 事前準備

## プロジェクトディレクトリを作成

プロジェクト名およびディレクトリを”bio” (biographyの略)としました。

```text
> mkdir bio
> cd bio
```

## VuePressをインストール

VuePressを使用するにはNode.js 8.x以上が必要です。

```text
> node --version
v8.11.2
```

```text
> yarn add -D vuepress
```

**バージョン確認**

```text
> yarn run -s vuepress --version
warning package.json: No license field
0.10.2
```

### ディレクトリの確認

インストール直後の状態です。

```text
/bio
  |
  +--- /node_modules
  |
  +--- package.json
  |
  +--- yarn.lock
```

```text:package.json
{
  "devDependencies": {
    "vuepress": "^0.10.2"
  }
}
```

## README.mdの作成

簡単に動作確認するために、プロジェクトルートにREADME.mdファイルを作成します。
README.mdというファイルはindex.htmlへ変換されます。

```md
---
home: true
---
# Hello VuePress
```

**実行**

```text
> yarn run vuepress dev

//...省略...

 DONE  [19:48:07] Build 78a280 finished in 11847 ms!

> VuePress dev server listening at http://localhost:8080/
```

コンソールに出力されたURL`localhost:8080`にアクセスします。

![vp0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ed6f5e19-bf0b-5b22-9113-fafd04273863.png)

**ビルド**

```text
> yarn run vuepress build
```

ビルドが終了するとプロジェクトルート\\.vuepress\distにビルドファイルが出力されます。
ビルドファイルで動作確認するにはWeb Server for Chromeという拡張機能を利用すると便利です。

![vp5.png](https://qiita-image-store.s3.amazonaws.com/0/22772/39f14d97-a513-eac5-aa1a-64d98b567e49.png)

## package.jsonの編集

```json
{
  "name": "bio",
  "version": "1.0.0",
  "description": "A VuePress project",
  "author": "rubytomato",
  "license" : "MIT",
  "private": true,
  "scripts": {
    "dev": "vuepress dev",
    "build": "vuepress build"
  },
  "devDependencies": {
    "vuepress": "^0.10.2"
  }
}
```

## 設定ファイル(.vuepress\config.js)の作成

* 参考: [Config Reference] (https://vuepress.vuejs.org/config/#config-reference)

プロジェクトルート\\.vuepress\config.jsがVuePressの設定ファイルです。

```js:config.js
module.exports = {
  title: 'Hello rubytomato',
  description: 'Just playing around',
  locales: {
    '/': {
      lang: 'ja'
    }
  },
  meta: [
    { charset: 'utf-8' },
    { name: 'viewport', content: 'width=device-width, initial-scale=1' }
  ]
}
```

開発サーバーを立ち上げたまま作成すると、設定ファイルが即座に反映されます。

![vp1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/149ae3f1-9811-1ecb-45b8-9587df57b8e9.png)

以上で事前準備は完了です。

# カスタマイズ

## Aboutページを追加する

プロジェクトルート直下にabout.mdというファイルを作成します。

```text
/bio
  |
  +--- about.md
```

```md:about.md
# About

this is About Me page
```

mdファイルは自動的にhtmlファイルへ変換されるので、`localhost:8080/about.html`でアクセスできます。

### ナビゲーションとサイドバーを追加する

ナビゲーションを追加するには、config.jsにthemeConfigとnavを追加します。
さらにサイドバーを追加するには、themeConfigにsidebarを追加します。

```js:config.js
module.exports = {

  //...省略...

  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'About', link: '/about.html' },
      { text: 'GitHub', link: 'https://github.com/rubytomato' }
    ],
    sidebar: {
      // fallback
      '/': [
        '',        /* / */
        'about'    /* /about.html */
      ]
    }
  }
}
```

![vp2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ff284b62-7f2a-d86f-c7e2-432ea18409df.png)

## ホームページのフッターにコピーライトを追加する

ファイルの先頭にある3つのハイフンで囲まれた部分は、[Jekyll] (https://jekyllrb.com/)というライブラリが処理するYAML front matter blockといい、この記法でページごとにメタデータを定義することができます。

```md:README.md
---
home: true
footer: MIT Licensed | Copyright © 2018-present Rubytomato
---
# Hello VuePress

this is Home Page
```

* なにかしらのコンテンツがないとフッターが表示されなかったので、"this is Home Page"という文字を追加しています。
* フッターはhomeがtrueの場合に有効になります。
* YAML front matter blockを修正した場合はdevサーバーを再起動しないと反映されません。

![vp3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ffc8056c-59db-4140-4b2e-936841e1e89c.png)

## faviconを設定する

画像等の静的ファイルは.vuepress/public下に配置します。

```text
/bio
  |
  +--- /.vuepress
         |
         +--- /public
                |
                +--- /img
                       |
                       +--- favicon.png
```

```js:config.js
module.exports = {

  //...省略...

  head: [
    ['link', { rel: 'icon', type: 'image/png', href: '/img/favicon.png' }]
  ]
```

## スタイルをカスタマイズする

プロジェクトルート\\.vuepress\override.stylを作成します。

VuePressのテーマカラーは下記の最初の4行でカスタマイズできます。それぞれ変数名からわかるように、アクセント、テキスト、ボーダー、コード背景のカラーを変更できます。

```text
$accentColor = #707527
$textColor = #2c3e50
$borderColor = #eaecef
$codeBgColor = #282c34

header-bgcolor = #ff0000db
header-color = white
font-size = 16px
base-font = font-size "Lucida Grande", Arial

html
  overflow-y scroll

body
  font base-font, sans-serif

.navbar
  background-color header-bgcolor
  color header-color

.navbar .site-name
  color header-color

.nav-links a.router-link-active
  color header-color
  font-size 18px
```

変更がわかりやすいようにREADME.mdに下記のサンプルを追記しました。

```text
## table

| Tables        | Are           | Cool  |
| ------------- |:-------------:| -----:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |

## emoji

:tomato:

## code highlight

    ``` js(4)
    export default {
      data () {
        return {
          msg: 'Highlighted!'
        }
      }
    }
    ```

## tips

::: tip
This is a tip
:::
```

![vp4.png](https://qiita-image-store.s3.amazonaws.com/0/22772/053b0348-c43a-d6e0-330f-39277f369aa7.png)

# GitHub Pagesでホスティングする

ビルドした静的ファイルをGitHub Pagesでホスティングします。そのためにはリポジトリが必要になるのでプロジェクトと同じ名前で”bio”というリポジトリを作成します。

次にビルドファイルの出力先をプロジェクトルート\\docsへ変更します。
また、GitHub Pagesではcontextパスにリポジトリ名が付くのでbaseで指定します。

```js:config.js
module.exports = {
  //...省略...

  base: '/bio/',
  dest: 'docs'
}
```

ビルドすると以下のようにdocs下へ出力されます。

```text
/bio
  |
  +--- /docs
         |
         +--- /assets
         +--- /img
         +--- 404.html
         +--- about.html
         +--- index.html
```

## docsを公開する設定を行う

プロジェクトファイルをコミットしGitHubのリポジトリへpushします。
次にリポジトリのsettingsページでGitHub Pagesの設定を行います。
sourceを"None"から"master branch /docs folder"へ変更して保存します。

![vp6.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d6aac98d-6ac0-5759-2970-82c95f11df7b.png)

これでdocs下に出力されたビルドファイルがGitHub Pagesで公開されました。
このサイトは次のURLで確認できます。

https://rubytomato.github.io/bio/