阿部寛のホームページをPWA化して高速化したい

[阿部寛 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/abehiroshi)の10日目の記事です。

# 「阿部寛のホームページ」はWEB高速化界隈のトレンド

先月、dev.toと阿部寛のホームページが非常に高速ということで、
インターネット界隈で話題になりました。

* [「阿部寛」の検索結果 - Qiita](https://qiita.com/search?q=%E9%98%BF%E9%83%A8%E5%AF%9B&sort=created)
* [dev.toと阿部寛のホームページどっちが速いですか？ - くうと徒然なるままに](http://kuxumarin.hatenablog.com/entry/2017/11/15/dev.to%E3%81%A8%E9%98%BF%E9%83%A8%E5%AF%9B%E3%81%AE%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A9%E3%81%A3%E3%81%A1%E3%81%8C%E9%80%9F%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F)
* [dev.toと阿部寛のホームページについてちゃんと計測させてくれ - Qiita](https://qiita.com/naru0504/items/7d652681d698f6d88c4f)

この一連の流れは、

* [リニューアルした日経電子版が高速すぎてヤバイ件｜こんぴゅ｜note](https://note.mu/konpyu/n/n9fd5b81f6305)
* <blockquote class="twitter-tweet" lang="ja"><p>dev.to あまりにも速すぎて全てのサイトが過去になってる</p>(@mizchi) <a href="https://twitter.com/mizchi/status/930650732130222080">2017, 11月 15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

あたりがブームのきっかけになったと認識しています。
自分もこれまでに無かった爆速っぷりに感動し、中でもこの記事には特に感銘を受けました。

[なぜ dev.to がこんなにも速く、こんなにも自分にとって感動的なのか](https://dev.to/mizchi/-devto--b5)

もう最高です。

阿部寛のホームページの高速化については、

* [阿部寛のサイトを高速化する - Qiita](https://qiita.com/Morix1500/items/0eac072a027d478a6b83)
* [阿部寛のサイトをモダンなhtmlにする - Qiita](https://qiita.com/ksk1015/items/08145ace5c2d089f198d)
* [阿部寛のホームページをモダン化する &#8211; 零弐壱蜂](https://b.0218.jp/20171204012101.html)

あたりで先人たちがいろいろと試されている模様でした。
と、そんな時にちょうど昨日社内勉強会の当番が回ってきたので、ネタとして阿部寛さんのホームページをPWA化してさらに高速化するというのにチャレンジしてみました。

自分は普段はほぼサーバサイド・バックエンドをやっており、恥ずかしながら最近のフロントエンド界隈のトレンドは追えておらず、ReactはおろかVue.jsすらもまともに触ったことがありませでした。が、この記事内で紹介されている[preact](https://github.com/developit/preact-cli)なら自分でもいけるかも、と。



# PWA（Progressive Web Apps）とは

PWAについてはこのあたりが参考になりました。

* [いまさら聞けないPWAとAMP - Qiita](https://qiita.com/edwardkenfox/items/4c0b9550ffa48c1f0445)
* [Googleが取り組むWebのアプリ化プロジェクト「PWA」とは？- WPJ](https://www.webprofessional.jp/what-is-the-attention-project-pwa-by-google/)
* [dev.toがなぜinsanely  fastを実現出来ているか - Qiita](https://qiita.com/saboyutaka/items/1f528ec3ce85476d7561)

単に高速なだけでなく、オフラインでも動いたりネイティブアプリっぽく出来たりととても素敵な感じです。
これが実現出来れば飛行機の機内でもネットの届かない離島でもどこでも阿部寛のホームページを鑑賞して楽しむ事ができるようになりそうです:relaxed:

# まずはpreactでデフォルトのテンプレートを試す

[前述の記事](https://dev.to/mizchi/-devto--b5)内のコマンド

```shell
$ npm install -g preact-cli
$ npm install -g firebase-tools
$ preact create default myprpl
$ cd myprpl
$ preact build -p
$ firebase init # firebase hosting で build ディレクトリを指定
$ firebase deploy
```

ほぼそのまんまでテンプレートのデモサイトがfirebase上で動くことを確認しました。

https://preact-sample.firebaseapp.com/

# 公式ホームページを写経してコンポーネント化
PWAとはこういうものなのか、という雰囲気を掴んだところで、
いよいよ[阿部寛さんのホームページ](http://abehiroshi.la.coocan.jp/)のhtmlを眺めます。

## 伝統的なHTMLを修正していく
元がホームページビルダー製のHTML4なので、地道に修正していきます。

- frameが使えなかったり
<img width="1210" alt="スクリーンショット 2017-12-08 00.58.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/28477/a16caeab-a7e9-ff79-711d-3cf6a395c83c.png">

- 閉じタグで怒られたり
<img width="816" alt="スクリーンショット 2017-12-08 01.55.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/28477/978f8ba6-bb08-282a-efaa-5b8542805dc8.png">

- 大文字のタグを小文字に置換していったり
<img width="621" alt="スクリーンショット 2017-12-08 03.15.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/28477/1c6f1899-eb9f-91c9-c008-a62165d1a4d0.png">

- menu.htm をコンポーネント化したり

ひたすら地味に修正していきます。慣れてない作業なのでここが一番時間がかかりました。🤧

## frameが使えないため、CSSで代替
自分はCSSもあんまり分からないので、この最高のChrome拡張
[いまみているウェブページを阿部寛のサイトっぽくするChrome拡張を作った](https://qiita.com/kyoyababa/items/b7e80ac4815bcb95a49a)
のCSS部分を参考にさせていただきました。

## 骨組みが出来たので、速度計測をしながら少し改良
速度計測には、以下のものを使わせていただきました。

* [Google PageSpeed Tools](https://developers.google.com/speed/pagespeed/insights/)
* [webpagetest.org](https://www.webpagetest.org/)
* [Lighthouse](https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=ja)

## jpgをWebP化
https://cloudinary.com/
を使わせていただき、formatをautoにしてChromeではWebP、Firefoxではjpgになるようにしました。
さすがCDN、もうこれだけで十分速いです。ついでにモザイクをかけたりもオンラインで出来るので超楽でした。

## Cache-Controlを設定
静的なassetsにはCache-Controlを設定したりしました。

## ちょっとだけレスポンシブに
preactデフォルトのテンプレートだとPC viewは良いものの、スマホブラウザだと疑似フレームの箇所が結構崩れてしまうため、ちょこっとだけ微調整しました。
ただし、元のトラディショナルなホームページの雰囲気を残すために、メニュー等のベースはそのままにしています。

# とりあえず完成
https://preact-pwa-abehiroshi.firebaseapp.com/

<img src="https://res.cloudinary.com/teckl/image/upload/s--08lYALud--/e_pixelate:10/v1512829396/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-12-09_23.22.38_vdcoc7.png" />

# 早速計測します
## Google PageSpeed Tools
- [PageSpeed Insights - 公式](https://developers.google.com/speed/pagespeed/insights/?hl=ja&url=http%3A%2F%2Fabehiroshi.la.coocan.jp%2F&tab=mobile)
<img width="1040" alt="スクリーンショット 2017-12-09 23.26.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/28477/277af58e-389b-a72b-7cff-55d985911617.png">

- [PageSpeed Insights - Preact PWA abehiroshi](https://developers.google.com/speed/pagespeed/insights/?hl=ja&url=https%3A%2F%2Fpreact-pwa-abehiroshi.firebaseapp.com%2F&tab=desktop)
<img width="875" alt="スクリーンショット 2017-12-09 23.28.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/28477/16f37d2a-2e46-f937-2e6c-f06f035fa48b.png">

本家が93のところ、無事に97まで行くことができました。

## webpagetest.org
- [WebPagetest Test Result - Tokyo : abehiroshi.la.coocan.jp/](https://www.webpagetest.org/result/171208_RC_7cf3af7931d86d155abff054b51bb779/)
<img src="https://res.cloudinary.com/teckl/image/upload/s--x3lPD8Jb--/f_auto/v1512830212/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-12-09_23.34.18_aabp65.png" />

- [WebPagetest Test Details - Tokyo : preact-pwa-abehiroshi.firebaseapp.com/](https://www.webpagetest.org/result/171208_6N_9f0511da00dec6fa0db23d868c130417/3/details/)
<img src="https://res.cloudinary.com/teckl/image/upload/s--PGGMxguC--/v1512830995/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-12-09_23.49.14_yi0dtj.png" />

Cache static contentのところはCache-Conrolとか入れていいのか分からなかったのでそのままにしておいてます。😅

## Lighthouse
- 公式
<img src="https://res.cloudinary.com/teckl/image/upload/s--6wcF6BSg--/v1512830659/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-12-09_23.40.45_cm103x.png">

- Preact PWA abehiroshi
<img src="https://res.cloudinary.com/teckl/image/upload/s--3o8T2OrH--/v1512830669/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-12-09_23.43.38_cnp5nd.png">

さすがpreact、何も無い状態の100点からはちょっと落ちちゃいましたが、PWA面は素晴らしいスコアです。

# まとめ
これまでフロントエンド界隈はあまり興味を持っていなかったのですが、今回阿部寛さんのホームページを介してpreactを試してみて、PWAの可能性を体験することが出来ました。
これからはフロントエンド方面についても少しは勉強していかねばと思わされました。
きっかけを作ってくれた阿部寛さんのホームページには本当に感謝です！

※なお、この実験サイトは実験期間が終わりましたら削除の方向で考えておりますが、公開にあたり、所属事務所様にもメールにて一報を入れさせていただいております。🙇