フロント未学習の大学生が1週間でVue.jsを使ったポートフォリオを作った話

# ポートフォリオサイト作りました
**[Naoki Kishi's Portfolio Site](https://p1ass.com)**

<a href="https://github.com/p1ass/portfolio"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/p1ass/portfolio.png" width="460px"></a>

Topページ
![Screenshot from 2019-02-11 20-48-21.png](https://qiita-image-store.s3.amazonaws.com/0/191796/002b8d83-9963-a212-9d99-2b4115c5dfd3.png)


Skillページ
![b0a668fb-e9de-46df-a310-4447ff62da47.jpg](https://qiita-image-store.s3.amazonaws.com/0/191796/41475f03-3bf9-3066-0034-88100d0867a8.jpeg)

今までPythonやCばかり書いていてフロントエンドの技術を学んだことがなかったので、勉強を兼ねてポートフォリオサイトを作成しました。

レスポンシブ対応やSPA対応など初めてのことばかりでしたが、なんとか**1週間**で完成まで持っていくことができました。
この記事では完成までの道のりを時系列に沿って書いていきたいと思います。

# 動機
今回ポートフォリオの作ろうと思ったのは、エンジニアとして学生バイトやインターンに行きたいなと思ったからです。

今まで大したことをやってきていない僕にとって、エンジニアとして働きたいなら、何かしらアピールできるものが必要だと思いました。ポートフォリオサイトであれば、新しい知識を学べるのに加えて、自分のアピールにもつながると考えました。

~~ぜひ京都で学生アルバイトの話を知っている方がいれば教えてください(他力本願)~~

# ポートフォリオを作る前のスキルアセット
タイトルで未経験と書いてあるとおり、フロント系の言語は学んだことがありません。
とは言っても、プログラミング未経験ではないので、一般知識としてaタグやh1タグくらいは知ってました。(タイトル詐欺ならごめんなさい。）

この時点でやったことがあった言語は以下の通りです。

- Python
- C
- Kotlin

Pythonを一番触っていて、簡単なBotや大学の授業の計算などは大体Pythonにやらせてました。
また、Django REST Frameworkを使ったAPI実装をしたことがあり、Webサイトのバックエンドの知識は多少ありました。(仕事ではなく趣味ですが。）

その際に、フロントエンドの実装をやってた友人から、フロントエンドを学ぶために必要なことは教わっていたので、学習はかなりスムーズに進めることができました。

# 学習編

## HTML & CSS
Webページを作るに当たってHTMLとCSSは絶対に必要だと思います。(多分)
今回はその基礎を学ぶために**Progate**を用いました。

**[Progate](https://prog-8.com)**
![389f0783-172b-45ad-844b-be48246b861b.jpg](https://qiita-image-store.s3.amazonaws.com/0/191796/dd972f26-0464-8b33-18cd-34b0063c0add.jpeg)

Progateはプログラミングの入門向けサイトで、かなり**有名**だと思います。
以前にPython等の無料レッスンを試したことがあったのですが、その時の印象がかなり良かったので、今回は思い切って課金して、一気にレッスンを消化しました。

レッスンには、初級編〜上級編に加えて、腕試しの道場がありました。基本的なタグの使い方からレスポンシブデザインの実装まで一通り書いてありました。
また、どのレッスンも修了時間が書かれているのですが、**かなり多めに見積もられている**ように感じられました。多少なりともプログラミングをやったことがある人なら終了時間の半分から3分の1程度で終わらすことができると思います。

レッスンの中身などは各自サイトを確認していただきたいのですが、各章ごとにテーマが決められいて、その中でも細かく分かれているので、ポンポン次に進むことができました。

初心者ながら、**「上手くまとまっていて勉強しやすい」**と感じました。


## JavaScript (ES2015)
HTML & CSSを学んだ後はJavaScriptの勉強をしました。
静的サイトであれば、JacaScriptがなくても作れるとは思いますが、トレンディなJavaScriptのライブラリ (Vue.js)を使いたかったので勉強することにしました。

友人から「JavaScriptを学ぶんだったら、**ES6 (ES2015)**を学んでおけ」と言われたので、ProgateのES6のレッスンを受講しました。

~~「課金しているんだから、使わないと損。」といういかにも庶民的な考えも多少なりともありましたが。~~

こちらのレッスンはJavaScriptの文法がメインで、あまりWebと絡めた記述はありませんでした。これは個人差もあると思いますが、僕は**基礎が大事**だと思っているので、特に不満はありませんでした。

## Vue.js

### 選定理由
JavaScriptの項目でも書きましたが、今回JavaScriptのライブラリとして**Vue.js**を使用することにしました。

Vue.jsを選んだ理由としては**「今一番流行ってそう」**という単純な理由です。また、「今更jQueryを学んでも、、、」という気持ちもありました。

モダンなJavaScriptのライブラリとして**React**を挙げる方もいると思いますが、周りを見る限り、**Vue.jsの方が人気そう**であり、**GitHubのスター数もVue.jsの方が多少多かった**のでこちらを採用しました。


### 公式リファレンス最強
ライブラリを決めたので、早速勉強を始めました。

まずは、どんなことができるのかを知るために、以下の2つの記事をコピペして動かしてみました。

- [Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)
- [Vue-routerを使って、SPAをシンプルにはじめてみる](https://qiita.com/567000/items/d6a7c694a370dc92e774)

どちらも@567000 さんが書かれた記事で、とても分かりやすくまとまっていました。

次に、Vue.jsの公式リファレンスを読みました。

[はじめに - Vue.js](https://jp.vuejs.org/v2/guide/)

Vue.jsの公式リファレンスは本当に素晴らしいです。ここまで丁寧にまとまっているリファレンスというのは中々ないですし、なんといっても**日本語**です。
最近は英語のリファレンスやGitHubのコードを直接みて理解することが多かったので、とても気軽に勉強することができました。改めてVue.jsの日本のコミュニティの大きさを感じました。

公式リファレンスの「基本的な使い方」に書かれていることは一通り読んだので、ここから実際のポートフォリオサイトづくりに取り組みました。

# 実装編

## 仕様
サイトづくりをしたことがなかったので、最初から何を実装するかは決めていなかったのですが、最終的に以下のような仕様になりました。

- SPA
- GitHub Pagesによるホスティング
- Webフォントの使用
- OGP設定
- Google Analyticsによるアクセス解析

## 内容決め
ポートフォリオを作るには、まずは何を載せるかを決めないと始まりません。
今回は以下の項目を載せることにしました。

- プロフィール
- 使用言語
- 使用ツール (GitHub等)
- 作ったもの (ほとんどないけど、、、）
- 連絡先 (フォームを作るか迷ったが、気軽さからTwitterやメールアドレスのみを記載)

## レイアウトづくり
次に、どんなレイアウトにするかを決めました。ここ数年のトレンドは、**フラットデザイン**みたいです。

しかし、今回はあえて**フラットデザイン**をやめて、InstagramのアイコンのようなグラデーションやApp Storeに見られるドロップシャドウを使ったデザインにしてみました。

選んだ理由はいくつかありますが、自分が**「かっこいい」**と思ったのが一番大きいです。
確かにフラットデザインは、見やすく、ユーザーフレンドリーだと思いますが、少し**味気なさ**を感じていました。今回採用したデザインだとフラットデザインにアクセントが加わった感じで、僕の好みとマッチしていました。

かといって、ドロップシャドウやグラデーションを使いすぎると、返って見にくくなったり、ダサいデザインになってしまうので、**シンプルさと余白**を意識してレイアウトを組むようにしました。


(最初に載せたのを再掲)
![Screenshot from 2019-02-11 20-48-21.png](https://qiita-image-store.s3.amazonaws.com/0/191796/002b8d83-9963-a212-9d99-2b4115c5dfd3.png)
(画像だとグラデーションが荒い、、、）
![b0a668fb-e9de-46df-a310-4447ff62da47.jpg](https://qiita-image-store.s3.amazonaws.com/0/191796/41475f03-3bf9-3066-0034-88100d0867a8.jpeg)

## 単一ファイルコンポーネントを用いた実装
レイアウトが決まったので、ゴリゴリコーディングしていくわけですが、せっかくVue.jsを使っているので**単一ファイルコンポーネント**を用いて実装することにしました。

レイアウトを部品ごとに分けて実装する方法は、部品の再利用性や可読性を高めてくれる素晴らしい機能です。
加えて、今回は**SCSS**を用いてCSSを実装したので、変数やmixinといった機能のおかげでかなり綺麗にまとめることができました。

## Vue Routerを用いたSPA実装
やはりVue.jsといったらSPAでしょう。Vue.jsを決めたときからポートフォリオサイトはSPAで行こうと決めていました。

「SEO対策のために、**サーバーサイドレンダリング**(SSR)をした方が良い」とか、「**Nuxt.js**を使えば自動ルーティングができるよ」といったことは調べて分かっていましたが、今回は素のVue.jsでSPAを選択しました。

SSRについては、GitHub Pagesを使ってホスティングをすると決めていたのに加え、SEOを気にするサイトではないですし、重いサイトではなく、初期の表示速度を気にする必要がないので見送りました。
また、Nuxt.jsはSSRを使わないし、Vuexを使った状態管理もする必要があるほど大きなサイトではないので、こちらも見送りました。

このような理由から今回はVue Routerを使用したわけですが、一つ問題がありました。
それは、**「URLに#が表示される」**ということです。

別に大したことではないかもしれないですが、気になったので以下の記事を参考にして消すことにしました。

[Github pagesでハッシュなしSPAを作る[Vue.js + vue-router]](https://qiita.com/tatsuya_oyanagi/items/64e0658439c66b16e18c)

## レスポンシブデザイン
せっかくWebサイトつくるならスマートフォンやタブレットからの見栄えも整えたいですよね。
というわけで、Progateのレスポンシブデザインの実装を参考にしながら、レスポンシブデザインに対応しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/191796/45492dd3-deca-8671-22c4-5eec714510f3.jpeg" width=30%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/191796/f1bb982c-68d3-2a02-65f2-df174049e2b5.png" width=30%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/191796/5cee9444-32ad-55c8-9751-8e3aff91fa8e.png" width=50%>

## Webフォント
フォントを設定せずにページを作るとOSや端末によってフォントが変わってしまいます。
今回はGoogleが公開している日本語対応のWebフォントを利用しました。


[Google Fonts + 日本語 早期アクセス](https://googlefonts.github.io/japanese/)
![a0477f33-2df1-4b97-8d54-0d4343b2fe4a.jpg](https://qiita-image-store.s3.amazonaws.com/0/191796/5ef4ba46-2f9a-8da5-9093-b45e72e0b295.jpeg)
早期アクセスということで、M+ 1pは使えませんでしたが、他のフォントは何も問題なく使用することができました。

フォントの設定は、[webfontloader](https://github.com/typekit/webfontloader)を使って行いました。

(2018/10/12 追記)
早期アクセスでないバージョンがGoogle Fontsから使えるようでした。
[Google Fonts](https://fonts.google.com/?subset=japanese)

## コンパイルとホスティング
Vue.jsのプロジェクトはvue-cliを用いて生成していたのですが、GitHub Pagesにホスティング上で一つ問題にぶちあたりました。

今回はポートフォリオサイトということで、`[アカウント名].github.io`というURLでホスティングしたかったのですが、このようにホスティングするには、生成された`index.html`などをルートに置く必要がありました。
vue-cliで作成したリポジトリでコンパイルされたファイルをルートに置く設定にすると、どれがコンパイル後のファイルかよくわからなくなりそうでした。そこで設定を変え、以下のようなディレクトリ構成になるようにしました。

```config/index.js
  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../../index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../../'),
```

```
$ tree -L 2
.
├── 404.html
├── README.md
├── index.html # コンパイルされたファイル
├── static
│   ├── css
│   ├── icon-512.png
│   ├── icon.png
│   └── js
└── vue_project
    ├── build
    ├── config
    ├── index.html
    ├── node_modules
    ├── package-lock.json
    ├── package.json
    ├── src
    ├── static
    └── test

```

## Google Analytics
Vue.jsのSPA構成だと普通に`<head>`にスクリプトを埋め込んでもページ遷移がカウントされません。
今回は以下の記事を参考にし、 [vue-analytics](https://github.com/MatteoGabriele/vue-analytics)を用いて実装しました。

[Vue-SPAでもGoogle Analyticsしたい！](https://qiita.com/hirohero/items/0f29a89cd08b421ccfe1)

## 完成
やったね！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ポートフォリオサイト完成しました！Vue.jsを使ったSPA構成です！<br>ぜひ見ていってください〜<br><br>Naoki Kishi&#39;s Portfolio Site <a href="https://t.co/ztYjmBTocb">https://t.co/ztYjmBTocb</a> <a href="https://twitter.com/plus_kyoto?ref_src=twsrc%5Etfw">@plus_kyoto</a>さんから</p>&mdash; ぷらす (@plus_kyoto) <a href="https://twitter.com/plus_kyoto/status/1048909466358280192?ref_src=twsrc%5Etfw">2018年10月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# まとめ 

結構大変でしたが、なんとか1週間で完成させることができました。
今回ポートフォリオサイトを作ってみて思ったのは、

- 気合があれば一週間でサイトは作れる
- 知らないことを学ぶのは楽しい

ということです。

少なくとも一日5時間以上、多い時は10時間くらいやっていたので完成できたのかなと思ってます。
また、**自分の知らないことに興味を持って積極的に勉強することってこんなに楽しいことなんだ**と思いました。
何事にも興味を持って調べてみるという習慣はずっと続けていきたいと思います。

是非、みなさんも自分のサイトを作ってみてはいかがでしょうか？
最後までご覧いただきありがとうございました。


<a href="https://github.com/p1ass/portfolio"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/p1ass/portfolio.png" width="460px"></a>