18
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SPAの課題と近年の改善状況

Last updated at Posted at 2017-11-14

#概要
ReactやAngular等によるSPAでのサイト作成には色んな課題がありますよね。
私が2年程前にSPA(Angular2)でホームページを作ろうとした時、それら課題の為にSPAでの作成は諦めました。
それらについて、存在した課題と改善状況をまとめてみました。

##背景
2年程前までは、SPAで作るのは、ホームページではなく、Webアプリ、という時期だったかと思います。
でも、最近はブログ等、普通のホムペでもSPAで作られてたりしますよね!
そこで、再度WebサイトをSPAで作ろうと思った時に、課題の状況はどうだろうと、まとめてみた次第です。

##そもそも
いや、何で普通のウェブサイトをSPAで?
って話なんですが、メリットとして、ページビューが増えるという効果があるとの事。
[何故?]
以下のような理由があるとされています。
・ページの見え方が動的で面白くなる
・2ページ目以降の遷移が早い

#▼という訳で、課題とその解決についてです▼

###課題1-1.初回ロードが重い
[原因]
SPAでの初回ページ表示までには以下の2つのリクエストが必要になります。
①リソース取得
②データ取得

通常のWebサイトでは①のみで完了する為、どうしてもSPAページは遅くなります。

そして、普通のホムペであれば、1つのページだけ見て直帰というのはごく普通なので、この初回ロードの違いは大きいです。

image.png

###課題1-2.SEO対策が出来ない
[原因]
クローラがJSを解釈出来ない為、IndexされるページはTopページの一部、などという事が起こります。
例えば、以下の2つのURLはクローラから見たら同じに見えるという問題です。
https://qiita.com/
https://qiita.com/harufumi_abe

これは、SNSにリンクを貼り着けた時にプレビュー表示されないという問題にも繋がっています。

[過去の解決方法]
クローラのIndex用の静的ページを作るという方法がありました。
[外部環境の変化]
最近ではGoogleのクローラはJSを解釈出来る為、一部解決したとも言われますが、完全とは言えないようです。

[解決1]

上の1-1,1-2は、サーバサイドレンダリングという手で今は解決されました。
SPAサイトでも、初回リクエストで表示可能なページを取得します。
image.png

※ただし、サーバサイドはNodeでなければならないはず。


###課題2-1.ページビュー(PV)が取れない
SPAサイトはページ遷移しない為、例えばGoogleAnalyticsでPVは取れません。

[過去の解決方法]
Ajaxでアクセスをカウントする仕組みを作るというものがありました。

###課題2-2.JSエラーが捉えられない
これまで、サーバ側でHTML生成していたから、その生成過程で発生したエラーの補足は容易だった。
では、クライアント側でのエラーはどう補足する?

[過去の解決方法]
クライアントサイドて蓄積して定期的にRESTで送るという方法がありました。

image.png

##[解決2]
これは、外部サービスですが、Googleのタグマネージャが解決してくれました。
こいつはURLの変更をPVとしてカウントして、クライアントのエラーも捕捉します。

image.png

外部サービスかよ!
と思うかもしれませんが、個人的には使えるサービスは使った方が開発・保守費用の削減が出来ると思っています。

詳細は @OnederAppli さんのこちらの説明参照という事で(ノ▽`)

★SPAの各ページビューをGoogleアナリティクス+Googleタグマネージャーで簡単トラッキング!
 https://qiita.com/OnederAppli/items/0c35dc6c72da7bcada7a

★GoogleAnalytics+GoogleTagManagerでJSエラーを収集する
 https://qiita.com/OnederAppli/items/0b64df149e352a8cc7c6


###課題3.SPAで開発したサイトは簡単に盗難できる
コードの大半をクライアント側に持って行くので、表示している側は簡単に見れてしまいます。
部分的に盗む事も出来ますし、何なら右クリックダウンロードで丸ごと動く状態で盗めます。

##[解決3]
これはJSを難読化する事で概ね解決出来たかと思います。
これまでも難読化の技術はありましたが、手順が増える為あまり浸透はしていなかったという印象。
フロント開発でWebpackがスタンダードになって、ビルド過程で一緒に難読化される事で広まった印象ですね。


#▼ここからは未解決(ないし不可能)と思われる課題です▼
※どなたかご意見、別の回避策等あれば教えて頂きたい所^^;

###課題4.セキュリティに関わるキー値を持たせられない
例えば別サーバのサービスを使う場合、何かしらのキー値と併せてリクエストを投げないといけない場合があります。
そのキー値が漏れてしまうと成りすましをされる危険がある為、フロントに持たせられない。

##[回避策4]
これは残念ですが、私の場合はサーバにリクエストを仲介させる事にしました。
image.png


###課題5.動かないブラウザがある
これはしょうがないんじゃないかなぁ、数あるフロントのフレームワークも切り捨てて行っているという印象ですね^^;

##[回避策5]
SPAにしない(笑)
いや、JS使わない(ノ▽`)アチャー


以上です、どうでしょう、Webサイト、SPAで作ってみたくなったのではないでしょうか(ノ▽`)

18
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?