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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HRC_Frontend_Conference_Fukuoka_2026.pdf
Search
takanori sugawara
September 12, 2026
Technology
87
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HRC_Frontend_Conference_Fukuoka_2026.pdf
takanori sugawara
September 12, 2026
More Decks by takanori sugawara
See All by takanori sugawara
人によっては_明日から使えるFigmaテクニック
ts020
1
920
VueFes.pdf
ts020
5
10k
AtomicDesignの運用方法
ts020
0
200
Other Decks in Technology
See All in Technology
プロダクトエンジニアに必要な「いい感じ」に作る能力 〜たくさん作れる時代に、どこまで作るかの決め方〜
jnishime_dresscode
2
1.4k
Claude Code本って、 読む必要あるの?
oikon48
1
220
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
280
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
300
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
230
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
120
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
120
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
240
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
1
1.1k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
400
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
220
Bet AI Day 2026丨AIによって本質に戻るシステムリスク管理
layerx
PRO
0
1.3k
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
Paper Plane (Part 1)
katiecoart
PRO
1
11k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
510
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
Believing is Seeing
oripsolob
1
210
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
340
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Statistics for Hackers
jakevdp
799
230k
Transcript
HRC 速さを追い求めたら、HTMLになった Studioのデザインデータから、公開サイトのHTMLを生成するエンジン。 菅原 孝則 フロントエンドカンファレンス福岡 2026
自己紹介 菅原 孝則 Studioの古参エンジニア コロナ禍に海外で2年間暮らして。 コロナ明けに福岡に引越し。 2 x.com/oligin020
コードを書かずに、 Webサイトを 作って公開。 デザインから公開まで、 ひとつのツールで。 3
今日のお話 速さを追い求めた、 エンジン刷新の2年半。 作り直す決断 設計と互換性の試行錯誤 ヘルシーなインターネットへ 4 HRC Studioのデザインデータを HTML
/ CSSに変換する。 デザインデータ JSON ↓ HTML / CSS 公開サイト
20万超 Studioがホスティングする規模 サイトごとに違う、 見た目と動きを守る。 公開サイト 現在のホスティング規模 基盤の変更が、 個々のサイトに影響する。 5 公開サイトの基盤
実際に、 Studioを操作してみます。 6
Studioが掲げてきた志 グローバルに通用する ツールを作る。 7 第1章|作り直す決断
10年も機能追加してたら 流石に公開サイトが重くなる 作る側 表現力が増える 見る側は、待つ 8
2021年、 公共サイトの保存で困った 公開サイト SPAは自動アーカイブの対象外、と説明を受けた 9 Webアーカイブ
本文を読む前に、 ブラウザの仕事がある 受信したHTML <body> </body> JSON + JavaScript 解釈・組み立て 本文を表示
10
白紙でも、80点くらい。 Lighthouseで測った、当時の公開サイト 80 500KB超 表示前に読むJavaScript 11 点くらい
いろいろあって、 高速化&MPA化に チャレンジしてみた。 12
最初の高速化は、6か月で凍結 6 開始 13 完了の目処が立たない ほかに任せたい仕事がある か月 凍結
やっぱ遅いよな 日本のサーバーは遠い。 CDNの大切さを実感した。 14
やっぱり遅い アンテナが、 1本立つかどうかで SPAは無理ゲー 15
2024年 作り直すチャンスが やってきた! 16
世界一速くする。 17
世界一の基準を、社内に示す プロジェクトの 北極星は、 阿部寛のホームページ。 18
Webサイトの本質だけで、できている HTML 速さ 19 魚拓での再現 クローラー
None
こうすればいいのは分かりきったこと でもなかなかそうもいかない 21
JSONをHTMLにするだけなんやが JSON フレームワーク ライブラリ 更新に約2か月 数人で対応。しかも、更新後の挙動を保証しきれない。 22 HTML
E2Eに頼っても、 最後は目視確認だった 実装 E2E 気づけずに、またバグを埋め込む 23 目視確認
書きやすくて速くないと、 カバレッジを上げる気にならない! 素直なunit testを書いて、すぐ確かめたい。 plainなobject { title: "記事A" } f
変換する関数 24 期待するHTML 結果を直接確かめる
何を残すかは、 自分たちで決めたい 依存先の都合 自分たちの要件 削れないファイル 必要なものだけ残す 25
巨人の肩に乗っていては、 阿部寛のホームページには 絶対に辿り着けない!
技術選定の判断軸 テストの書きやすさ 実行速度 開発速度 CIの速度 シンプルに作るために、 外部ライブラリを 徹底排除する。 27
2年間、同じ議論で 立ち止まりたくない 「ライブラリを入れよう」 開発開始 28 「ライブラリを入れよう」 「ライブラリを入れよう」 2年の見込み
一人で。 誰にも相談しない、と決めた。 29 アーキテクチャ 大枠の実装
もちろん、リスクはある。 受け入れられない 運用できない 時間がかかりすぎる 打ち切られる 30
組織が落ち着くまでに、形にする 組織改編期 チャンス期間 組織が落ち着く 進捗悪いと 最悪凍結 一定レベルまで形にする 31
でも、やるんだよ CTOと自分の信用貯金をここで使い切る 32
まずはここから始めました 33 Bun Bun test Biome 実行環境 テスト Lint・フォーマット
まず、動くことを証明する JSON 試作 公開サイト 34
別のエンジンで、公開サイトが動いた 2 35 JSON → HTML 週間 コンパクトな変換実装
第2章 ここから、 考古学が始まる。 36
一つの型に、26種類のBox 既存の型定義(抜粋) interface StudioDom { type?: StudioDomType content?: StudioDomContent style?:
StudioDomStyle state?: StudioDomState action?: StudioDomAction children?: StudioDom[] // ... } 正しい組み合わせは、型から分からない。 37 第2章|既存仕様の考古学 種類・スタイル・状態・挙動
コードからは読み解かない。 出力データと、画面の動き。 この二つから仕様を割り出した。 38 第2章|既存仕様の考古学
第3章 同じ動きを、 シンプルな仕組みで。 39
まず、全部MPAで処理できないか。 サーバー側で処理 40 データの解釈 HTML生成 スタイル 動作の再現 第3章|処理の境界
ブラウザでしかできない部分を、切り出す 41 サーバー ブラウザ データの解釈 HTML・CSSの生成 操作 状態の更新 第3章|処理の境界
属性と本文には、値を直接割り当てる データ url: "/articles/a" title: "記事A" 42 第3章|スタイル 生成したHTML <a
href="/articles/a"> 記事A </a>
ここで、 ちょっとした 発明があった。 43 第3章|スタイル
共通スタイルを持ち、colorだけを渡す。 Editorで、見出しの色をバインディング masterの共通スタイル .article-title { font-weight: 700; color: var(--title-color); }
親インスタンスの差分 <div style="--title-color: #AC2E2E"> <h2 class="article-title">記事A</h2> </div> CSS変数は、子孫要素にも伝わる。 44 第3章|スタイル
Componentも、Listも、Carouselも。 masterの共通スタイル Component List Carousel CSS変数の差分 CSS変数の差分 CSS変数の差分 45 第3章|スタイル
追加した要素も、同じCSSで表示できる 読み込み済みのHTML <style> .article-title { font-weight: 700; color: var(--title-color); }
</style> <div style="--title-color: #AC2E2E"> <h2 class="article-title">記事A</h2> </div> 親に渡したCSS変数を、追加した子孫要素も参照できる。 46 第3章|スタイル + 新しいインスタンス <div style="--title-color: #2459A6"> <h2 class="article-title"> 記事B </h2> </div>
第4章 試行錯誤。 47
Carouselという魔境 表現力が無限大はテストケースも無限大 48 第4章|試行錯誤・カルーセル
データの中に、条件分岐も関数も。 独自DSL 判定 関数定義 関数呼び出し 49 第4章|試行錯誤・カルーセル 独自パーサー 関数化 Vue.js
ライフサイクル computed
当然、自作する。 既存ライブラリ 細かな制御が合わない 50 第4章|試行錯誤・カルーセル 自作 評価と処理順まで合わせる
Vue.jsの内部処理順にまで踏み込む 独自DSL 独自DSL Vue.js ブラウザのイベント carousel-renderer DOM computed 要素 条件式
DSL由来の関数 ライフサイクル 評価結果を受け取る 初期化 関数定義 inlineStyle 条件判定 依存する値 状態 関数呼び出し transition スタイル更新 条件判定 値の参照 ユーザー定義変数 ユーザー定義の値 トリガー処理 評価結果 更新処理 データ トリガー ユーザー定義の値 別の値を参照 描画処理 独自パーサー 表示状態 タイミング調整 再評価 次の更新 生成された関数 要素の入れ替え 処理を再開 値の受け渡し 要素の制御 処理順が1つでも狂うと、既存の動作とズレる。 51 タイマー・同期 第4章|試行錯誤・カルーセル 処理を予約 setTimeout 待機 処理を再開 要素を入れ替える 次の処理へ
Reactiveな挙動をトレースするのとても辛い 4 カルーセルだけで、たぶん。 52 か月 第4章|試行錯誤・カルーセル
サイズ別画像切り替え 画像読むのにjsなんで使わにゃならんのだ 53 第4章|試行錯誤・画像
画像のJSも消せるんちゃうか? 画像を切り替える基準は、viewportではなくcontainerのサイズ。 同じviewport 広いcontainer 大きい画像を選ぶ 画面幅が同じでも、必要な画像サイズは違う。 54 第4章|試行錯誤・画像 狭いcontainer 小さい画像を選ぶ
JSで画像を選択 ↓ この処理を CSSだけに できないか?
画像選択、CSSだけでいけた! やったーーー! SVG / ラッパー img 小 Container Queryで選択 55
第4章|試行錯誤・画像 img 中 img 大 loading="lazy"
横を直すと、縦が壊れる。なんでや。 3月10日 同日 3月16日 横並びで 縮まない 縦並びで 位置がズレる 幅の指定を 組み直す
修正 撤回 再修正 56 第4章|試行錯誤・画像
2年くらい粘ったが敗北しJSへ戻した SVG / ラッパー img img img img CustomElementで妥協 57
第4章|試行錯誤・画像
第5章 2年半たった現状 58
248,725 開発の節目とコード総量 各月末の総行数 行 · 2026/6/12 リリース時点 千行 300 1
9 3 8 200 2 4 7 5 6 100 1 2 3 4 6 5 7 8 0 2024/3 2024/9 2025/3 2025/9 実装・テスト・開発ツール。依存コード・データ・生成物を除外。 第5章|開発の思い出と成果 59 2026/3 6/12 9 2024.08.16 型と生成処理を再編 2025.01頃 Clineを使い始める 2025.03頃 Claude Codeを使い始める 2025.07.03 カルーセルを再設計 2025.09.22 生成とサーバーを分離 2025.11頃 バグ修正にラストスパート 2026.02.25 RSSをIsland化 2026.04.22 取得とHTML構築を分離 2026.06.12 リリース 2・3・6は本人の回想
行カバレッジは81.4%に。 行カバレッジ|両方とも現在のコードで計測 Studio Preview HRC(全パッケージ込み) 未実行ファイルを含む。テスト・モック・生成データを除外。 2026.09.10 計測|実行基盤が異なるため参考比較 60 第5章|開発の思い出と成果
32.8% 81.4%
13 外部ライブラリ 個 監視用を含む 61 第5章|開発の思い出と成果
58 CI時間 62 第5章|開発の思い出と成果 秒
モバイルでも100点を取れるようになりました モバイル Lighthouse|公式記事の計測例 新基盤への切り替えに加え、実装もチューニングした比較。 出典:Studio公式発表 · 2026.01.29 第5章|開発の思い出と成果 63
できてみたら 誰からも文句を言われませんでした 64
第6章 ヘルシーな インターネットへ。 65
細い回線でも、 本文を読める ようにしたい。 66 第6章|ヘルシーなインターネット
本文がHTMLにある。 人が読める <article> 本文 </article> 機械が読める アーカイブできる 67 第6章|ヘルシーなインターネット
今の実行環境がなくなっても、 情報は残したい。 今の実行環境 情報 68 第6章|ヘルシーなインターネット
スペシャルサンクス HRC全般 HRC全般 VRT anatoo hanayama mizchi x.com/anatoo 69 github.com/hanatyan128
x.com/mizchi
ご清聴ありがとうございました