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
mottox2
November 18, 2023
Technology
8
6.9k
なぜコピペで使うコンポーネント集を利用するのか?
フロントエンドカンファレンス沖縄2023で発表に使用したスライドです。
mottox2
November 18, 2023
Tweet
Share
More Decks by mottox2
See All by mottox2
もう一歩進めたい OG画像の動的生成
mottox2
7
1.5k
UIコンポーネントライブラリをうまく使うためにできること / components-with-designer
mottox2
7
3.7k
Figma Plugin公開までの壁を乗り越える
mottox2
2
2.8k
Puppeteerでつくる画像と動画 / images and videos made with puppeteer
mottox2
0
620
手触りのよいウェブを考える / better-mobile-web
mottox2
3
1.7k
組織と権限とSlack App / slack-app-with-roles
mottox2
1
600
SSRを避けるためにやっていること / ssr-alternative
mottox2
9
3.1k
JSXでつくる宣言的UIなプレゼンテーション / jsx-presentation
mottox2
7
32k
プレイヤー目線の技術ブランディング / personal branding
mottox2
4
4.2k
Other Decks in Technology
See All in Technology
5分でわかるDuckDB
chanyou0311
10
3.2k
kargoの魅力について伝える
magisystem0408
0
200
大幅アップデートされたRagas v0.2をキャッチアップ
os1ma
2
520
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
150
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
250
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
120
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
Wvlet: A New Flow-Style Query Language For Functional Data Modeling and Interactive Data Analysis - Trino Summit 2024
xerial
1
110
権威ドキュメントで振り返る2024 #年忘れセキュリティ2024
hirotomotaguchi
2
730
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Faster Mobile Websites
deanohume
305
30k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Docker and Python
trallard
41
3.1k
Speed Design
sergeychernyshev
25
670
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Building Your Own Lightsaber
phodgson
103
6.1k
Gamification - CAS2011
davidbonilla
80
5.1k
Done Done
chrislema
181
16k
Practical Orchestrator
shlominoach
186
10k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Transcript
なぜコピペで使う コンポーネント集を利用するのか? フロントエンドカンファレンス沖縄2023 @mottox2
@mottox2 UIデザインとウェブフロントエンド
コンポーネント集、 どうしていますか? 既存のものを使っていますか?
本セッションの対象者 小規模チーム シングルプロダクト マルチプロダクト 大規模 マルチプロダクトであるとか、 サービスが成熟期な人にはNot for meと感じられるかもしれません
コンポーネント集の歴史を振り返る 1. Bootstrap時代 2. React/Vueコンポーネント時代 3. Unstyledコンポーネント時代
Bootstrap時代 CSSフレームワークとも呼ばれていた、 SPA普及以前によ く使われていたもG でかいCSSを読み込んで使う、 グローバ' カスタマイズはできた!
CSS本体をいじってしまうと、 1万行ぐらいあったりする ので、 どこをいじったか分かりにくくなることがあった
React/Vueコンポーネント時代 T MUI、 Chakra等コンポーネントライブラリと言ったら、 多く の人が思い浮かべるものF T npmで配布されるコンポーネントを読み込んで利用するF T テーマ的な概念はあるが、
細かいカスタマイズは難しいF T 自作コンポーネントとのインタフェースを揃えにくいF T スタイリングライブラリを強制されがち。
コンポーネントライブラリ固有の 知識が多すぎない? スタイルはブラックボックスの中 MUIのサンプル // スタイルはブラックボックスの中、原則props経由で見た目を変更する /* 何も考えずにコンポーネントを作ると、sxPropsが使えない */ import
from import from import from const = => = = = = = Card ; CardContent ; ArticleCard () ( < > < {{ mt: }}> < > < {{ fontSize: }} >Okinawa</ > </ > </ > { } < /> </ > ); '@mui/material/Card' '@mui/material/CardContent' '@/components/ArticleCard' "text.secondary" "" "margin-top: 16px;" Page sx sx color article style div div Card 4 CardContent Typography 14 Typography CardContent Card ArticleCard
Unstyledコンポーネント時代 スタイルがなく、 機能だけを提供す アクセシビリティを担保しながら作る観点もあ その分、 自分たちで書く量も多8
自作コンポーネントライブラリの基礎にもなりう Headless UI, Ark UI, Radix Primitivesなど
Radix Primitivesのサンプルコード import from import as from import const =
=> = = = = = = = = React ; Tabs ; ; () ( < > < > < > Account </ > < > Password </ > </ > </ > ) 'react' '@radix-ui/react-tabs' './styles.css' "TabsRoot" "tab1" "TabsList" "Manage your account" "TabsTrigger" "tab1" "TabsTrigger" "tab2" * Tabs.Root Tabs.List Tabs.Trigger Tabs.Trigger Tabs.Trigger Tabs.Trigger Tabs.List Tabs.Root Demo className defaultValue className aria-label className value className value
Radix Primitivesのサンプルコード .TabsRoot .TabsList .TabsTrigger { : ; : ;
: ; : ( ); } { : ; : ; : ( ); } { : ; : ; : ; : ; display flex flex-direction column width 300 box-shadow 0 2 10 var flex-shrink 0 display flex border-bottom 1 solid var font-family inherit background-color white padding 0 20 height 45 px px px px px px --black-a4 --mauve-6 サンプルコードが提供されてるとはいえ このテンションでやるのは大変
楽な状態と自由な状態のトレードオフ unstyledなライブラリは自由ではあるが、 あまりにも手 数がかかりすぎp MUI系はカスタマイズがしにくい上に、 流儀に沿わないと ポテンシャルを活かせな9
headless系との噛み合わせも 自作コンポーネントに思想を組み込むのも漏れがち
自由と楽さ、 どちらが欲しいですか?
両取りできる!?コピペで導入するコンポーネント集 r コンポーネント集のサイトからコードをプロジェクトにコ ピペして利用するもE r Unstyledなライブラリにスタイルを当てたものが用意さ れている
コピペで導入するとは何? コピペで導入でき、 コードがプロジェクト上に露出すf 今までprops経由やthemeで変更を行う必要があった部 分が露出し、 カスタマイズ可能v ライブラリ特有の部分が少なく、
挙動も把握しやす ライブラリ自体を離脱する選択が取りやすいので、 採用し やすい
両取りできる!?コピペで導入するコンポーネント集 t 有名どころは3X t radix primitiveにスタイルを当てたshadcn/uS t ArkUIにスタイルを当てたParkU3 t Tailwind
Labsが開発中のCatalyst (現在未公開)
None
shadcn/ui r Radix Primitiveに対し てTailwindのスタ イ ルを当てたコ ンポーネン ト集x r
イ ン ス トール用のCLIが用意されてい て、 以下のよ うなコ マン ド で依存関係も含めて導入でき るx r `npx shadcn-ui@latest add button r Tailwindのテーマを利用した実装にな っ ている。
shadcn/ui export interface extends typeof ?: const = = ...
=> const = ? : return < = = ... /> . < >, < buttonVariants> { } React. < , >( ({ , , , , }, ) { asChild Slot ( className { ( ({ , , }))} ref {ref} { } ) ButtonProps React ButtonHTMLAttributes HTMLButtonElement VariantProps forwardRef HTMLButtonElement ButtonProps cn asChild className variant size asChild props ref Comp buttonVariants variant size className props boolean Button false Comp "button"
À
À Park UI À Ark UIをベースにスタイルを当てたコンポーネント集i À PandaCSS (React、 Vue、
Solid) とTailwindを対象にし ているi À(おそらく、 自作コンポーネントライブラリを作るのに向い ている。 )
Next.jsのプロジェクトにshadcn/uiのボタンを追加しま Q `npx shadcn-ui@latest init EQ `npx shadcn-ui@latest add button
ÇQ 作成されたButtonを読み込む 時間があればデモ
À 余談: 雰囲気がニュートラルであること À 良い意味で 「らしさ」 がないスタイル、 UIデザインのスター ト地点にしやすv À
ニュートラルな理6 À スタイルが自由にいじれるから好き勝手変更でき9 À ダークモードなどを考えると自ずとニュートラルにな りがち
使いたいという理由もありましたが 状況にフィットしたので 実プロジェクトでshadcn/uiを採用しています
なぜ採用したのか? - そもそもの前提条件 組織的にReact + TailwindCSSを使うことが多f ロックインすることは許容していE
人数は多くないのでUIだけにコストはかけずらf 対象となるアプリケーションはユーザー向けフロントエン ドと内部向けフロントエンドが存在するサービス
一般ユーザー向け 編集者向け ウェブサイト寄り フロントエンド ウェブアプリ寄り フロントエンド Tailwind製 何を使おう? なぜ採用したのか? -
スタイリング方法の統一
編集者向け ウェブアプリ寄り フロントエンド x 同じチームで触るとしたら MUIやChakraは避けたF x TailwindとCSS in JSの
スイッチングコストは結構 でかい (主観) → スタイリングのライブラリ を統一したい
このプロジェクトの行き来はしんどい const = => return = = = () {
< > < > < >Hello Okinawa</ > < >Hello Okinawa</ > </ > </ > } ChakraPage fontSize mt color Card CardBody Text Text Text Text CardBody Card 'xl' "4" "gray.500" const = => return = = () { < > < > < >Hello Okinawa</ > < >Hello Okinawa</ > </ > </ > } TailwindPage className className Card Card.Body Card.Body Card p p p p "text- xl" "mt-4 text- gray-500"
` カスタマイズが入るコンポーネントの見込みがあっ1 ` ちょっと凝ったFileUplod、 SelectBo ` 外部ライブラリと連携するRichEditoÈ ` CSS in
JS系のを入れたくなかった なぜ採用したのか? - 外部ライブラリとの連携
使ってみてどうか? x 総評としては入れて良かったと感じているI x Tailwindを使いつつUIパーツが速攻で用意できてよいI x TailwindのconfigやVariantのレールが引けて良いI x 気に入らないことがあったらすぐ変更できる安心感I x
離脱しやすいので導入の心理的コストが低い。
どんな懸念がある? コピペで導入する方法が枯れてないことによる負債化X 共有コンポーネントが触りやすすぎることによる負債化。 → やはり気を使ってメンテナンスしていく必要はありそう 離脱しても単なるTailwindプロジェクトになるので一定
の安心感はある
まとめ u セッションタイトル→自由と便利さを両どりするためP u コンポーネント集にも新時代が訪れつつあるP u その中でも妥協点になりうるコピペで使うコンポーネン ト集が現れてきているP u 今回の選択はあくまで一例、
自分のプロジェクトにあった ものを選ぼう。
Thank you!