君のSPAがもっさりなのは○○のせい

Advent Calendar 2024, JavaScript, Nuxt, UIUX, Vue

この記事は レコチョク Advent Calendar 2024 の2日目の記事となります。

デモ

まずは以下2つのデモサイトをお試しください。

一覧ページと詳細ページを持つ一般的なWebサイトの例ですが、
どちらも意図的に低速なWebサイトを演出しています。

デモサイトA

デモサイトB

どちらがよりストレスでしたか?

デモAは食べ物がクリックされると必要なデータの取得を開始し、取得が完了したら詳細ページへ遷移しています。

デモBは食べ物がクリックされると即座に詳細ページへ遷移し、データの取得が完了したらコンテンツを表示します。

また、詳細ページでのsubmitボタン押下時の挙動も同様です。

どちらも通信にかかる時間は同じですが、操作感には違いがあったのではないでしょうか?

ユーザー操作には即時レスポンスを返そう

デモA

押下から通信完了(2秒)後に画面が反応

ページ 1.1.png

デモB

押下直後に画面が反応

ページ 1.png

デモは違いが分かりやすいように通信時間を2秒と極端にしましたが、では速度自体を改善して0.2秒にできたらよいのかというと、それでもやはり遅すぎで、もっさり感じると思います。

ボタン押下への反応としては、通信時間に依存せず次フレームで即時反応を返すのが最も快適です。

また、即時画面を遷移させていたとしても、通信完了まで真っ白な画面で待機させてしまっていては読み込み中であることが伝わりません。

ローディングのインジケーターやスケルトンスクリーンを表示しましょう。

UIはユーザーとのコミュニケーション手段

この例は人間同士のコミュニケーションにも置き換えられます。

Screenshot from 2024-11-09 23-41-01.png

このトナカイ(=Webサイト)は仕事のスピードの改善(パフォーマンスチューニングやスペックアップ)をするよりも先に、まずコミュニケーションのとり方を見直したほうがいいでしょう。

Screenshot from 2024-11-09 22-33-24.png

Nuxtユーザーは特に注意

Nuxt製を公言しているWebサイトの挙動を見ると、有名サービスを含めた多くの事例でデモAのようなルーティングになってしまっています。

これはNuxt標準の非同期通信用の関数が、デフォルトでルーティングをブロックする仕様によるものと思います。

これらの関数はLazyオプションを有効にすることによってルーティングがブロックされなくなります。

まとめ

SPAをはじめ、近年のWebサイトは非同期通信を多用します。
その際、以下のポイントに注意しましょう。

デザインデータには含まれていない部分だったりすると思いますので、エンジニアが非同期処理の実装の際に気づけるといいんじゃないかと思います。

それでは、お読みいただきありがとうございました。
おわりに今年のクリスマスソングをどうぞ→『Baby Blue (Badfinger)


明日の レコチョク Advent Calendar 2024 は3日目『【iOS】SwiftUIで画面キャプチャからコンテンツを保護する』です。お楽しみに!

この記事を書いた人

kitamura
kitamura