最近要给一个小项目搭后台管理系统,对比了一圈方案——Ant Design Pro 太重了,用 ElementUI 又想换个口味。刷推看到好多人在安利 shadcn/ui,说它不是传统的组件库,而是直接把源码复制到你项目里,想怎么改就怎么改。正好最近在写 Next.js,就试着搭了一个。
1. shadcn/ui 到底是什么
先说它跟 Ant Design、ElementUI 这类组件库最大的区别:它不是一个 npm 包。
你不会在 package.json 里看到 "shadcn-ui": "x.x.x" 这种依赖。它的工作方式是通过 CLI 把你选的组件源代码直接拷贝到你项目的 components/ui/ 目录下。
好处是:
- 完全可以自定义,改源码不会被升级覆盖
- 按需添加,不加的组件不存在于项目里
- 底层基于 Radix UI(无障碍做得很好)+ Tailwind CSS
坏处是:
- 跟传统组件库比,没有”升级版本自动修bug”这回事
- 需要你自己维护这些组件代码
2. 搭建过程
初始化 Next.js 项目
1 | npx create-next-app@latest admin-dashboard --typescript --tailwind --eslint --app --src-dir |
初始化 shadcn/ui
1 | npx shadcn-ui@latest init |
它会问你几个问题,比如用什么样式、颜色主题、CSS 变量等等。我一般选默认就行。
初始化完成后会生成:
components.json— 配置文件lib/utils.ts— 一个cn()工具函数(合并 Tailwind 类名用的)
添加需要的组件
1 | # 按需加,不是一次全装 |
每执行一个,它就往 components/ui/ 下面放一个组件文件。打开看就是普通的 React 组件代码,想改随便改。
3. 搭后台布局
侧边栏 + 顶栏 + 内容区
1 | // app/layout.tsx |
数据表格页
1 | // app/users/page.tsx |
弹窗表单
1 | import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" |
4. 深色模式
shadcn/ui 天然支持深色模式,加个 theme provider 就行:
1 | npm install next-themes |
1 | // components/theme-provider.tsx |
切换按钮:
1 | "use client" |
深色模式下的样式效果直接就出来了,因为 Tailwind 的 dark: 前缀在 shadcn/ui 组件里都写好了。
5. 使用感受
优点:
- 代码在自己手里,改什么都行
- 样式统一好看,深色模式几乎零成本
- 跟 Next.js + Tailwind 配合堪称完美
- 组件质量高,Radix UI 底层的无障碍支持很好
缺点:
- 功能不如 Ant Design 丰富(比如没有高级表格组件:排序、筛选、分页要自己搞或者用 TanStack Table)
- 没有统一升级机制,组件有 bug 得自己去 GitHub 看改了没
- 深度绑定 Tailwind CSS,如果项目不用 Tailwind 就没法用
总的来说,如果你的技术栈是 Next.js + Tailwind + TypeScript,shadcn/ui 基本是目前最舒服的选择。做中小型的后台系统完全够用了。
评论加载中…