Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ユーザー体験と編集体験を支えるビルドアーキテクチャ
Search
Makoto Kataigi
July 27, 2023
Programming
0
2.9k
ユーザー体験と編集体験を支えるビルドアーキテクチャ
Makoto Kataigi
July 27, 2023
Tweet
Share
More Decks by Makoto Kataigi
See All by Makoto Kataigi
大規模データをリアルタイムに解析する技術@【SmartNews × PLAID】大量データ、高トラフィックをさばくサービスの開発と運用
mkataigi
0
210
Kubernetesによるリアルタイム解析の構築@Yahoo! JAPAN MEETUP #31 インフラ技術カンファレンス
mkataigi
0
90
Other Decks in Programming
See All in Programming
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
ソフトウェアの振る舞いに着目し 複雑な要件の開発に立ち向かう
rickyban
0
890
Criando Commits Incríveis no Git
marcelgsantos
2
170
nekko cloudにおけるProxmox VE利用事例
irumaru
3
420
Security_for_introducing_eBPF
kentatada
0
110
Symfony Mapper Component
soyuka
2
730
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
660
MCP with Cloudflare Workers
yusukebe
2
220
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
The rollercoaster of releasing an Android, iOS, and macOS app with Kotlin Multiplatform | droidcon Italy
prof18
0
150
モバイルアプリにおける自動テストの導入戦略
ostk0069
0
110
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Six Lessons from altMBA
skipperchong
27
3.5k
How to Ace a Technical Interview
jacobian
276
23k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Mobile First: as difficult as doing things right
swwweet
222
9k
Typedesign – Prime Four
hannesfritz
40
2.4k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Writing Fast Ruby
sferik
628
61k
Navigating Team Friction
lara
183
15k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Building Adaptive Systems
keathley
38
2.3k
Transcript
| © PLAID Inc. 2023.07.27 | Developers Summit 2023 | 1 ユーザー体験と編集体験を支える ビルドアーキテクチャ 株式会社プレイド
片居木 Developers Summit Summer 2023
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 2 片居木 誠 Makoto
Kataigi Github : @mkataigi Twitter : @mkataigi 株式会社プレイド • アクションエディタ開発チームリード • 解析エンジンも作ってました • バックエンド好き 自己紹介 2023.07.27 | Developers Summit 2023 |
| © PLAID Inc. 2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 3
2023.07.27 | Developers Summit 2023 | 株式会社プレイド 東京都中央区銀座6-10-1 GINZA SIX 10F 設⽴:2011年10⽉ 従業員:282名 ※2023年3⽉末時点 会社紹介
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 4 CX(顧客体験)プラットフォーム Webサイトの訪問者の⾏動を 顧客ごとにリアルタイムに解析
⼀⼈ひとりに合わせた 顧客体験を提供 プロダクト紹介
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 5 アクション: ポップアップに限らない 様々な顧客体験
HTMLだけでなく JavaScriptによる動きも アクション システム連携 カウントダウン
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 6 アクションを WYSIWYGで編集する エディタ
TypeScriptのコードも編集できる エディタ
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 本日のテーマ 7 ユーザー体験と 編集体験を支える
ビルドアーキテクチャ ビルドの工夫 話すこと ビルドアーキテクチャと ユーザー体験と編集体験 ビルドを両立させる工夫
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 本日のテーマ 8 ユーザー体験と 編集体験を支える
ビルドアーキテクチャ ビルドの工夫 話すこと ビルドアーキテクチャと ユーザー体験と編集体験 ビルドを両立させる工夫 🏻
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. webサイト 解析サーバ アクションストレージ(CDN) <script
src="https://cdn-edge.karte.io/01234 5678/edge.js"></script> 実行 コード 9 今日の話の前提:配信アーキテクチャ 過去データ 1. イベント送信 例) 閲覧 2. アクション情報返却 例) https://bs.karte.io/action/foobar/index.js 3. アクションのコード取得&実行
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 10 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ(CDN)
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 11 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ (CDN) 実行コード生成 build on Server 1. エディタで編集するとソースコードが 変更される 2. 保存すると、ソースコードがサーバに 送られ、実行できるコードに変換 3. 実行コードをストレージ(CDN)に保存
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 12 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ (CDN) 実行コード生成 build on Server 1. エディタで編集するとソースコードが 変更される 2. 保存すると、ソースコードがサーバに 送られ、実行できるコードに変換 3. 実行コードをストレージ(CDN)に保存 サーバ上で1回だけビルド 多くのエンドユーザーのブラウザ上で実行される ビルド時間がかかっても良いので 実行速度を優先したい
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 13 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ(CDN) 実行コード生成 build on Server プレビュー用 build on Browser 1. エディタで編集するとソースコードが 変更される 2. 変更がプレビューに 反映される
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 14 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ (CDN) 実行コード生成 build on Server プレビュー用 build on Browser 1. エディタで編集するとソースコードが 変更される 2. 変更がプレビューに 反映される エディタでの編集するたびにプレビューが更新される 編集者の思考の妨げにならないようにしたい 実行速度より ビルド時間を優先したい
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 編集 ソース KARTE Actionエディタ
ビルドサーバ 15 今日の話の本題:ビルドアーキテクチャ 実行 コード アクションストレージ(CDN) 実行コード生成 build on Server プレビュー用 build on Browser ビルド時間最適化 実行速度最適化
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 16 TypeScriptやその他ソースコードを ブラウザで実行可能な状態にすること ビルド
用語定義 • TypeScript のトランスパイル • npmなどからのパッケージの取得 • バンドル(ファイルをまとめる) • minify • その他最適化 今回はrollup.jsを利用
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 17 配信毎に変わるコード (ビジュアルなど) Action
SDK アクション共通で使うコード エディタで編集 SDKとして分離 (npmに登録してる)
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 18 SDKのビルドは CIでのコマンドラインでのビルド Action
SDK コードを分離することで、 事前にビルドできる SDKのビルドも、実行用と プレビュー用で分けている ‧
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. npmなど プレビュー SDK 事前build
ビルド時間最適化 実行 コード 実行コード生成 build on Server プレビュー用 build on Browser 実行速度最適化 編集 ソース SDK ソース 実行SDK 19 サイト エディタ プレビュー コード ビルドフロー全体 毎回編集されるコード さまざまなアクションで共通で使われるコード
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 20 アクションの サイト上での実行速度と エディタでのビルド時間を
両立するための ビルドアーキテクチャ 本日のテーマ 話すこと ビルドの工夫 ビルドアーキテクチャと ユーザー体験と編集体験 ビルドを両立させる工夫 🏻
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. npmなど プレビュー SDK 事前build
ビルド時間最適化 実行 コード 実行コード生成 build on Server プレビュー用 build on Browser 実行速度最適化 編集 ソース SDK ソース 実行SDK 21 サイト エディタ プレビュー コード ビルドフロー全体
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 22 実行速度 ≒ スクリプトのサイズ
ポイント:いかにスクリプトのサイズを小さくできるか 実行 SDK 事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース 実行コード生成ビルド方針
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 23 tree-shakingで削除される 実行コード生成ビルドの工夫-1 実行
SDK 事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース 実行コード生成のビルドでは rollup.js は 基本的な使い方をしている rollup.js の tree-shaking で不要なコード を削除している
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 24 SDKの工夫-1 実行 SDK
事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース 実行コード生成のビルドするときに tree-shaking しやすいようにしておく exports を分割することで、 importの 単位を細かくする
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 25 SDKの工夫-2 実行 SDK
事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース 実行コード生成のビルドするときに tree-shaking しやすいようにしておく 実行時に不要なコードを分離しやすい コードを書く
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 26 アクションのViewにSvelteを使うことで、 事前にビルドできるようにし、 重い実行時ランタイム不要で実行できるようにしている
実行コード生成ビルドの工夫-2 実行 SDK 事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 27 以前のアクションでは、vue.jsを 活用していた pros:Web標準のHTML風な記法で記載できるため、
非エンジニアにも書きやすい cons:ランタイムが必要で実行時に重い Svelteが今回の要件にマッチ 同じくWeb標準のHTML風な記法で書ける ランタイム不要で事前ビルドできるので軽量
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 28 HTML, Style, Scriptも分離しているので、
WYSIWYGエディタを作る上でも 編集しやすかった 余談... この後のプレビュービルド時にも活用してる
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 29 • tree-shakingされて、コードが削減されやすいようにする •
Svelteを使って、実行時ランタイムを削減する 実行コード生成ビルドの工夫まとめ 実行 SDK 事前build 実行コード生成 build on Server 実行 コード 実行速度最適化 編集 ソース SDK ソース
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. npmなど プレビュー SDK 事前build
ビルド時間最適化 実行 コード 実行コード生成 build on Server プレビュー用 build on Browser 実行速度最適化 編集 ソース SDK ソース 実行SDK 30 サイト エディタ プレビュー コード ビルドフロー全体
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 31 ビルド時間を早くするには、 いかに不要な変換を減らせるかがポイント プレビュー
SDK 事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース プレビュービルド方針 • ビルドするためのコード自体もブラウザにロードが必要 • なるべくサイズの小さいビルドパッケージ&rollup pluginを利用する
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 32 プレビュービルドの工夫-1 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース プレビュー用ビルドでは全更新ではなく、差分更新できるようにしたい SDKでは後工程で差分更新できるように するための対応を入れる
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 33 SvelteのHydration機能を活用して、 コンポーネントの表示を高速化 Hydration
• Fetch: サーバー上でコンポーネントを HTML にレン ダリングする • Render: その HTML がクライアントに送信され、ブ ラウザでレンダリングされる • Load: アプリケーション内のコンポーネント用の JavaScript を読み込む • Hydrate: それらのロジックをブラウザでレンダリン グされている HTML に接続していく ※ 通常はSSRで使われる プレビューSDKのビルド時にHydrationの 設定が必要
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 34 SDKの工夫 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース SvelteのHydrationを使ってプレビューの UIコンポーネントを差分更新させる • プレビューSDKはHydrationの設定を入れた状態でビルドしておく
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 35 プレビュービルドの工夫-1 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース プレビューを差分更新にする 描画開始までにかかる時間 (66.7ms)を短縮
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 36 プレビュービルドの工夫-2 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース 不要な処理はしない minifyはしない
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 37 プレビュービルドの工夫-3 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース ビルド処理自体のコードサイズが小さいを処理を使う • TypeScriptのトランスパイルには sucrase を利用 https://www.npmjs.com/package/sucrase • @rollup/plugin-json ではなく、ブラウザのJSON.parser/JSON.stringify を利用する
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 38 プレビュービルドの工夫-4 プレビュー SDK
事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース npm の多くのパッケージは ESM 対応されておらず、 ブラウザ上で利用しようとすると変換が必要 • ESM対応をするproxyサービス経由でパッケージを取得する ※ ブラウザではCommonJSのパッケージが動かない 例) esm.sh / skypack
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 39 • SvelteのHydrationを使って差分更新 •
余計な処理は実行しない • ブラウザJSの標準関数を使う • ESM対応のパッケージProxyからパッケージを取得 プレビュービルドの工夫まとめ プレビュー SDK 事前build プレビュー用 build on Browser 実行 コード ビルド時間最適化 SDK ソース 編集 ソース
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 40 アクションの ブラウザでの実行速度と エディタでの編集速度を
両立するための ビルドアーキテクチャ 本日のテーマ 話すこと ビルドの工夫 ビルドアーキテクチャと ユーザー体験と編集体験 ビルドを両立させる工夫 🏻
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 41 • パッケージバージョンのズレが原因 •
Svelteの破壊的変更もあった 2つのビルドを運用する工夫-1 課題 実行時とプレビュー時で挙動に違いが...
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 42 ビルドサーバ build package
I/F for プレビュー I/F for 実行コード 編集 ソース build package I/F for プレビュー I/F for 実行コード エディタ プレビュー コード サイト 実行可能 コード 2つのビルドを運用する工夫-1 ビルド処理を 単一パッケージにまとめる • ライブラリバージョンを揃える • 環境ごとの設定用に2つのI/Fを用意
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 43 2つのビルドを運用する工夫-2 • 実行時は実行時SDK、プレビュー時はプレビューSDKを
使えるようにしたい • Hydration版はSDKもビルドが別になる 課題 SDK内のimport先が違う...
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 44 2つのビルドを運用する工夫-2 plugin-aliasを活用 •
aliasを使い、ビルドプロセスによっ て、読み込むパッケージ・SDKを切 り替えてしまう • 開発用のSDKの切り替えもできるよ うになった
2023.07.27 | Developers Summit 2023 | | © PLAID Inc. 45 実行用の実行速度優先のビルド • tree-shakingとSvelteの活用
まとめ プレビューのビルド時間優先のビルド • 差分更新&不要な処理はしない build packageの共通化で 2つのビルドプロセスを効率よく運用 • パッケージの共通化とSDKの切り替え アクションの ブラウザでの実行速度と エディタでの編集速度を 両立するための ビルドアーキテクチャ
None