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
CSS、JSをHTMLテンプレートにまとめるフロントエンド戦略
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Saito Ayumu
June 22, 2025
Technology
0
2.4k
CSS、JSをHTMLテンプレートにまとめるフロントエンド戦略
ExciteHD TechCon 2025の登壇資料です。
Saito Ayumu
June 22, 2025
Tweet
Share
More Decks by Saito Ayumu
See All by Saito Ayumu
チーム内のUIデザインのコミュニケーションを円滑にするFigmaの機能「Variants」をおさらい!
d120145
0
1.4k
Other Decks in Technology
See All in Technology
S3はフラットである –AWS公式SDKにも存在した、 署名付きURLにおけるパストラバーサル脆弱性– / JAWS DAYS 2026
flatt_security
0
1.7k
Kubernetesにおける推論基盤
ry
1
310
Scrumは歪む — 組織設計の原理原則
dashi
0
120
情シスのための生成AI実践ガイド2026 / Generative AI Practical Guide for Business Technology 2026
glidenote
0
200
オレ達はAWS管理をやりたいんじゃない!開発の生産性を爆アゲしたいんだ!!
wkm2
4
500
最強のAIエージェントを諦めたら品質が上がった話 / how quality improved after giving up on the strongest AI agent
kt2mikan
0
160
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
8
7.2k
プロジェクトマネジメントをチームに宿す -ゼロからはじめるチームプロジェクトマネジメントは活動1年未満のチームの教科書です- / 20260304 Shigeki Morizane
shift_evolve
PRO
1
250
When an innocent-looking ListOffsets Call Took Down Our Kafka Cluster
lycorptech_jp
PRO
0
120
マルチアカウント環境でSecurity Hubの運用!導入の苦労とポイント / JAWS DAYS 2026
genda
0
460
組織全体で実現する標準監視設計
yuobayashi
2
480
作りっぱなしで終わらせない! 価値を出し続ける AI エージェントのための「信頼性」設計 / Designing Reliability for AI Agents that Deliver Continuous Value
aoto
PRO
2
280
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
240
My Coaching Mixtape
mlcsv
0
69
Documentation Writing (for coders)
carmenintech
77
5.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
The browser strikes back
jonoalderson
0
780
Color Theory Basics | Prateek | Gurzu
gurzu
0
240
Transcript
Front-end strategy to combine CSS and JS into HTML templates
齋藤 歩 エキサイト株式会社 メディア・プラットフォーム事業部 デザイナー CSS、JSをHTMLテンプレートにまとめる フロントエンド戦略
免責 本資料および講演内容は、発表者個人の見解であり、所属する組織の公式見解を示すものではありません。 本資料に含まれる情報は、発表時点での情報に基づいています。資料作成には細心の注意を払っておりますが、 その正確性、完全性、有用性を保証するものではありません。 本資料および講演内容の利用によって生じたいかなる損害についても、発表者および所属組織は一切の責任を負 いかねます。 本資料に記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。これらの画像は、各 社の情報提供を目的として使用しており、権利侵害を意図するものではありません。
齋藤 歩 エキサイト株式会社 メディア・プラットフォーム事業部 デザイナー Qiita、エキサイトでのインターンを経て、 中京大学法学部卒業後にエキサイトに新卒入社(24卒) 。 仕様策定から、UI/UX設計、Webフロントエンドの実装まで携わっています。 「エキサイトブログ」
「ウーマンエキサイト」等を担当しています。 自己紹介
お話すること 20min フロントエンドを取り巻く環境 理想状態を実現するための「ひとまとめ」戦略 戦略はどう活きているかと課題 01 02 03 フロントエンドの「ややこしさ」と理想状態、直面した課題を実例を用いてお話します 理想状態の実現のために取った戦略と、その手段としてのTailwind
CSS 、Alpine.js、htmxをご紹介します 「ひとまとめ」戦略による成果と課題、それに対してどう向き合っているかをお話します
フロントエンドを取り巻く環境 01
フロントエンドを取り巻く環境 01 フロントエンドのややこしいところ
フロントエンドを取り巻く環境 01 UIを構成する要素が 散らばりがちで、追いにくい ややこしいところ
フロントエンドを取り巻く環境 01 実際に遭遇した事象 リビルド以前のエキサイトブログサービスサイト(トップ面) BEMとTailwind CSS的なお手製ユーティリティクラ スが混在 ユーティリティクラスはどこで何が使われているか不 明。それ故、車輪の再発明が散見されCSSが肥大化 JSもインラインで書かれているもの、ファイルに切
り出されているものが混在して管理しきれずに、不要 なファイル・処理が消せずに残り続ける状態に
フロントエンドを取り巻く環境 01 フロントエンドの理想状態とは
フロントエンドを取り巻く環境 01 要素が一発で消せる状態 理想状態
フロントエンドを取り巻く環境 01 要素を消すときの思考 <div class="entry-cta__wrapper mt40 columnSet"> <p class="fs16 fwB">
ここから記事を書くとポイントがもらえます</p> <button type="button" class="entry-cta__btn"> 記事を書く</button> </div>
フロントエンドを取り巻く環境 01 要素を消すときの思考 これはユーティリティクラス? JSの処理がありそう。どこだろう? BEMぽい!CSSも消さないと <div class="entry-cta__wrapper mt40 columnSet">
<p class="fs16 fwB"> ここから記事を書くとポイントがもらえます</p> <button type="button" class="entry-cta__btn"> 記事を書く</button> </div>
フロントエンドを取り巻く環境 01 要素を消すときの思考 これはユーティリティクラス? JSの処理がありそう。どこだろう? BEMぽい!CSSも消さないと <div class="entry-cta__wrapper mt40 columnSet">
<p class="fs16 fwB"> ここから記事を書くとポイントがもらえます</p> <button type="button" class="entry-cta__btn"> 記事を書く</button> </div> 自分以外が実装した要素を消すのは大変
フロントエンドを取り巻く環境 01 ページや要素が一発で消せる状態 新規追加や拡張もしやすい状態 =
理想状態を実現するための「ひとまとめ」戦略 02
理想状態を実現するための「ひとまとめ」戦略 02 どうすれば理想状態に近づくのか
理想状態を実現するための「ひとまとめ」戦略 <div class="entry-cta__wrapper mt40 columnSet"> <p class="fs16 fwB"> ここから記事を書くとポイントがもらえます</p> <button
type="button" class="entry-cta__btn"> 記事を書く</button> </div> 02 要素を消すときの思考 これはユーティリティクラス? コンテンツ的にJSの処理がありそう。どこだろう? BEMぽい!CSSも消さないと
理想状態を実現するための「ひとまとめ」戦略 <div class="entry-cta__wrapper mt40 columnSet"> <p class="fs16 fwB"> ここから記事を書くとポイントがもらえます</p> <button
type="button" class="entry-cta__btn"> 記事を書く</button> </div> 02 要素を消すときの思考 これはユーティリティクラス? コンテンツ的にJSの処理がありそう。どこだろう? BEMぽい!CSSも消さないと HTMLだけなら楽なのに⋯
理想状態を実現するための「ひとまとめ」戦略 <div class="entry-cta__wrapper mt40 columnSet"> <p class="fs16 fwB"> ここから記事を書くとポイントがもらえます</p> <button
type="button" class="entry-cta__btn"> 記事を書く</button> </div> 02 要素を消すときの思考 これはユーティリティクラス? コンテンツ的にJSの処理がありそう。どこだろう? BEMぽい!CSSも消さないと HTMLだけにしてしまおう!
理想状態を実現するための「ひとまとめ」戦略 02 CSS・JSを HTMLテンプレートにまとめる 理想状態の実現のための指向 in
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする?
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする?
理想状態を実現するための「ひとまとめ」戦略 02 CSSはすべてstyle属性に記述する? <p style="font-size: 16px; font-weight: bold;">Hello World</p> HTMLとCSSの凝集度は高められる
スコープが効いた状態になるので、異なる要素間での影響は排除できる メディアクエリや擬似クラスが使用できない
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする?
理想状態を実現するための「ひとまとめ」戦略 02 ユーティリティクラスだけでスタイリングするようにする? <p class="fs16 fwB">Hello World</p> HTMLとCSSの凝集度は高められる スコープが効いた状態になるので、異なる要素間での影響は排除できる メディアクエリや擬似クラス用のユーティリティクラスを用意する必要あり
設計コスト、メンテナンスコストが高くなってしまう
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする?
理想状態を実現するための「ひとまとめ」戦略 02 JSはすべてインラインスクリプトにする? <button id="function-btn">Hello World</button> <script> ... </script> 要素と処理を紐づけるためのidやclassの命名が必要
JSXならこれは解消できる?
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする?
理想状態を実現するための「ひとまとめ」戦略 02 戦略の実現手段のアイデア CSSはすべてstyle属性に記述する? ユーティリティクラスだけでスタイリングするようにする? JSはインラインスクリプトにする? ライブラリを検討する
理想状態を実現するための「ひとまとめ」戦略 02 「ひとまとめ」を実現する技術 Tailwind CSS Alpine.js htmx
理想状態を実現するための「ひとまとめ」戦略 02 Tailwind CSS ユーティリティクラスを用いてスタイリング 必要な分だけ生成するのでCSSが常に最小になる 要素に直接スタイリングすることで、要素間の影響が 排除され、 「一発で消せる状態」になる メディアクエリ・擬似クラスの利用も可能
<p class="text-lg sm:text-md">Hello World</p> ポイント
理想状態を実現するための「ひとまとめ」戦略 02 Alpine.js Vue.jsに近い使用感 *CDNから読み込むファイルの容量 44KBと軽量(Vue.jsは約551KB)* 要素に直接処理を記述することで、要素間の影響が排 除され、 「一発で消せる状態」になる DOM操作に特化した必要最小限のAPIで理解しやすい
<button @click="$el.remove()"> ボタンが消える</button> ポイント
理想状態を実現するための「ひとまとめ」戦略 02 htmx 通信を伴うDOMの部分更新に特化したライブラリ マークアップの延長でAJAXの実装ができる 要素に直接処理を記述することで、要素間の影響が排 除され、 「一発で消せる状態」になる 複雑なJSを記述することなくAJAXが実装できる <button
hx-post="/endpoint"> リクエスト発行</button> ポイント
理想状態を実現するための「ひとまとめ」戦略 02 キーが離されてから1.5秒後にPOST&入力値をリアルタイムに表示 <div x-data="{ inputtedText: '' }" class="flex items-center
gap-2 p-4"> <label> <span> ニックネーム</span> <input type="text" name="nickname" x-model="inputtedText" hx-post="/save" hx-trigger="keyup changed delay:1.5s"> </label> <p> 入力値は:<span x-text="inputtedText"></span></p> </div>
戦略はどう活きているかと課題 03
戦略はどう活きているかと課題 03 どう活きているか 自分以外が実装した要素でも消しやすく、追加・編集しやすくなった ファイルが分散せずにテンプレートファイルのみに集中すれば良い CSS・JS含めて要素が独立するため他の要素への影響が排除 要素の再利用もしやすい 命名に関するコンテクストを合わせる必要が最小限になった ユーティリティファーストなスタイリングのためclass名の命名は不要 JSもタグに直接記述するためid等の命名は不要
戦略はどう活きているかと課題 03 課題 特にTailwind CSSについて ユーティリティファーストなスタイリングによる可読性の低下 導入にはCLIに触れる必要があり、デザイナーにとってはとっつきにくい
戦略はどう活きているかと課題 03 課題への取り組み ユーティリティファーストなスタイリングによる可読性の低下 Prettierによる規則的なソートを実行 公式プラグインのprettier-plugin-tailwindcssを使用 githooksのpre-commitを使用してcommit時に自動実行 課題 対処
プロジェクトへの導入方法やスタイリング方法のチュートリアルを作成 https://github.com/excitejp/media-tutorial-tailwind-css 導入教材としての開発指針を作成 https://excite-japan.atlassian.net/wiki/spaces/MED/pages/1225031752/Tailwind+CSS 戦略はどう活きているかと課題 03 課題への取り組み 導入にはCLIに触れる必要があり、デザイナーにとってはとっつきにくい チュートリアルや開発指針の整備 課題
対処
まとめ 04 フロントエンドの理想状態は「要素を一発で消せる状態」なのでは 消しやすいは追加や拡張もしやすいにつながる CSS・JSをHTMLテンプレートにまとめると理想に近づく 実現方法の一つにTailwind CSS、Alpine.js、htmxがある これらにより要素間の影響がCSS、JSも含めてなくなるので、自分が把握 していない要素でも怖がらずに手を加えられる 命名に関する議論も最小限に留められるのでチーム開発だからこそ活きる
ご紹介した技術のテックブログでの発信にも注力しています Tailwind CSS 23記事 7記事 6記事 Alpine.js htmx
ご清聴ありがとうございました!