$30 off During Our Annual Pro Sale. View Details »

比較サイトの検索改善(SPA から SSR に変換)

gree_tech
PRO
November 11, 2021

比較サイトの検索改善(SPA から SSR に変換)

GREE Tech Conference 2021 で発表された資料です。
https://techcon.gree.jp/2021/session/Session-3

gree_tech
PRO

November 11, 2021
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. 比較サイトの検索改善
    (SPAからSSRに変換)
    アウモ株式会社 サーバーサイドエンジニア 天野桂輔

    View Slide

  2. • 名前
    • 天野 桂輔
    • 担当
    • サーバーサイドエンジニア
    • Ruby on Rails、Nuxt.js
    • 経歴
    • 2013- グリー株式会社
    • GREE Platform 部に所属
    • 2020- アウモ株式会社
    • 比較サイト、aRM※の開発担当 ※CRMツール
    自己紹介
    2

    View Slide

  3. aumoはご存知ですか?
    ⓘ Start presenting to display the poll results on this slide.

    View Slide

  4. 4
    aumoってどんなサービス?
    国内最大級のおでかけ情報サービス
    1300万 500万
    月間ユーザー数 アプリDL数
    50万
    掲載記事数 総口コミ数
    50万
    掲載メディア数
    500

    View Slide

  5. 5
    aumoってどんなサービス?
    Web記事
    SEOに最適化された
    コンテンツ制作
    Web記事
    Web記事 Web記事
    位置情報、閲覧傾向を利用
    レコメンドシステム
    App
    ユーザーの口コミを活用
    おでかけCGM
    Web施設

    View Slide

  6. 6
    Web記事
    カテゴリ 技術スタック
    プログラム言語 / FW Ruby / Ruby on Rails
    インフラ AWS
    データベース
    MySQL, Redis, Memcached,
    DynamoDB
    監視 Datadog, Papertrail, PagerDuty
    分析 Bigquery, PoT ※社内分析ツール
    検索エンジン ElasticSearch
    コード管理 GitHub
    Web記事
    SEOに最適化された
    コンテンツ制作
    Web記事

    View Slide

  7. 7
    App
    Web記事
    カテゴリ 技術スタック
    プログラム言語 / FW
    Ruby / Ruby on Rails, Swift, Kotlin,
    Python
    インフラ AWS
    データベース
    MySQL, Redis, Memcached,
    DynamoDB, FireStore Database
    監視
    Datadog, Papertrail, PagerDuty,
    Firebase
    分析 Bigquery, PoT ※社内分析ツール
    検索エンジン ElasticSearch
    機械学習 SageMaker, fastText
    コード管理 GitHub
    位置情報、閲覧傾向を利用
    レコメンドシステム
    App

    View Slide

  8. 8
    Web施設
    Web記事
    カテゴリ 技術スタック
    プログラム言語 / FW Ruby / Ruby on Rails, Vue.js, Nuxt.js
    インフラ AWS
    データベース
    MySQL, Redis, Memcached,
    DynamoDB
    監視
    Datadog, Papertrail, PagerDuty,
    Sentry
    分析 Bigquery, PoT ※社内分析ツール
    検索エンジン ElasticSearch
    コード管理 GitHub
    Web施設
    ユーザーの口コミを活用
    おでかけCGM

    View Slide

  9. 9
    比較サイトとは?
    Web記事 Web記事
    位置情報、閲覧傾向を利用
    レコメンドシステム
    App
    ユーザーの口コミを活用
    おでかけCGM
    Web施設
    Web記事
    SEOに最適化された
    コンテンツ制作
    Web記事

    View Slide

  10. 10
    施設情報を提供するサービス
    比較サイトとは?
    • 施設
    • 基本情報、写真、口コミ
    • 検索
    • ジャンル×エリア×カテゴリで施設を検索
    ホテル グルメ レジャー・観光 チラシ・ショッピング

    View Slide

  11. 11
    構成
    フロントエンド バックエンド
    ELB
    同一インスタンスに搭載
    サブドメイン

    View Slide

  12. 12
    当初のフロントエンド設計
    UXを優先したSPAという方法を採用

    View Slide

  13. 13
    Single Page Application
    SPA
    ページ遷移することなく同一のページ内でコンテンツのみ切り替
    え サーバー
    ELB
    クライアント
    ①リクエスト
    ③レスポンス
    ②コンテンツ生

    ④JSをブラウザで実行
    ※2回目以降は差分のみリクエスト
    するため処理が早い

    View Slide

  14. 14
    SPA
    • メリット
    • 2回目以降は差分のデータのみを要求するため早い
    • デメリット
    • 初回のページ読み込みが遅い
    Single Page Application

    View Slide

  15. 15
    比較サイトの成長に伴い、初回読み込みの遅延が顕著に。。。

    View Slide

  16. 16
    特に、施設の検索が遅い

    View Slide

  17. 17
    検索の課題
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策

    View Slide

  18. 18
    検索の課題
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策

    View Slide

  19. 19
    コンテンツ表示までの速度
    検索の課題
    • コンテンツ生成が非同期
    • レンダリングに時間がかかる

    View Slide

  20. 20
    検索の課題
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策

    View Slide

  21. 21
    検索エンジン最適化(SEO)対策
    検索の課題
    • コンテンツ生成が非同期で評価できない
    • Web記事はSEOに強い
    • ノウハウを共有したい
    Web記事
    SEOに最適化された
    コンテンツ制作
    Web記事

    View Slide

  22. 22
    検索の課題
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策
    解決策:SPAからSSR(同期生成)に仕様変更

    View Slide

  23. 23
    Server Side Rendering
    SSR
    Webページのレンダリングをブラウザの代わりにサーバ上で行う
    サーバー
    ELB
    クライアント
    ①リクエスト
    ③レスポンス
    ②コンテンツ生

    ・HTML生成
    ・JS実行
    ※ Node.js必要
    ④コンテンツ表

    ※画面の表示において有用な
    アプリケーションの機能

    View Slide

  24. 24
    SSR
    • メリット
    • 画面の表示が早い
    • デメリット
    • サーバー側の負荷が高い
    • Node.js サーバー環境が必要
    Server Side Rendering

    View Slide

  25. 25
    つまり

    View Slide

  26. 26
    SPAからSSR(同期生成)に仕様を変更することで
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策
    を改善できる

    View Slide

  27. 27
    仕様変更
    • 検索処理
    • Vue components 内 mounted 時に実行
    • しかも、ジャンル毎に似たような処理がある...
    mounted () {
    return this.search()
    },
    search () {
    const page = this.$route.query.page || 1
    :
    検索パラメータ設定
    :
    this.searchGourmetAction({ searchQuery, page }) // store経由でAPIリクエスト
    }
    変更前

    View Slide

  28. 28
    Life Cycle
    NuxtJS nuxt
    ServerInit
    Route
    Middleware
    fetch()
    asyncData()
    created()
    fetch()
    mounted()
    validate()
    ・初回アクセス時に実行される
    ・ストアに事前にデータを格納する
    ☆ page components のみ利用可能
    ★ 全ての Vue components で利用可能
    ・条件の設定やチェックを行う
    ・page リダイレクトに利用
    ☆ 動的ルーティングのパラメータを検証
    Vuex store
    component data
    ☆ page レンダリング前にデータを取得
    ★ Vue インスタンスが生成されたときに呼び出される
    ★ Vue インスタンスが生成された後に呼び出される
    ★ DOM がレンダリングされたときに呼び出される

    View Slide

  29. 29
    Life Cycle
    NuxtJS nuxt
    ServerInit
    Route
    Middleware
    fetch()
    asyncData()
    created()
    fetch()
    mounted()
    validate()
    DOM がレンダリングされた後に検索

    View Slide

  30. 30
    Life Cycle
    NuxtJS nuxt
    ServerInit
    Route
    Middleware
    fetch()
    asyncData()
    created()
    fetch()
    mounted()
    validate()
    page レンダリング前に検

    View Slide

  31. 31
    ① 検索処理の移行
    仕様変更
    • 検索処理
    • page components 内 fetch 時に実行
    • page 全てに同様の処理を置くのは微妙なので...
    async fetch ({ app, route }) {
    return await Promise.all([
    app.$categorySearch({ route })
    ])
    },

    View Slide

  32. 32
    ② 検索処理の共通化
    仕様変更
    • plugin 利用
    • ジャンル毎の検索処理を共通化
    export default ({ store, req }, inject) => {
    inject('categorySearch', async ({ route }) => {
    const page = route.query.page || 1
    switch (process.host) {
    case process.env.GOURMET_DOMAIN:
    :
    検索パラメータ設置
    :
    await store.dispatch('gourmetSearch/searchGourmetAction', { searchQuery, page })
    break
    :
    }
    })
    }
    ※ ブラウザ環境に帰属するオブジェクト(window, document)にはアクセス不可

    View Slide

  33. 33
    ③ 検索ページ導線を変更
    仕様変更
    • 検索ページへの遷移処理を修正
    • によるページ遷移はクライアント側で実行
    • ブラウザをハード再読み込みしてサーバーへリクエスト

    View Slide

  34. 34
    まとめ

    View Slide

  35. 35
    改善項目
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策

    View Slide

  36. 36
    改善項目
    • コンテンツ表示までの速度
    • リクエストからコンテンツ表示までの速度:55~62%⬇
    • 検索エンジン最適化(SEO)対策

    View Slide

  37. 37
    改善項目
    • コンテンツ表示までの速度
    • 検索エンジン最適化(SEO)対策
    • 初回読み込み時に全てのコンテンツを生成

    View Slide

  38. 38
    改善項目
    • コンテンツ表示までの速度
    • リクエストからコンテンツ表示までの速度:55~62%⬇
    • 検索エンジン最適化(SEO)対策
    • 初回読み込み時に全てのコンテンツを生成

    View Slide

  39. 39
    学び

    View Slide

  40. 40
    NuxtJS
    • SSR導入は困難ではない
    • Node.js サーバー環境を準備
    • Nuxt Life Cycle 理解 ※クライアント、サーバーの処理
    • 同様の課題があるサービスに有用
    • ページ単位で導入も可能

    View Slide

  41. 41
    引き続きより良いサービス作りを心掛けていきます
    これからもaumoを宜しくお願いしますmm

    View Slide

  42. 42

    View Slide