MUI v4 から v5 の移行に役立つツール codemods

こんにちは、 Gaji-Labo アシスタントエンジニアの石垣です。

今回は、 React + MUI のプロジェクトで、 MUI のバージョンを4から5へアップグレードする時に使える移行支援ツール(codemods)をご紹介します。

codemods について

MUI のバージョン5は2021年9月に正式リリースされましたが、その際に多くの破壊的な変更が行われました。詳しくは弊社ブログで以前書いた記事もご覧ください。

そのため、アップグレードには import の置き換えや props の変更など、コンポーネントのコードを書き換える必要があります。しかし、この作業を1つ1つ行うのはコストがかかります。

そこでそういった作業の手間を軽減するために、公式の移行ツール( codemods と呼ばれています)が用意されています。これは、 v5 用にコードを自動的に最適化するもので、少ない労力で移行することができます。

多くの codemod がありますが(全ての codemods のリストは https://github.com/mui/material-ui/blob/master/packages/mui-codemod/README.md に記載されています)、 v4から v5 への移行では、preset-safe という codemod を使うことでほとんどの移行作業に対応が可能です。

preset-safe を使う

preset-safe はいくつかの codemod をバンドルしたものです。含まれる codemods は公式リストに記載されています。

https://github.com/mui/material-ui/blob/master/packages/mui-codemod/README.md#-preset-safe

以下のように使用します。

$ npx @mui/codemod v5.0.0/preset-safe <path|folder>

この codemods は、 import や deprecated な props など、 v5 への移行に必要なほとんど書き換えを自動的に適用してくれます。

preset-safe に含まれない v5 への移行用 codemods

上記の preset-safe には含まれていない codemods もいくつかあるため紹介します。

component-rename-prop

コンポーネントの props をリネームするための codemod です。

npx @mui/codemod v5.0.0/component-rename-prop <path> -- --component=Grid --from=prop --to=newProp

date-pickers-moved-to-x

Date Picker コンポーネントのインポートを @mui/lab から @mui/x-date-pickers @mui/x-date-pickers-pro に置き換える codemod です。

npx @mui/codemod v5.0.0/date-pickers-moved-to-x <path>

jss-to-styled

makeStyles と withStyles で記述された JSS を styled API で置き換える codemod です。

以前の記事でもご紹介しましたが、 v5 では makeStyles と withStyles は非推奨となり、代わりに styled API が使われるようになりました。

preset-safe に含まれない codemod の中で最も使用頻度の高いものだと思います

npx @mui/codemod v5.0.0/jss-to-styled <path>

jss-to-tss-react

makeStyles と withStyles で記述された JSS を tss-react API で置き換える codemod です。

TSS は MUI と統合された TypeScript のスタイル記法で、 makeStyles や withStyles の記法をそのまま扱えるため、同じ記法を使い続けたい場合にお勧めの選択肢です。

npx @mui/codemod v5.0.0/jss-to-tss-react <path>

link-underline-hover

Linkコンポーネントに underline="hover" を追加します。
v5 のデフォルトの underline prop は always(常に表示)なので、 v4 と同じ表示にしたい場合はこちらを適用します。

npx @mui/codemod v5.0.0/link-underline-hover <path>

optimal-imports

import を以下のように変更します。

-import red from '@material-ui/core/colors/red';
-import createTheme from '@material-ui/core/styles/createTheme';
+import { red } from '@material-ui/core/colors';
+import { createTheme } from '@material-ui/core/styles';
npx @mui/codemod v5.0.0/optimal-imports <path>

top-level-imports

サブモジュールから import されるコンポーネントを、ルートから import するように変更します。

-import List from '@mui/material/List';
-import Grid from '@mui/material/Grid';
+import { List, Grid } from '@mui/material';
npx @mui/codemod v5.0.0/top-level-imports <path>

variant-prop

TextField, Select, FormControl コンポーネントに、variant prop が渡されていない場合に variant="standard" を追加します。こちらも v4 と同じ見た目にする際に必要な codemod です。

npx @mui/codemod v5.0.0/variant-prop <path>

おわりに

今回は、 React + MUI のプロジェクトで、MUI のバージョンを4から5へアップグレードする時に使える移行支援ツール(codemods)をご紹介しました。

最終的な移行作業は一つ一つの確認が必要ですが、今回ご紹介したようなツールをうまく活用することで作業コストを削減していきたいですね。

Gaji-Laboでは、React経験が豊富なフロントエンドエンジニアを募集しています

弊社ではReactの知見で事業作りに貢献したいフロントエンドエンジニアを募集しています。大きな制作会社や事業会社とはひと味もふた味も違うGaji-Laboを味わいに来ませんか?

もちろん、一緒にお仕事をしてくださるパートナーさんも随時募集中です。まずはお気軽に声をかけてください。お仕事お問い合わせや採用への応募、共に大歓迎です!

求人応募してみる!

投稿者 Ishigaki Shotaro

アシスタントエンジニアとしてHTML/CSS/JavaScriptの実装やRailsの組み込み、スタイルガイドの構築などを担当しています。 業務の中でさまざまな学びを吸収しながら、文書構造やアクセシビリティに目を向けたマークアップの学習やJavaScriptの学習などを行っています。チームに貢献できるエンジニアとなるために日々奮闘中です。