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 Modules、及び CSS Modules に足りないもの / CS...
Search
mizdra
PRO
April 19, 2024
Programming
7
2.1k
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
BARフロントえんどう #2 「CSS Library / Framework」で発表した資料です。
mizdra
PRO
April 19, 2024
Tweet
Share
More Decks by mizdra
See All by mizdra
React Server Components の疑問を解き明かす
mizdra
PRO
20
7.7k
大量の ESLint エラーに対処する技術 / The technology to fight with many ESLint's errors
mizdra
PRO
0
2.8k
Vue Language Server から生まれた Volar.js と、それが秘める可能性
mizdra
PRO
13
7.5k
マルチテナントで GraphQL を使う際の工夫
mizdra
PRO
0
2.3k
Webフロントエンドの秩序を維持する体制を作る
mizdra
PRO
9
25k
個人開発の裏側
mizdra
PRO
0
270
祝う2
mizdra
PRO
0
670
Other Decks in Programming
See All in Programming
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
320
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.1k
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
110
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
470
プロジェクト新規参入者のリードタイム短縮の観点から見る、品質の高いコードとアーキテクチャを保つメリット
d_endo
1
1.1k
Contemporary Test Cases
maaretp
0
120
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
1.8k
Identifying User Idenity
moro
6
9.8k
as(型アサーション)を書く前にできること
marokanatani
7
2.3k
初めてDefinitelyTypedにPRを出した話
syumai
0
340
Ethereum_.pdf
nekomatu
0
440
Webの技術スタックで マルチプラットフォームアプリ開発を可能にするElixirDesktopの紹介
thehaigo
2
1k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Designing Experiences People Love
moore
138
23k
Faster Mobile Websites
deanohume
305
30k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
43
2.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Side Projects
sachag
452
42k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Scaling GitHub
holman
458
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Transcript
はてなにおける CSS Modules、 及び CSS Modules に足りないもの id:mizdra 2024/04/19 BARフロントえんどう#2
1 2024/04/19 BARフロントえんどう#2
自己紹介 • mizdra (みずどら) • 株式会社はてな ◦ Webアプリケーションエンジニア ◦ フロントエンドエキスパート
2
本日のテーマ: CSS Modules • 趣味でも、業務でも利用 • なんで使ってるの? / どう使ってるの? /
実際どうよ? ◦ とか色々話せれば 3
CSS Modules とは • CSS をローカルスコープ化する仕組み • CSS はグローバルスコープ ◦
.foo { .. } はページ内全ての .foo に適用される • CSS Modules を使うと... ◦ 特定のコンポーネントの .foo にだけ適用できる 4
例: Article コンポーネントで CSS Modules 5
ビルドすると、以下のように変換される 6
7 はてなにおける CSS Modules
はてなのフロントエンド 8 • 社内の一般的な技術スタック ◦ View ライブラリ: React ◦ CSS
フレームワーク: CSS Modules • 最近は CSS-in-JS / Utility-first が流行りだけど... ◦ はてな社内では、CSS Modules を使ってる
なぜ CSS Modules? 9 • 大きな理由は2つ • 理由1: 導入が簡単 ◦
xxx.module.css を作成 & import するだけ ◦ CSS-in-JS などと違い、ビルドツール組み込みでサポート ▪ ビルドツールの設定を書かなくて OK
なぜ CSS Modules? 10 • 理由2: 生の CSS に近い感覚で書ける ◦
fontSize じゃなくて font-size で OK ◦ Media Queries 使える ◦ .foo, .bar, .baz:hover { .. } も OK • はてなではデザイナーが CSS 書いてる ◦ コーディング経験無い方もいて、入社してから覚えてもらう ◦ CSS Modules なら、取っつきやすい
あまり支配的な理由ではないけれど... 11 • パフォーマンス上の懸念がない、という理由もある ◦ コンポーネントレンダリング時に <style> を挿入、みたいなこ とはしてない ◦
実行時のオーバーヘッド無し • パフォーマンスの心配をせずに使える
12 導入して 困ったこと
導入して困ったこと 13 1. 未使用の CSS 宣言が bundle に含まれる 2. style.unknown
と書いてもビルドが通る 3. コードジャンプできない
1. 未使用の CSS 宣言が bundle に含まれる 14 (プロジェクトの構成にもよるが、Next.js だと...) •
未使用の CSS 宣言は成果物に含まれる *1 • ユーザから隠したつもりが... ◦ devtools で .css を読むと書いてある *1: https://github.com/mizdra/next-unused-css/tree/main/.next/static/css
未使用の CSS 宣言が bundle に含まれる様子 15
解決策 16 • Bundler 側が対応してくれないと、どうにもならない ◦ Webpack, Turbopack, Vite, …
• ユーザ側でどうにかするしかない ◦ 未使用の CSS 宣言は消す or コメントアウト • 不便だけど、気をつければ OK ◦ 書き方によって bundle に含まれたり、含まれなかったりしない ◦ 良いように捉えると、制御しやすい
2. style.unknown と書いてもビルドが通る 17 (プロジェクトの構成にもよるが、Next.js だと...) • 以下のようなコードを書いても、ビルドが通る!!! ◦ tsc
の型チェックに pass し、ビルドできてしまう
解決策 18 • typed-css-modules ◦ .module.css を解析して、.module.css.d.ts を生成 ◦ tsc
がそれを見て、型チェック ◦ => 存在しないクラスの参照があったら、tsc がエラーを吐く
型エラーになる様子 19
typed-css-modules の制限 20 • Scss, Less はサポートしてない ◦ はてなでは、Scss, Less
どちらも使ってて困った • 調べたところ... ◦ typed-scss-modules, typed-less-modules を発見 ◦ => はてなではこれを導入
3. コードジャンプできない 21 • .tsx の側から、.css の定義元にジャンプしたい ◦ style.foo を
Command + Click で .css にジャンプしたい • しかし実際には... ◦ .module.css.d.ts にジャンプしてしまう
.module.css.d.ts にジャンプしてしまう様子 22
解決策 23 • VS Code 拡張機能を入れる • これでコードジャンプできる
VS Code 拡張の制限 24 • VS Code でしか機能しない (それはそう) •
チームに vimmer が居る ◦ どのエディタでも使える方法が欲しい • けど、そんなものはなかった ◦ なければどうする? ◦ 作ればいいじゃない!
happy-css-modules 25 • typed-css-modules の上位互換(相当)のツール ◦ .module.css.d.ts が生成できる ◦ CSS,
SCSS, LESS 全てサポート
happy-css-modules と Declaration Map 26 • 加えて .module.css.d.ts.map も生成 ◦
Declaration Map というやつ ◦ .module.css.d.ts => .module.css の対応関係が記録されてる • これを Language Server *2 が読んでくれる ◦ 通常は .module.css.d.ts にジャンプするはずだが... ◦ Declaration Map により、.module.css にジャンプできる! *2: コードジャンプや補完などの補助機能を提供するプログラムのこと。 エディタとは独立していて、様々なエディタと組み合わせられる。 同じ Language Server を使っていれば、どのエディタでも同じ開発体験が得られる。
コードジャンプの様子 27
28 コードジャンプの仕組み
happy-css-modules 導入の結果 29 • .tsx ⇔ .module.css の行き来がとても楽に • デザイナーさんからも好評
• 作って良かった
30 という感じで、 快適に使ってます
31 けど実際 CSS Modules ってどうよ?
実際 CSS Modules どうよ? 32 • いいけれど... • やっぱり開発体験は他の CSS
フレームワークに劣る ◦ CSS 宣言を利用するコードを探せない (Find all references) ◦ 未使用 CSS 削除できない • JS の中に全てがあることで、できることがある ◦ CSS-in-JS ならではの強み
仕様がメンテナンスされてない問題 33 • 2015 年を最後に停滞 *2 ◦ CSS Variables のローカルスコープ化の提案などが、進んでない
*3 • @sokra, @geelen, @markdalgleish が仕様策定してた ◦ 中でも geelen がよく貢献してた ▪ 2016 年から styled-components の開発を開始 ◦ 主要なメンテナが、CSS Modules から離れた *2: https://developer.hatenastaff.com/entry/2022/09/01/093000 *3: https://github.com/css-modules/css-modules/issues/303
正直なところ... 34 • CSS Modules じゃなくても良い ◦ デザイナーが CSS 書いてるなら、一考の余地はある
◦ エンジニアが書いてるなら、他の技術で良い
発表を通して伝えたかったこと 35 • メンテナンスされてるのは重要 ◦ 活発じゃなくて良いけど、世の中の変化には追従してほしい ▪ CSS の新機能が登場した時に、それを取り込むとか •
情熱を持った人がいると、変化しやすい ◦ CSS の新機能への追従もそう ◦ 「CSS Modules 良くするために、ツール作ろうぜ!」 ◦ 情熱って大事だね
まとめ 36 • はてなでは CSS Modules 使ってる ◦ デザイナーが CSS
を書く、という業務形態にマッチしてた ◦ 補助ツールを作って、開発体験を向上させた • とはいえ... ◦ 開発体験に多少の難あり ◦ 業務形態が違えば、他の技術がマッチするかも ◦ 世の中の変化に追従できるものだと、なお良い
hatena.co.jp/recruit 37 37