先月のJamstack Conf 2021のトークより。
ほんとはもっと早くまとめたかったけど、仕事のアレがアレでな・・。
内容としては、ちょっと前に書いてたこの記事にも縁がある感じの内容かも。
Webサイト・アプリをどう作るか?
- という議論が最近よくある
- 今も、今までも、きっとこれからも
- Traditionalに作るか、Modernに作るかの2軸になってることが多い
- つまりMPA vs SPA
- この表現が正確かはさておき、それぞれの特徴をおさらい
MPA
SPA
- サーバーは、空っぽのHTMLと、JSだけを返す
- クライアントがそれを使ってすべての画面を表示する
- リンクを踏んでもナビゲーションは起きない
- クライアント内で完結して表示を更新する
- アプリっぽくて好評
- ただし問題もいろいろある
- 大量のJSコードが必要
- パフォーマンスの問題
- 複雑さはバグを生む
- 粗悪なアクセシビリティの問題
- 必要なツールが多くて複雑
- ブラウザの本来の挙動にそぐわない
- 悪い例: インスタ
- JSなしで動作しない
- 巨大なJSファイルが必要
- 戻るボタンも期待通りに動作しない
- フォーカスやスクロールの管理の問題
- フォーカス管理を放棄してるSPAがよくある
- ページバックで画面をスクロールしなおすアレも微妙
- ただ問題ばかりでもないし、SPAでしか実現できないこともある
- メディアを再生しながらのページ回遊
- クライアントでの状態の保持
- アニメーションつきのページ遷移のUX
- 3rdのJSも、SPAなら1度だけ評価すればいい
- MPAだと全ページであの読み込みが必要になる・・
MPAとSPAのいいとこ取りをしたい
Transitional Appsに対する反論
- まずは想定される反論に答えておきたい
1: そんなものは不要
- SPAの利点は、JSなしでもできる
- たとえば、Hotwire
- https://hotwired.dev/
- HTMLのカケラをサーバーで作って、それをWebSocketで配信する
- アイデアとしては良いけど、ネットワークの速さに依存してしまう
- 他にも気になる点はある
- GitHubでも似たようなことをやってるが、バグが多い
- closeしても消えない Issue(1)
- クライアントでの選択状態がリセットされる
- etc...
- 気になって毎回手動でリロードしちゃう
- (すごいわかる)
- HTMLをプッシュするとこうなってしまう
2: ドキュメントサイトかアプリか
3: そもそもJavaScriptが嫌
- という人たちも一定数いる
- 文化の問題
- 言語的に好きくないとか
- エッジコンピューティングで解決って言うけど
- 確かに好きな言語で書いたWASMも動く
- けど、結局はJSがベターでしょうね
- Transitional Appsは、サーバーでもクラウドでもエッジでもデプロイできる
- もちろんクライアントでもServiceWorkerでもWebWorkerでも
4: JavaScript多すぎ
- 3rdのスクリプトの話もしてたけど、それとはまた別
- サーバーでレンダリングして返しても、その後の更新のために、ハイドレーションのために、結局JSが必要になってしまう問題
- 既に表示が済んでいて、不変なコンポーネントでさえも、JSのコードとしてはダウンロードされてしまう
- これは確かに問題
- ただここは各種フレームワークが熱心に取り組んでいる分野でもある
- React: Server Components
- Marko: 部分的にハイドレーションができる
- Qwik: すべてを遅延ロードできる
- Astro: アイランドアーキテクチャ
- SvelteKit: ページレベルでハイドレーションするか選べる
- 乞うご期待
今度こそ、Transitional Apps
感想
という感じで、MPA or SPAではなくこれからは、Transitional Apps!
呼び方があるのは便利なのでそれでいいとして、あまり目新しい話はなかったな・・というのが個人的な感想。
弊社のクライアントワークではサーバーありきのソリューションに手を出しにくいせいもあって、いまいち追いきれてない世界線ってのもあるけど。
とはいえJSなし環境もちゃんと動くのが本来のWeb!みたいなところには共感できるし、理想のアーキテクチャを実現する方法は引き続き色々あるはずなので、要件にあわせてちゃんと選ぶことを諦めない姿勢が大事ってことかね〜。
そういえばRich氏、NYTを去りVercelに入ったんですって。SvelteのOSS活動をフルタイムでやってくそうな。おめでとうございます!
today is a big day for @sveltejs: i've joined @vercel to work on it full time!
— Rich Harris (@Rich_Harris) 2021年11月11日
so happy about what this means for svelte's future. it'll be the same independent, pluralistic project as before, but with Vercel's backing we can get ✨ a m b i t i o u s ✨https://t.co/ytxj3I4Te0