125k

2026 年 9 月 - cn

コンポーネントは cn パッケージから cn をインポートするようになりました。依存関係は 2 つではなく 1 つになり、維持するローカル ヘルパーは必要ありません。

すべての shadcn コンポーネントは、cn パッケージから cn をインポートするようになりました。

何年もの間、すべての shadcn プロジェクトは lib/utils.ts の同じ 5 行から始まっていました。clsx をインポートし、twMerge をインポートし、一方をもう一方でラップして cn としてエクスポートする、というものです。それでも動作はしましたが、2 つの依存関係とヘルパー関数を、すべてのプロジェクトとレジストリにコピーする必要があるということでもありました。

そこでこれをパッケージに切り出しました。cn は twMerge(clsx(...)) のドロップイン代替品です。より小さく、より高速で、同じ API のまま提供されるため、呼び出し側のコードは何も変更する必要がありません。

import { cn } from "cn"
 
;<div className={cn("flex items-center", className)} />

何が変わったのか

  • レジストリ コンポーネント、ブロック、例では、@/lib/utils の代わりに cn パッケージから cn をインポートするようになりました。
  • npx shadcn init は、cn をインストールし、一行の lib/utils.ts を生成します。
  • cn を使用するすべてのレジストリ アイテムは、これを依存関係として宣言しています。この変更より前に作成されたプロジェクトでも、npx shadcn add を実行すればインストールされます。

lib/utils.ts

utils レジストリ アイテムは今も存在します。これからは cn を再エクスポートするだけになるので、独自のコードはそのまま動作し続け、プロジェクト固有のヘルパーを置く場所も 1 か所にまとまります。

lib/utils.ts
export { cn } from "cn"

既存のプロジェクト

何も壊れません。lib/utils.ts はそのまま動作し続け、新しくインストールするコンポーネントはその隣に cn をインストールします。プロジェクトの残りの部分も移行したい場合は、clsx と tailwind-merge を削除して、マイグレーションを実行してください。

pnpm dlx shadcn@latest migrate cn

インポートを書き換え、twMerge(clsx(...)) の呼び出しを置き換え、古いパッケージを参照するコードがなくなれば、それらのパッケージも削除します。詳細については、CLI ドキュメント を参照してください。