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
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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Antd v5移行について
Search
matsuzakk
September 28, 2023
Technology
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Antd v5移行について
matsuzakk
September 28, 2023
More Decks by matsuzakk
See All by matsuzakk
React Native Meetup#21 基調セッション ft menu
mashroomat
0
1.3k
Hello, Openshift
mashroomat
0
30
Other Decks in Technology
See All in Technology
Kiro Crewをはじめよう
kizawa2020
1
160
Refining Active Record
shugo
0
160
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
480
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
460
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
920
大型犬好きによるPugの紹介
yamanoku
1
160
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
170
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
330
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
970
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
It's Worth the Effort
3n
188
29k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Tell your own story through comics
letsgokoyo
1
1.1k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Faster Mobile Websites
deanohume
310
32k
Transcript
Antd v5移行について 🍬 🐜 🐜 🐜 🐜
Remove less, adopt CSS-in-JS
v5 から「コンポーネントレベルのCSS-in-JS」を採用 一般的なCSS-in-JSでは、<style>タグが挿入(シリアライズ)されたかを識別するのに、ハッシュ値を使用する。 よく挙げられるCSS-in-JSの問題点として、コンポーネントに渡したpropsの変更に伴ってスタイルも変更されることでハッシュ値 の再計算が高頻度に行われてパフォーマンスに影響ができること。(ライブラリとブラウザの二重解析) 各種ライブラリではこれらに対処する様々なアプローチを持っている。ex: ゼロランタイムCSS-in-JS antdは前提としてpropsの変更がコンポーネントのスタイルに影響を与えることはない。スタイルの変更が起きるのは1. テーマ 変数(Token)の変更
2. antdのバージョン(Version)変更 の場合のみ。それ以外はスタイルは最初のマウント時に一度だけ生成 され、必要なスタイルはキャッシュから与えられる。
補足: 一般的なCSS-in-JSのメリット・デメリット メリット ・ダイナミックなスタイリング ・Javascriptの開発体験の向上 ・コンポーネントに閉じたスタイル ・スタイル変更の自由度 ・CSSの静的解析(クラス名指定間違いが減る ) デメリット
・パフォーマンス (ライブラリによるstyle生成とブラウザ解析の 二 重解析) ・可読性が悪い ・クラス名がハッシュ化されて読めない ・スタイル記法がライブラリに依存する
v5 の主要概念 Design Token…テーマやコンポーネント全体のスタイルに影響を与える最 小要素 ・Seed Token…デザイン意図の基本単位 ・Map Token…Seed Tokenから派生したベースになるトークン
・Alias Token…Map Tokenから派生したコンポーネント向けトークン Algorithm…Seed TokenからMap Tokenへ派生させる際の計算方式 (計算方式を変えて、ダークモードやコンパクトモードを扱える) ConfigProvider…antdのコンポーネントを扱えるようにする v4と異なる点はthemeを渡せるようになったこと ただし、注意点としてmessage.xxxやModal.xxxやnotification.xxxにはこれ らで設定したスタイルが適用されない。 => AppコンポーネントとApp.useAppを使う
CSS の書き方
基本の書き方 const useStyles = createStyles(({ token, css }) => {
return { button: css` padding: ${token.padding}px ` }; }); const TestButton: React.FC = observer(() => { const { styles, theme } = useStyles(); return ( <Button className={styles.button} /> ) }) 各コンポーネントファイルでcreateStyleを使って userStylesを定義。 コンポーネント内でuseStylesを使用して、stylesを取得して classNameに割り当てる。 userStylesの定義時にはなるべくtokenを使う。 https://ant.design/docs/react/customize-theme#api less時代の@padding-smがtoken.paddingSMに変更されたとい うイメージでOK。(less変数はdesign tokenへ) tokenを使うことで、ダークモードやコンパクトモードで余計なデザ イン調整を挟まずに済む。
less時代の :global (局所カスタマイズ)について less時代に:globalで指定してantdコンポーネントのクラス名を指定してオーバーライドしていた部分はそのまま指定したクラス内 で指定できるようになった。 以前のように「:globalを追加して...」という手間が減ったので、少しは楽になったかも。 .inactiveMenu { :global {
.ant-menu-item-icon { opacity: 0.4; } } } const useStyles = createStyles(({ token, css }) => { return { inactiveMenu: css` .ant-menu-item-icon { opacity: 0.4; } `, } } Before(SideMenu.module.less) After(SideMenu.tsx)
メディアクエリーや擬似要素の取り扱い CSSで指定できるメディアクエリや擬似要素については、 基本的にCSS Nesting Moduleを活用してuseStyles内部で定義したクラスの中で指定するようにしましょう。 const useStyles = createStyles(({ token,
css }) => { return { content: css` padding: 32px 48px; @media screen and (max-width: ${token.screenSMMax}px) { padding: 32px 0px; } ` }; }); .content { padding: 32px 48px; } @media screen and (max-width: @screen-sm-max) { .content { padding: 32px 0; } } CSS Nesting Moduleが使えるようになっていたのは最近だった。https://www.w3.org/TR/css-nesting-1/ https://developer.mozilla.org/en-US/docs/Web/CSS/Nesting_selector
つづき(擬似要素の例) .newDate { font-size: @font-size-sm; } .newDate::before { content: 'New';
margin-right: @margin-xs; color: @white; backgrounds: @primary-color; padding: 1px @padding-xss; font-style: italic; } const useStyles = createStyles(({ token, css }) => { return { newDate: css` font-size: ${token.fontSize}px; &::before { content: 'New'; margin-right: ${token.marginXS}px; color: ${token.colorWhite}; background: ${token.colorPrimary} !important; padding: 1px ${token.padding Spx; font-style: italic; } ` }; });
createStylesじゃなくてコンポーネント内でtokenを使う 場合によっては、classNameではなくコンポーネント内のstyleなどに直接スタイルを定義しに行く場合もあり得るので その場合はtheme.useTokenを使う。 import { theme, Typography } from 'antd';
const TestComponent: React.FC = observer(() => { const { token } = theme.useToken(); return ( <Typography.Text style={{ fontSize: token.fontSizeLG }}> Hello </Typography.Text> ); } 補足: useStylesからも const { styles, theme } = useStyles(); で抽出できるので、どちらがいいかはよくわかっていない...
移行における残課題
静的関数内での局所カスタマイズの方法は? message.xxxやModal.xxxやnotification.xxxなどでantdのクラス名を直接styleする指定方法がよくわからない... LwModal.confirm({ ... okButtonProps: { style: { width: '48%',
}, }, cancelButtonProps: { style: { width: '48%', }, }, style: ... //??? ... })
TypescriptとNext.jsの最新バージョンへの移行まとめ 今現在のバージョンに変更による影響についてどういう事象が起きているかをまとめておく。 ・Typescript v4 > v5への移行 babel(next/babel)でコンパイルすると、satisfiesを使おうとするとNext.jsでエラーが出てしまう。 対応策: babelの代わりにswcコンパイラを使う ・babelの設定を削除して、nextjsのswcコンパイラを使う
Mobxの挙動が変わる(クラスのプロパティがundefinedになる) 対応策: tsconfig.jsonのuseDefineForClassFieldsをtrueにする必要があった。 ・Next.js v13.4.7 > v13.5.3 受け渡すtokenがデフォルトのテーマのままでカスタムしたテーマのtokenが有効にならない ・package-lock.jsonを削除して、新たに再生成する クエリ文字列の渡し方で400エラーになる。(swrなどのapiクライアントの挙動が変わったみたい?)