2026 年 9 月 - cn
すべての 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 か所にまとまります。
export { cn } from "cn"既存のプロジェクト
何も壊れません。lib/utils.ts はそのまま動作し続け、新しくインストールするコンポーネントはその隣に cn をインストールします。プロジェクトの残りの部分も移行したい場合は、clsx と tailwind-merge を削除して、マイグレーションを実行してください。
インポートを書き換え、twMerge(clsx(...)) の呼び出しを置き換え、古いパッケージを参照するコードがなくなれば、それらのパッケージも削除します。詳細については、CLI ドキュメント を参照してください。