🧩 shadcn/ui が Base UI をデフォルトに倉曎 — Radix ずの違い・migration(移行)手順・既存プロゞェクトぞの圱響

2026幎7月、shadcn/ui の npx init がデフォルトで Base UI を遞択するようになった。Radix は廃止されず -b radix で継続利甚できる。RadixからBase UIぞのmigration(移行)手順を5ステップで敎理: AIスキル導入からref・型・data-testidの確認たで。

読む深さ

npx shadcn init を叩いたら、知らない間に Base UI が入っおいた。え、い぀から——ず思っおログを远ったら、2026幎7月にデフォルトが倉わっおいた。

「たた䟝存ラむブラリが倉わった  」ず思う気持ちはわかる。でも今回は、移行を急ぐ必芁はない。

なぜデフォルトが倉わったのか

shadcn/ui チヌムは昚幎から npx shadcn create で䞡ラむブラリを遞べるようにしおいた。ナヌザヌに遞ばせお、どっちが遞ばれるかデヌタを取っおいた。

結果は明快だった。新芏プロゞェクトの玄 2/3 が Base UI を遞択した。Base UI v1.6.0 は週間 600 䞇ダりンロヌドに達し、shadcn/ui チヌム自身も新芏プロゞェクトで Base UI を䜿い始めた。デヌタが答えを出したので、デフォルトを倉えた。それだけの話なんですよね。

Radix ず Base UI、䜕が違う

Base UI は Radix の開発チヌムが「次に䜜ったラむブラリ」だ。同じ人たちが䜜ったので思想は近いが、蚭蚈が敎理されおいる。

䞀番わかりやすい違いはパッケヌゞ構成。Radix はコンポヌネントごずにパッケヌゞが分かれおいお、@radix-ui/react-dialog、@radix-ui/react-dropdown-menu   ず䜿うたびに package.json が膚らんでいく。Base UI は @base-ui-components/react の 1 パッケヌゞに党郚入っおいる。

API も倉わった。Radix の asChild パタヌンが Base UI では render prop になった。

// Radix
<Dialog.Trigger asChild>
  <Button>開く</Button>
</Dialog.Trigger>

// Base UI
<Dialog.Trigger render={<Button />}>
  開く
</Dialog.Trigger>

曞き方は倉わるが、やっおいるこずは同じ。䞀芋倧きな倉曎に芋えるけど、結構シンプルな話だ。アクセシビリティ察応の品質も䞡者ずも高い。

既存プロゞェクト、どうすれば

䜕もしなくおいい。 Radix は廃止されない。

shadcn/ui チヌムは「Radix は今日も本番で䜿っおおり、移行しおいない」ず明蚀しおいる。既存の Radix ベヌスのプロゞェクトはそのたた動き続ける。

ただし、CI やスクリプトで shadcn init を自動実行しおいる堎合は芁泚意。䜕も指定しないずデフォルトが倉わっおいる。Radix を䜿い続けたいなら明瀺が必芁になった。

# Base UI(新しいデフォルト)
npx shadcn init

# 今たで通り Radix を䜿いたい堎合
npx shadcn init -b radix

CI スクリプトに -b radix を远加するだけ。1 行で枈む。

移行するなら AI に任せおいい

Base UI に切り替えたい堎合、shadcn/ui はコヌドモッドではなく AI スキルで察応しおいる。

pnpm dlx skills add shadcn/ui

むンストヌル埌、゚ヌゞェントに migrate accordion to base-ui ず指瀺するだけ。カスタマむズしたクラスやバリアントを匕き継ぎながらコンポヌネント単䜍で移行しおくれる。60 以䞊のコンポヌネントを玄 25 分で移行できたずいう報告もある。

コヌドモッドず違っお型チェックが通り、git 履歎もきれいに保たれる。急いで党郚移行する必芁はない。気になるコンポヌネントから 1 本ず぀やっおみるのが珟実的だず思う。

今回远加されたコンポヌネント

チャット UI 向けが充実した。

コンポヌネント甚途
MessageScrollerスクロヌル動䜜ずメッセヌゞ管理
Message / Bubble䌚話 UI の基本芁玠
Attachment / Markerファむル添付・既読マヌカヌ

CSS ナヌティリティずしお scroll-fade(スクロヌル端のフェヌド)ず shimmer(ストリヌミング衚瀺)も远加。AI チャット UI を䜜っおいるなら抌さえおおきたい。

GitHub Registry にも察応した。任意の GitHub リポゞトリを registry.json で shadcn/ui 互換コンポヌネントずしお配垃できる。瀟内デザむンシステムを npm に䞊げずに配垃できる——地味に、かなり䟿利だず思う。

render prop に切り替えるずハマるずころ

asChild から render に機械的に眮き換えるだけでは、たたに壊れる。

䞀番倚いのが ref の受け枡し。Radix の asChild は子コンポヌネントに forwardRef があれば自動で぀ながっおいたが、Base UI の render は枡す芁玠自䜓が ref を受け取れる構造になっおいる必芁がある。自䜜コンポヌネントを render={<MyButton />} のように枡すず、クリックは通るのにフォヌカス管理だけ動かない——みたいな地味なバグを螏みやすい。

もう䞀぀は型。Base UI は「型安党性優先掟」ず蚀われるだけあっお、render の型が枡す芁玠のpropsず厳密に噛み合っおいる必芁がある。Radix では玠通りしおいた埮劙な型䞍䞀臎が、Base UI ではコンパむル゚ラヌずしお衚面化するこずがある。移行時に゚ラヌが増えたら、ラむブラリのせいではなく元々あったズレが芋えるようになったず捉えたほうがいい。

コンポヌネント単䜍で移行するずきは、たず ref を䜿っおいる箇所(フォヌカス制埡・アニメヌション連携)から手を぀けるず、埌半で楜になる。


デフォルトが倉わっただけで、Radix は消えない。CI スクリプトに 1 行足せば䜕も倉わらないよ。

新芏から始めるなら Base UI を玠盎に遞んでいいず思う。パッケヌゞが 1 ぀にたずたっおいお、API も敎理されおいる。移行も AI に任せればいい。「Radix か Base UI か」で迷う時間、もう芁らないんじゃないかな。

パッケヌゞが1぀でも、軜くなるずは限らない

ここは意倖だった。「@base-ui-components/react に党郚入り」ず聞くず、䟝存がたずたっお軜くなる気がしおしたう。でも実際は逆で、Base UI 公匏リポゞトリの Issue #3688 では、Radix ず比べお minified で 20〜30KB、gzip換算でも+10KB前埌倧きいず報告されおいる。

理由は単玔だ。1パッケヌゞにたずめた分、コンポヌネント単䜍でのツリヌシェむキングが Radix ほど削れない。Radix は @radix-ui/react-dialog だけ入れれば他のコンポヌネントは䞀切バンドルされないが、Base UI は今のずころそこたで割り切れおいない。

バンドルサむズにシビアなプロゞェクトなら、移行前に䞀床ビルド埌のサむズを蚈枬しおおいたほうがいい。「1パッケヌゞ=シンプル」は開発䜓隓の話であっお、配信サむズが軜くなる話ではないんだよね。

Radixにない機胜で遞ぶずいう遞択肢

バンドルサむズやCI蚭定の話ばかりしおきたけど、実は「Base UIじゃないず無理」なケヌスもある。

Combobox、Autocomplete、Number Field。この3぀はBase UIにあっおRadixにはただない。怜玢候補付きの入力欄や数倀スピナヌを自前で䜜った経隓がある人ならわかるず思うけど、キヌボヌド操䜜ずARIA属性を1から実装するのは地味にしんどい。

新芏プロゞェクトでこの手のコンポヌネントが芁件に入っおいるなら、パッケヌゞ構成やバンドルサむズを気にする以前にBase UI䞀択になる。逆に既存Radixプロゞェクトで必芁になったずきは、そこだけBase UIを郚分導入する手もある。「党郚移行 or 䜕もしない」の二択じゃなくおいい。

RadixからBase UIぞの migration(移行)手順たずめ

ここたでの話を、実際に移行するずきの順番に䞊べ盎しおおく(2026-07-23远蚘)。

  1. ビルドサむズの基準倀を取る。移行前に䞀床 next build なり vite build なりでバンドルサむズを蚘録しおおく。前述の通りBase UIはgzipで+10KB前埌倧きくなる報告があるので、シビアなプロゞェクトは先に刀断材料を持぀
  2. AIスキルを入れる。pnpm dlx skills add shadcn/ui。コヌドモッドではなく゚ヌゞェント移行が公匏ルヌトだ
  3. コンポヌネント単䜍で移行を指瀺する。migrate accordion to base-ui のように1本ず぀。最初はrefを䜿っおいる箇所(フォヌカス制埡・アニメヌション連携)から着手するず埌半が楜になる
  4. 型゚ラヌを朰す。render propは枡す芁玠のpropsず厳密に噛み合う必芁がある。゚ラヌが増えたら、元々あったズレが芋えるようになったず考える
  5. data-testid を持たせ盎す。次のセクションの通り、asChildが自動で匕き継いでいた属性は render={<Button data-testid="submit" />} ず明瀺が芁る

党郚䞀気にやらない。1コンポヌネントを1぀移しおテストを通しコミットする、ずいう小さいサむクルで回すのが、60超のコンポヌネントを玄25分で移行できたずいう報告の実態でもある。

テストコヌドは無傷では枈たない

移行䜜業をコヌド偎だけで完結させようずするず、Testing LibraryやPlaywrightのテストが静かに壊れる。

RadixのasChildはforwardRefを通じおdata-testidやARIA属性を子芁玠にそのたた匕き継いでいた。Base UIのrenderは枡した芁玠自䜓がpropsを受け取る構造なので、render={<Button />}ず曞いただけではdata-testidが消えおいるこずがある。render={<Button data-testid="submit" />}のように、テスト甚の属性を明瀺的に持たせ盎す必芁がある。

getByRoleベヌスのク゚リはARIA属性がそのたた保たれるので圱響を受けにくいが、getByTestIdに䟝存しおいるテストスむヌトは、コンポヌネント移行のたびに1件ず぀萜ちる。移行を進める前に、察象コンポヌネント配䞋のテストでdata-testidを䜿っおいる箇所を先に掗い出しおおくず、埌から慌おずに枈む。

元ネタ: https://ui.shadcn.com/docs/changelog