【非エンジニアもわかる】SPAを理解したい君へ

# はじめに
こんにちは、[まつけん](https://twitter.com/matsuken_web314)です。

僕が開発に携わっている[クラウドテック](https://crowdtech.jp/)が管理画面のSPAへのリプレースが始まりました。　

「今流行りのモダンな技術を習得するチャンスや！」と思ってます。
なので、この際SPAをエンジニアじゃない人に説明できるくらい自分でも理解したいと思ったので、SPAを図解などを用いて、できるだけ噛み砕いた説明をします。

## 早速みなさんに質問です！
> Q: 従来のWebサイトとSPAで作られたWebサイトの仕組みの違いを説明できますか？

**この記事を最後まで読むと**、上記のような質問にさらっと答えることができます。

![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/87cdd63c-363f-ba7a-5844-7a74ec9775ae.jpeg)



## 想定読者
- SPA開発の知見が浅い人
    - IT企業に勤めているがエンジニアではない人
    - エンジニア経験が浅い人（1年未満）


# 【基礎】SPAとは
SPA（シングルページアプリケーション）は、近年主流のWebサービスの開発手法の1つ。
その名の通り、1枚(シングル)のページでコンテンツが切り替わるWebアプリケーション（サイト）です。
[Google map](https://www.google.co.jp/maps/?hl=ja)やSlackなどで使われています。

:::note info
**SPAの良い点**
- ページ遷移にカクツキがなく、なめらかなスマホアプリのような動き
- サイト内でのページ遷移速度アップによる、ユーザー体験の向上
:::

現代のWebサイトでは**ページの表示速度は超重要**です。脱線しますが、ここで面白いデータがあるので、紹介します。

以下のグラフはAmazonのエンジニアが公開している横軸が「ページの表示速度」、縦軸が「売り上げ」のグラフです。
要約すると、「ページの表示速度が0.1秒遅くなれば、1％売り上げが減少し、1秒早くなれば10％売り上げが増加する」ということを示しています。


![img_76faf8b7798066e7b2f478174f61a518131100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/2ae421c8-b249-9d63-9fd0-5fdf8faf6d3a.jpeg)

> [｢表示が0.1秒遅れると､売上が1％減少する｣絶対王者アマゾンがやっている"すごすぎるデータ分析"](https://president.jp/articles/-/54736?page=5) より引用

ではなぜ、SPAで作ると「従来のWebサイトと比べて**サイト内のページ表示速度がアップするのか**」について、以降の文章で語っていきます。



# Webの処理の全体感

まずはWebの処理の全体感を把握してもらいたいので、ざっくりいうと下記の流れでWebは成り立っています。
- クライアントからサーバーにリクエストを投げて、サーバーからクライアントにレスポンスを返します。

ここで言う「クライアント」はユーザーが操作するPCやスマホ端末などを指し、「サーバー」はサービス提供側のコンピュータのことです。
![simple-client-server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/8cdd6be2-7159-ac6d-073e-b2582c1a2034.png)

> [Web のしくみ - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/How_the_Web_works) より引用



# 従来のWebサイトとSPAで作られたWebサイトの処理の違い
ここからは例として、ユーザーがQiitaを閲覧する流れの下記4つの処理で、「従来のWebサイト」と「SPAのサイト」でどの部分で処理が違ってくるのかを説明します。

1. クライアントから、「Qiitaを見せて」のリクエスト
2. サーバーから、「これがQiitaのTopページやで」のレスポンス 
3. クライアントから、「次はまつけんのプロフィールを見せて」 
4. サーバーから、「これがQiitaのまつけんのプロフィールやで」のレスポンス


**【補足】**
※従来のWebサイト・・・　この記事では、MPA（Multi Page Application）のことを「従来のWebサイト」と表現させていただきます。
> [MPA参考資料](https://bootcamp.fjord.jp/articles/53)


### 従来のWebサイト処理の流れ

![Group 2 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/e206590d-a543-88e3-1a46-74ed8f1c02e1.jpeg)


**【解説】**

①②
AさんがQiitaのトップページにアクセスすると、サーバがリクエストを受け付けて、一致するページのHTMLファイルを返却します。

③④
Aさんが「まつけんのプロフィールページ」のリンクをクリック（リクエスト）したことにより、サーバー側から一致するページのHTMLファイルを返却する。以降、画面遷移のたび、③④を繰り返す。これを**同期通信**と呼びます。

「**同期通信**　is 何？」っていう疑問にお答えすると、
クライアントはサーバーからレスポンスが返ってくるまで、他の作業ができなくなる通信方式です。なので、ユーザーの待ち時間が発生します。

![Group 4 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/f2019d31-f5fe-04ed-8375-a3c9e783c6fd.jpeg)

:::note warn
**【まとめ】従来のWebサイトでは、**
上記のように画面遷移する度、サーバー側からHTMLファイルがレスポンスとして送られるため
<font color=red>「ページ全体の再読み込み」</font>が発生します。

- <font color=red>「ページ全体の再読み込み」</font>→→ ユーザーの待ち状態発生→→ ユーザー体験の低下
    - これを**同期通信**と呼びます
:::


なので、上記のようにユーザー体験を低下させる可能性が従来のサイトにはあります。

▼**同期通信**について、分かりやすい記事
- [初心者目線でAjaxの説明](https://qiita.com/hisamura333/items/e3ea6ae549eb09b7efb9#%E5%90%8C%E6%9C%9F%E9%80%9A%E4%BF%A1%E3%81%AE%E5%A0%B4%E5%90%88)
- [Ajaxについて理解する](https://blog-kahamura.vercel.app/articles/understanding-ajax)



### SPAのWebサイト処理の流れ

![Group 3 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/2c0545d9-7b6c-123f-bbc7-9df32c92a1e5.jpeg)



**【解説】**

①② →→ ここまでは従来のサイトと同じ
AさんがQiitaのトップページにアクセスすると、サーバがリクエストを受け付けて、一致するページのHTMLファイルを返却します。


③④
Aさんが「まつけんのプロフィールページ」のリンクをクリック（リクエスト）したことにより、サーバー側から必要最小限のデータを返却し、**非同期通信**で画面更新します。以降、画面遷移のたび、③④を繰り返す。

「**非同期通信**　is 何？」っていう疑問にお答えすると、
クライアントはサーバーからのレスポンスが返ってこなくても他の作業ができる通信方式です。

![Group 5 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/bcf9f0d4-0f57-6c0f-45a0-580bd078d644.jpeg)





実際にSPAで作られているQiitaの[トップページ](https://qiita.com/)から[プロフィールページ](https://qiita.com/matsuken314)へ遷移してみると、ヘッダーが共通で存在していて、必要最小限のデータだけ更新しているのが分かります。


:::note info
**SPAの画面遷移が従来のサイトより速い理由**
画面全体の更新をせず、非同期通信のみで画面遷移を実現できるから
:::

# 最初の質問にはこう答える

> Q: 　従来のWebアプリケーションとSPAで作られたWebアプリケーションの仕組みの違いを説明できますか？

最初の質問にはこんな感じで回答できますね

> A: 　従来のサイトでは画面遷移するたびにサーバー側にHTMLファイルのリクエストが送られ、HTMLファイルがレスポンスとして返却されます。なので、ページ全体の再読み込みが発生し、ユーザーの待機状態が続くことによって、ユーザー体験の低下に繋がる可能性がある。

>一方、SPAのサイトは画面遷移の時、サーバー側から必要最小限のデータ取得を非同期通信で行っているため、ユーザーの待機状態が発生せず、なめらかなスマホアプリのようなページ遷移になる。
結果的にそれが「軽いサイト」と認識され、ユーザー体験向上に繋がる。　:smile:  「キリっ！ :star:  」

![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/87cdd63c-363f-ba7a-5844-7a74ec9775ae.jpeg)


# 参考サイト
https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/How_the_Web_works

https://zenn.dev/kazunori_kimura/articles/e934ae459cfa59de5424


https://zenn.dev/ak/articles/61d25099295372#spa

https://zenn.dev/koduki/articles/0fe6cc5ada58e5600f75#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9Fseo

https://note.com/sakamichiyuki/n/n758d5d6d7396

https://president.jp/articles/-/54736?page=5

https://qiita.com/takanorip/items/82f0c70ebc81e9246c7a