Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Server-Driven UIで frontendの複雑性に立ち向かう
Search
nacal
November 05, 2025
Technology
750
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Server-Driven UIで frontendの複雑性に立ち向かう
nacal
November 05, 2025
More Decks by nacal
See All by nacal
新規プロダクトにおけるシステムマイグレーションの判断
nacal
0
29
Linterからはじめるa11y
nacal
2
3.2k
Other Decks in Technology
See All in Technology
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
大型犬好きによるPugの紹介
yamanoku
1
140
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
390
AI時代だからこそ推したい!Gitコマンド再入門
munakata
0
170
FOSS4Gを活用した自治体業務DXの試み
470715
0
150
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
300
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
7
2.9k
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
360
Running Kotlin + Quarkus with Lambda
nealle
1
420
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
550
AI時代のPRレビューにどう向き合うか?
kairim0
1
170
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
730
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Product Roadmaps are Hard
iamctodd
55
13k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
WENDY [Excerpt]
tessaabrams
14
40k
Transcript
1 Server-Driven UIで frontendの複雑性に⽴ち向かう 中⽥ 輝 / nacal 2025.11.05 カバーとGMOペパボが語る、クリエイターの創作‧表現活動を⽀える技術
2 ⾃⼰紹介 ロリポップ‧ムームードメイン事業部 for Gamersチーム 2022年 新卒⼊社 中⽥ 輝 Nakata
Hikaru / nacal • Webアプリケーションエンジニア • フロントエンドがすきです • X : @_nacal
3 - LOLOPOP! for Gamersのゲーム設定管理 にServer-Driven UIを導⼊してみた話 - ビジネスロジックをサーバー側に寄せる ことで、frontendのコード量を削減
- UI変更の作業も簡略化 今⽇話すこと
None
5 - ServerからのResponseでUIを構成する要素を返却する(プレゼンテーションを指⽰) - クライアント側はResponseを元にUIに変換して描画するだけの責務 Server-Driven UIとは https://github.com/csmets/Server-Driven-UI
6 https://github.com/csmets/Server-Driven-UI type NewsCard { image: Image author: String postDate:
String heading: String body: [String] } type Image { url: String description: String } Client-Driven UI
7 https://github.com/csmets/Server-Driven-UI Server-Driven UI
8 https://github.com/csmets/Server-Driven-UI Server-Driven UI type NewsCard { elements: [NewsCardElement] }
type Heading implements Typography { text: String } type Paragraph implements Typography { text: String } ... union NewsCardElement = Button | Image | NewsCardMeta | Heading | Paragraphs
9 - frontendの複雑性 - 多種多様なゲームタイトル/バージョンによって⽣じるビジネスロジックの複雑化 - frontendはなるべく体験の創造に集中責務に集中したい - ゲームのアップデート対応 -
元々の実装ではゲーム単位でそれぞれPRC/Componentsが存在しており、DRYでない - ゲームの最新リリースによる設定項⽬の変更のための作業が⼤変 - schema変更、設定ファイル編集、frontend Component修正... 解決したかった課題 最新アップデートは最速で遊びたいよ!
10 - ゲームの設定項⽬のList/formにServer-Driven UIを導⼊ - 画⾯全体には適⽤しない - 更新頻度/ビジネスロジックによる分岐の複雑性 が⾼い⼀部のView -
UIを構成する要素(attrやElement)をAPIのResponseとする - backend側でビジネスロジックを完結させる - 技術要件:gRPC + Protocol Buffers 導⼊したもの
protobuf schema 11 message GetGameSettingsRequest { string server_id = 1;
} message GetGameSettingsResponse { // 設定グループ(Section) message Group { string group_id = 1; // "gameplay" string title = 2; // "ゲームプレイ設定" repeated Field fields = 3; } repeated Group groups = 1; } サーバーIDからゲーム/バージョン情報の取得 セクションレベルでの配列に格納
protobuf schema 12 // 設定フィールド message Field { string field_id
= 1; // "max_players" string label = 2; // "最大プレイヤー数" optional string description = 3; // ヘルプテキスト SettingValue value = 4; // 現在の値 // フィールドタイプごとの設定 oneof field_config { TextField text_field = 5; SliderField slider_field = 6; ToggleField toggle_field = 7; SelectField select_field = 8; …, etc. } } Fieldの共通要素と各Fieldをoneofで
protobuf schema 13 // テキスト入力フィールド message TextField { optional int32
min_length = 1; optional int32 max_length = 2; optional string pattern = 3; optional string placeholder = 4; } // セレクトフィールド message SelectField { repeated Option options = 1; optional string description = 2; } …, etc. Fieldごとに必要なattrを型として定義
export const DynamicField = ({ field, values, onChange }: Props)
=> { const commonProps = { label: field.label, description: field.description, } switch (field.fieldConfig.case) { case 'textField': { const value = values.get(field.fieldId)?.value return ( <TextField {...commonProps} value={value.case } config={field.fieldConfig.value} onChange={(newValue) => onChange( field.fieldId, new SettingValue({ value: { case: 'stringValue', value: newValue } }), ) } /> ) } case 'sliderField': { … 14 FieldTypeごとに分岐 それぞれのComponentに Responseをそのまま渡す 各Componentの中では Stylingのみのロジック frontendでの変換
15 - コード差分 - (frontend) 共通Component: +12ファイル、+1000Lines - (frontend) 特定ゲームのComponent:
-21ファイル、-1500Lines - 将来的にはこれ×対応ゲームの数削減できる - (backend) RPC: +2個 (List/Update)、共通ロジック: +150Lines、個別ロジック: +500Lines - ゲームのアップデート対応 - Responseの内容を変更するだけでUIの更新が可能になる - schemaの変更も不要、破壊的な変更にならない 「すべてのビジネスロジックはサーバーサイドで管理し、クライアントはUIのレンダリングのみを担当する」 導⼊した結果
16 - 特殊なFiledを扱うか - 現状、特定の設定項⽬にのみ適⽤されるような特殊なUIは対象外としている - 様々なケースを許容することによりschemaの複雑性も増すので判断の基準は必要 - Database-Driven UI?
- DBでUIを構成する要素を管理 - 管理⽤APIなどから項⽬の編集を可能に - アプリケーションのリリースゼロでゲームのバージョンアップ対応が可能になりそう 今後の展望
17 Thank you!