Nuxt.js + Vuetify でポートフォリオ作りたい その1

## はじめに

いろいろな方の記事を見ている中で自分もポートフォリオを作ってみようと思いたちました。
最近の業務にてVue.jsを使っているので、勉強がてらVue.jsをチョイス。
それとせっかくなので、Vue.jsのフレームワークの勉強もしようということでNuxt.jsを。
ついでにレスポンシブ対応も勉強しとこかなということでVuetifyを触れてみることにしました。



## とりあえずプロジェクト作ってみる

consoleにて任意のディレクトリに移動後、以下コマンドを叩きNuxtのプロジェクトを作成します。

```console 
$ npx create-nuxt-app my-portfolio
```

途中で初期設定を質問されるので、ひとまず以下の通り回答。

```console
? Project name my-portfolio
? Project description My polished Nuxt.js project
? Use a custom server framework express
? Choose features to install Linter / Formatter, Prettier, Axios
? Use a custom UI framework vuetify
? Use a custom test framework jest
? Choose rendering mode Universal
? Author name hiroki ueno
? Choose a package manager npm
```

ありがとうGoogle先生。

> - プロジェクト名は何にする？
> - プロジェクトの説明文は何にする？
> - サーバー側のフレームワークは何にする？ → とりあえず使うかわからないけどexpressを選んどこ。。。
> - インストールする機能は何にする？→ Linter / Formatter, Prettier あたりいれとけばフォーマット周りは大丈夫かな…? ついでにaxiosもいれとこ
> - UIフレームワークは何にする？ → vuetify！
> - テストフレームワークは何にする？ → あんまりJavaScript界隈のテストフレームワークは詳しくないので...持っていた参考書に乗ってたJestを選択。
> - rendering modeは何にする？ → SPAかUniversalを選択。今回はひとまずUniversalで。
> - 作成者名を入力
> - パッケージマネージャは何にする？

で終わってしばらく待つとプロジェクトができています。

## とりあえず動かしてみる

とりあえず起動して画面を見てみます。

```shell
npm run dev
```

http://localhost:3000/ にアクセスすると以下のような画面が表示されます。なんかすでにかっこいい。

![スクリーンショット 2019-05-11 11.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/c53f7b7c-9fcf-5166-aad1-76fb61c50873.png)

とりあえず雛形はできたので、生成されたソースを参考にしつつ使わない部分を削り取って作っていく感じでいきます。



## とりあえずレイアウトを弄ってみる



ではとりあえずレイアウト周りをいじってみます。

プロジェクト全体のベースカラーは`plugins/vuetify.js`にて調整できるようです。

```plugins/vuetify.js
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import colors from 'vuetify/es5/util/colors'

Vue.use(Vuetify, {
  theme: {
    primary: colors.blue.darken2,
    accent: colors.grey.darken3,
    secondary: colors.amber.darken3,
    info: colors.teal.lighten1,
    warning: colors.amber.base,
    error: colors.deepOrange.accent4,
    success: colors.green.accent3
  }
})
```  



それぞれの色の定数についてはVuetifyのドキュメントをご参照ください。
https://vuetifyjs.com/ja/framework/colors
ひとまずテーマが決まっていないのでそのままで行きます。



初期画面で表示されているヘッダーやフッター、サイドバーなど、ページ共通のレイアウト周りは`layouts/default.vue`にて実装されています。
ヘッダーの不要なボタンとかを削除してサイドバーのメニューに項目の追加を行ってみます。

```layouts/default.vue
<template>
  <v-app light>
    <v-navigation-drawer
      v-model="drawer"
      :mini-variant="miniVariant"
      :clipped="clipped"
      fixed
      app
    >
      <v-list>
        <v-list-tile
          v-for="(item, i) in items"
          :key="i"
          :to="item.to"
          router
          exact
        >
          <v-list-tile-action>
            <v-icon>{{ item.icon }}</v-icon>
          </v-list-tile-action>
          <v-list-tile-content>
            <v-list-tile-title v-text="item.title" />
          </v-list-tile-content>
        </v-list-tile>
      </v-list>
    </v-navigation-drawer>
    <v-toolbar :clipped-left="clipped" fixed app>
      <v-toolbar-side-icon @click="drawer = !drawer" />
      <v-toolbar-title v-text="title" />
      <v-spacer />
    </v-toolbar>
    <v-content>
      <v-container>
        <nuxt />
      </v-container>
    </v-content>
    <v-footer :fixed="fixed" app>
      <span>&copy; 2019 h-ueno</span>
    </v-footer>
  </v-app>
</template>

<script>
export default {
  data() {
    return {
      clipped: false,
      drawer: false,
      fixed: false,
      items: [
        {
          icon: 'home',
          title: 'Index',
          to: '/'
        },
        {
          icon: 'person',
          title: 'profile',
          to: '/profile'
        },
        {
          icon: 'list_alt',
          title: 'articles',
          to: '/articles'
        }
      ],
      miniVariant: false,
      title: 'H-UENO'
    }
  }
}
</script>
```


- `v-app`タグを`light`にするとテーマが白くなります。
- `items`にサイドバーのメニューに表示する項目を設定します。jsonで別ファイルに持たせたほうが後々良さそう。
- `items`のiconに関しては以下に対応しています。
  https://material.io/tools/icons/?style=baseline
- `<nuxt />`の箇所に`items`の`to`で設定されたルーティング先のページを表示されます。



ついでに遷移先のページを作成しておきます。
遷移先のページは`pages`ディレクトリ以下に作成します。


```pages/profile.vue
<template>
  <div>MyProfile</div>
</template>
```

```pages/articles.vue
<template>
  <div>なんか記事を表示したい</div>
</template>
```

ひとまず、現段階のソースで表示させてみます。

<img width="1280" alt="スクリーンショット 2019-05-19 11.30.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/6f3a248b-8905-6205-b1b5-0b79e51c1db7.png">

profile
<img width="564" alt="スクリーンショット 2019-05-19 11.31.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/abf9474b-32d2-bf4a-f4de-d87c07ab9be5.png">

プロジェクト立ち上げて、簡単な設定するだけでそれっぽい画面になるのほんとすごい。


## 画像表示させてみる

せっかくなので我が家の愛娘を表示させてみようかなと思いました。
画像を`assets`ディレクトリ以下に置きます。
<img width="239" alt="スクリーンショット 2019-05-19 12.09.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/5f57f5c4-02ae-34dc-ed64-c9559d605455.png">

`pages/index.vue`を変更します。

```pages/index.vue
<template>
  <div class="contents"></div>
</template>

<style>
.contents {
  height: 100vh;
  width: 100vh;
  background-image: url('~assets/cat.jpg');
}
</style>
```
表示してみます。

<img width="799" alt="スクリーンショット 2019-05-19 12.14.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/67925891-0dc4-3dd0-7852-72c53f066be3.png">
ああ＾〜かわいいんじゃあ＾〜まじ天使
（ホントは背景全面に表示させてみたかったけどそんな超解像度の写真がなかった。。。

## サイドバーの動作を変更してみる

もうこれだけで今日は満足感MAXでしたが、
ついでに、サイドバーのメニューを押してページ遷移した後もサイドバーが開きっぱなしだったのが気になったのでこれも直しておきます。


```diff:layouts/default.vue
... 略
        <v-list-tile
          v-for="(item, i) in items"
          :key="i"
          :to="item.to"
          router
          exact
+          @click="drawer = !drawer"
        >
... 略
```

とりあえずこれで今回はこれでお腹いっぱいになったので、次回以降にページを作り込んでいきます。
目標としてはもっとVuetifyの要素を勉強して使っていきたいです。

## 参考にさせていただいた方々
[Nuxt.js + Vuetify + Netlify でポートフォリオサイトを作ってみた](https://qiita.com/Y_uuu/items/f3e3382ca9f9f22e6677)
[Nuxt.jsでポートフォリオサイトを作製する](https://qiita.com/fmatzy/items/aeb1e761c87379780e7f)
[Nuxt.jsで実践的にポートフォリオサイトを作る part1〜他サイトのパクリ方入門〜](https://qiita.com/tetsufe/items/72dbb46c76ef19df6d26)
[【Ch.2】プロジェクトを作成する【Nuxt de Portfolio】](https://liginc.co.jp/449575)