Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Antd v5移行について

Avatar for matsuzakk matsuzakk
September 28, 2023

Antd v5移行について

Avatar for matsuzakk

matsuzakk

September 28, 2023
Tweet

More Decks by matsuzakk

Other Decks in Technology

Transcript

  1. 補足: 一般的なCSS-in-JSのメリット・デメリット メリット ・ダイナミックなスタイリング ・Javascriptの開発体験の向上 ・コンポーネントに閉じたスタイル ・スタイル変更の自由度 ・CSSの静的解析(クラス名指定間違いが減る ) デメリット

    ・パフォーマンス  (ライブラリによるstyle生成とブラウザ解析の  二 重解析) ・可読性が悪い ・クラス名がハッシュ化されて読めない ・スタイル記法がライブラリに依存する
  2. 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を使う
  3. 基本の書き方 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を使うことで、ダークモードやコンパクトモードで余計なデザ イン調整を挟まずに済む。
  4. メディアクエリーや擬似要素の取り扱い 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
  5. つづき(擬似要素の例) .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; } ` }; });
  6. 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(); で抽出できるので、どちらがいいかはよくわかっていない...
  7. 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クライアントの挙動が変わったみたい?)