フロントエンドエンジニアが紹介するOTA系サービスの推しポイント

## はじめに

一休.com、Yahoo!トラベルのフロントエンドの開発を担当しております、卯田と申します。

本記事は[一休.com Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ikyu) 21日目の記事です。

私は、Chrome DevToolsを開きながら、競合他社の画面をぽちぽちいじって、良い機能や技術スタックを眺めることがあります。

そこで、「発見した事」「出来事」を共有しようと思います。

※担当サービスが宿泊予約を扱っていることもあり、見ているサービスは[Online Travel Agent(OTA)](https://www.tourism.jp/tourism-database/glossary/ota/)に偏りがちです。
※「散歩してたら良さそうなお店見つけたよ、このご飯が美味しんだよ！」のネットサーフィン版（フロントエンジニア視点）だと思っていただければ幸いです。




## 散歩のお供

- [Chrome DevTools  |  Chrome for Developers](https://developer.chrome.com/docs/devtools)
- [Wappalyzer - Technology profiler](https://chromewebstore.google.com/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg)
- [GraphQL Network Inspector](https://chromewebstore.google.com/detail/graphql-network-inspector/ndlbedplllcgconngcnfmkadhokfaaln)
- [React Developer Tools](https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi)

## airbnb

https://www.airbnb.jp/

### アーキテクチャ

Service workerのファイル名に書かれている通り、airbnbは[app shell](https://developer.chrome.com/blog/app-shell)構成となっています。

![スクリーンショット 2023-12-19 21.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/02f86f93-64ce-789f-452f-cba50af1166f.png)


### スクロールスナップ

画像の横スライドは、[scroll-snap](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_scroll_snap)を使ってスムーズな動作を実現しています。

![movie4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/7d7da13b-c68b-5549-bddd-6aaf227e94a9.gif)
（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）


### 画面遷移の体験

画面遷移後に、すぐに画像が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/a0f168e2-9a4e-eabd-0acb-a7b2d7ade484.gif" width="300px" />

（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

遷移前後で、表示サイズが異なる画像でも、同一の画像を使っているため、無駄なネットワークが発生しないようにしているようです。

遷移元

![スクリーンショット 2023-12-20 11.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/75f10396-7226-74d3-d12e-b7600f906044.png)
（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

遷移先

![スクリーンショット 2023-12-20 11.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/b5cad020-09ae-470d-b062-c315ee6c0b5a.png)
（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

下は、試しに画像のキャッシュを

- 無効化しない（≒遷移前後で画像パスが同じ）場合
- 無効化（≒遷移前後で画像パスが異なる）した場合

の違いです。

無効化しない場合
![movie2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/7bd2ce2c-1fd1-85d3-3e46-b7c554d1ef6f.gif)
（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

無効化した場合
![movie3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/b37bd72b-7acc-dd49-c408-5ac1fc9b0681.gif)
（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

### Web Share API

URL共有には[Web Share API](https://w3c.github.io/web-share/)を使っています。

Web Share APIの対応状況によりモーダルの内容を切り替えているようです。

|対応|未対応|
|---|---|
|![IMG_8123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/d4e55455-3fa7-f6a1-8f79-9e3bbcd1caf8.jpeg)|![スクリーンショット 2023-12-20 9.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/1c1e152a-d200-3547-ef84-b4c7d9593384.png)|

（[airbnb](https://www.airbnb.jp/)より一部サイト画像を引用）

他にも以下のような特徴がありました。

- Persisted Queryを採用。
- JavaScriptファイルの圧縮形式は[Brotli](https://developer.mozilla.org/ja/docs/Glossary/Brotli_compression)を採用
- サイト全面的にレスポンシブデザインを採用
- Reactを採用
- [fetchprioriy](https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement/fetchPriority)を使っている

airbnbは、Web標準で実装できるものは積極的に採用している印象です。

## Expedia

https://www.expedia.co.jp/

Expediaもairbnbと似ているポイントが多いです。

- ファイル圧縮にはBrotliを採用
- 通信にはGraphQLを採用
- Reactを採用
- レスポンシブデザインを採用

![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/1ff2e5e4-9f21-e0a8-4fee-234ddb7d2ed0.gif)

（[Expedia](https://www.expedia.co.jp/)より一部サイト画像を引用）

### Persisted Query

Expediaもairbnb同様、Persisted Queryを使っているサイトです。

![スクリーンショット 2023-12-20 18.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/1aea833f-1c93-4ffa-7435-2d894f2003f3.png)

（[Expedia](https://www.expedia.co.jp/)より一部サイト画像を引用）

Persisted QueryではHTTPメソッドをGETにし、HTTPキャッシュさせる用途で使うこともありますが、ExpediaではHTTP メソッドはPOSTを使っています。

以下のようなOSSも公開しています。
https://opensource.expediagroup.com/graphql-kotlin/docs/server/automatic-persisted-queries/


### トラッキング

![movie6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/4e9f06f3-4573-91d8-9cc4-b48c533c4e94.gif)

（[Expedia](https://www.expedia.co.jp/)より一部サイト画像を引用）

`https://www.expedia.co.jp/api/uisprime/track` というエンドポイントにログリクエストを送っている。どうやらどの要素が表示されたかトラッキングしているみたいです。

Expediaはデータの利活用に力を入れている印象です。

https://medium.com/expedia-group-tech/data/home


## JTB

https://www.jtb.co.jp/

JTBは、画面が整っていて見やすいです。
検索機能も充実しています。
個人的に、国内競合OTAでイチオシのサイトです。
そんなJTB推しの私ですが、気づいていなかったアニメーションを"散歩"友達のデザイナーさんが最近教えてくれました。

### お気に入りのアニメーション

![movie7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/ff995e22-764a-4107-38ee-5c33932c72ea.gif)

([JTB](https://www.jtb.co.jp/)より一部サイト画像を引用)

お気に入りボタンを押すと、なんと、お気に入りのハートが、画面右下に固定されているお気に入り施設・プランボタンへと飛んでいきます。
「お気に入り施設プラン」ボタンへの視線を誘導しようという意図が感じ取れます。
遊び心があって素敵。


## 一休レストラン

https://restaurant.ikyu.com/

※OTAではないですが、素晴らしいポイントを見つけたので紹介させてください。

### 初期表示の速さ

[一休レストランがRemixに置き換えている](https://user-first.ikyu.co.jp/entry/2023/12/15/093427)という話は聞いていたものの、どのような仕組みになっているかは知りませんでした。
最近一部のページの置き換えが完了し、リリースされたということで、早速DevToolsを眺めてみました。

はじめに驚かされたのが、レスポンスの速さです。

Document自体をCDNでキャッシュしている。
Cacheヒットする場合には、100ミリ秒程度(環境により誤差あると思いますが)でレスポンスが返ってきます。

![スクリーンショット 2023-12-20 12.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/39c8fad4-5da7-1ea7-5cb6-1627118c79ce.png)


### Prefetch

さらにすごいのは、プリフェッチキャッシュを効かせた画面遷移

![movie8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/e03b9086-e1b8-8a69-442c-a9d93986938e.gif)

Remixの[loader](https://remix.run/docs/en/main/route/loader)と[Link](https://remix.run/docs/en/main/components/link)で、画面遷移後に必要となるデータを事前にフェッチしておき、クリックした際に、プリフェッチキャッシュからデータを取得し、高速に画面遷移しています。
ダイナミックコンテンツのプリフェッチを実現しやすい点が、Remixの良い点の1つかもしれないですね。

## 一休.com / Yahoo!トラベル

https://www.ikyu.com/

https://travel.yahoo.co.jp/

さて、自分の担当サービスについても、説明しておきます。

### 画面遷移

一休.com / Yahoo!トラベルは、画面遷移の体験に、気を使っています。
一休レストランのようなプリフェッチによる爆速遷移は実現できていないですが、サイトの大半でクライアントでスムーズに遷移できるようにしています。

![movie9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/4f7ee541-e1c6-e9be-6f20-91a3f74737b0.gif)

### ブラウザの戻る、進む

画面遷移という観点で、ブラウザの戻る・進むボタンを押した際の動きにも注意を払っています。

|||
|---|---|
|![movie15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/0234e683-15f4-a1d2-1e7f-32a60fff8b68.gif)|![movie11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1470007/df8dc22b-17ec-f708-a15c-6375b468b96f.gif)|


## まとめ

以上、サービスを見ての気づきの共有でした。
散歩は、いろいろな発見があり、楽しいですね。