Posted at

「SPAらしさ」について考える(メモ)

ここ最近Reactを使ったSPAの開発に勤しんでいたところ

やればやるほどSPAってなんなんだとなった。

単一ページ?いやでも複数ページあるけど。

ゲシュタルト崩壊を起こした。

エスピーエー ワカラナイ ググル

ググッタ メイカク テイギ ナイ

SPAというのはなんとなく定義されているものの明確な定義はないらしい。

というわけでどういうものが「SPA」だと感じるのか

ひいては「SPAらしさ」とはなにかについて考察してみた。


結論

あらかじめ結論を書いてしまうと

この記事を書いた結果以下の結論に行き着いた(あくまで個人の見解)

SPAらしさ=ネイティブっぽいかどうか

以下はSPAらしさってなんだとか

なんかもういろいろごちゃごちゃ語っています。


SSRはどうか

SSRってそもそもサーバーでHTML作ってるし

普通に通信発生してるし

バックエンドとフロントエンドのソースコードを共通化できる

アイソモーフィックではあるものの

SPAらしくない。

結局通信してURLに対し異なるHTMLを返すというのは

先祖返りというか、それSPAで作る意味あったの。。。

という疑惑を抱いてしまうので「SPAらしくない」と判断。

(でも検索ロボットに対してのみSSRするならSPAらしいと思う)


SPAの利点?


通常のWebページではできないUXができる

高速なページ遷移

読み込みが早い


など、色々言われてはいるものの

正直そこまでメリットと言えるレベルか?という思いもあり

SPA自体にはさほどメリットはないと思っている。


SPAは副産物的なものでは?

SPAがトレンドっぽくなっているのは

SPAにメリットがあるのではなく

バックエンド側をシンプルなAPIの実装のみにすることにメリットがあった

と言う方が正しいと思っている。

JSONを返すだけのAPIは

ネイティブからもウェブからも利用できる

じゃぁ次はネイティブもフロントも同じコードで書けたらいいよね

とアイソモーフィックを目指した結果のSPA

と考えた方がしっくりくる。


SPAは早い?

SPAは読み込みが早いと言われることもあるが

JSが肥大化して実はそんな早くないということも珍しくないと思うし

パフォーマンスチューニングによって

最終的に従来のウェブサイトより早くできるとは思うものの

それがすごいメリットと言えるほどかというと微妙なラインでは?


jQueryでは限界がある?

よく複雑なDOM操作をjQueryでやるのは大変と説明されることもあるが

DOM操作だけで考えた場合、jQueryの方が優れていると感じる面もある。

従来のウェブサイトらしいサイトであればjQueryのがはるかに簡単だし

十分なケースも多いと思われる。

ただDOM生成やネイティブアプリレベルのDOM操作

という観点で考えた場合はやはりReactの方が優れていると感じる。

(あとVDOMによる差分更新もメリットか)

ネストされたDOM構造をjQueryで頑張って作っていくというのは

不可能ではないがあまり書きたいとは思えない。(好みの問題)


Reactを使う理由

個人的になぜReactを使うかという事を改めて考えた場合

①バックエンドはAPIだけにしたい

②DOM生成をjQueryでやるのはつらい

③VDOMによる差分レンダリングだから無駄が少ない

という3点からReactを採用しているようだ。

(なんとなく利点は感じていたものの、改めて自覚した)

将来的にネイティブにも横展開できるかどうかという点はさほど考えていない。

(簡単にできるなら嬉しいなー程度)


個人的な悩みの解決

従来のWebサイトのようなSPAっぽくないサイトを

Reactで作る意味はあるのかというもやもやがあったのだが

今持てる知識の中で

バックエンドはAPIのみにしたいとなった場合

フロントは以下の2択を迫られる

①静的なhtmlでサイトを作るか

②SPAで作るか

SPAで作るメリットあるのかと思っていたが

バックエンドをAPIだけにできるじゃんと考えるとスッキリできた。


主となるのがフロントなのかバックエンドなのか

これは個人的な感覚が強い部分だが

APIからデータを取得する頻度は少ない方がSPAらしく感じる。

ゲームなんかでは、基本的にプレイ中は常にオンメモリでデータが管理され

セーブ時に必要なデータをまとめてHDD等に保存する

この作りに近いほどSPAらしさを感じる。

SPAらしくないと感じる例としては

何かしらデータを更新するたびに最新のデータをAPIから取得しなおして

画面を全更新かけるような作りである。

基本的にフロント側でデータを管理し

バックエンドはデータの保管場所程度

というくらいがSPAらしいのではないかと感じる。


まとめ

上記を踏まえたまとめ


SPAのメリット

①バックエンドをAPIだけにできる

②ネイティブの作りっぽくなるほど恩恵が得られやすい


Reactのメリット

①DOM生成楽

②ある程度規模が大きくなっても管理しやすい(実力次第でもある)


SPAらしさ

ネイティブに近いほどSPAらしさが出る


SPAらしさを損なう要因


  • SSR

  • APIに頼りすぎるDOM更新


あとがき

五月雨に書きなぐった事で

今までもやもやしていた事が自分なりに整理されました。

そしてSPAは難しいと言う事も再確認できました。

SPAを開発するとなった場合、多くはReactかVueを使うことになると思いますが

そもそもjQueryだけでもそこそこ複雑なアプリケーションを作る事は可能です。

にも関わらずReactやVueという新しいフレームワークが誕生したのは

jQueryで作るのが難しいくらい複雑なものを作ろうとしているからだと思いました。

いくらReactを使えばSPAが作れるといったところで

そもそもSPAが難しいジャンルであり

(特にReactはあくまでViewライブラリ、Store管理は別途知識が必要ですし)

それなりの技術力、設計力、経験値がなければ

ReactやVueを使ったところでカオスになってしまう。

でも、だからこそ挑戦しがいがあり、面白く感じる自分がいる

そうも思いました。

終わり。