GitHub - https://github.com/shadcn-ui/ui
Shadcn UI 是基於 Tailwind CSS 底層封裝 Radix UI 的 React UI 元件集合,能夠支援 Next.js, Astro, Remix, Gatsby 等框架。
shadcn-ui/ui 專案於 2023 年 1 月發布到 GitHub,截至目前(2024 年 7 月)已有超過 65K 星星數,榮登 2023 JavaScript Rising Stars 榜首。
之所以能夠成為炙手可熱的開源專案,如 Shadcn 官方文件介紹所述:
Beautifully designed components that you can copy and paste into your apps. Accessible. Customizable. Open Source. (您可以複製貼上設計精美的元件至應用程式中。無障礙、可客製化且開源。)
Shadcn UI 並不是一個 component library(元件庫),而是可重用元件的「集合」。換言之,Shadcn UI 並不會以 dependency 的形式出現在 pacakge.json
,使用者可以直接把原始碼複製貼上到專案中,也能自行修改客製化。
Shadcn UI 在前端生態圈崛起的原因,可從過去我們所熟悉的 UI Framework,如 Bootstrap, Meterial UI, Ant Design 等說起。
透過元件庫提供的預設元件進行開發,就不需要從零開始造輪子,能夠統一介面樣式並實現 RWD 等需求,然而在實際使用元件庫時,會發現在客製化上有一定限制,經常會為了改一小部分樣式,而透過 !important
、:deep
等「魔改」的方式,來達到自訂義樣式需求,如此不只增加程式碼的複雜性,也不易後續維護使用。
如上所述,Shadcn UI 具備的種種特性,提供現有的元件庫解決方案,其優點如下:
shadcn-ui
引入使用詳細步驟可參考官方文件,本篇以 Next.js 專案為例:
creat-next-app
指令建置 Next.js 專案shadcn-ui
初始專案components.json
做調整建立好的 Next.js 專案架構可參考如下,其中引入的 Shadcn 元件會放在 compoent/ui
資料夾底下:
tailwind.config.js
調整設定檔 theme.extend.fontFamily
,即可根據需求自定義樣式安裝好的元件路徑會在 components 底下:@components/ui/button
components/ui/button.tsx
檔案中新增自訂義樣式 newButton
,即可在頁面使用結果如下:
由於 Shadcn UI 所有元件已內建 Dark Mode 樣式設定,因此只需搭配 Themes 來實作,而 Next.js 可搭配 next-themes
套件,詳細可參考 Dark mode 官網範例:
next-themes
next-themes
中的 ThemeProvider 來管理主題樣式:components/theme-provider.tsx
radix-ui/react-icons
引入 icon 使用use client
才能引入 useTheme
hook 使用效果如下:
前陣子在開發 Next.js 專案時,是搭配使用 material-ui 這套 UI Framework,卻意外發現在過程中遇到許多痛點:
因此藉此機會來研究 Shadcn UI,希望能改善開發上遇到的問題,後續再根據專案需求來導入合適的方案,畢竟任何工具沒有絕對好壞,而是根據使用情境來評估是否導入使用。