Shadcn UI: 重新定义前端组件库的开源新星

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

Shadcn UI: 重新定义前端组件库的开源新星

各人好,我是蒜鸭。本日让我们来探讨一下近期在前端圈引起广泛关注的Shadcn UI。这个项目以其独特的设计理念和灵活的使用方式,正在寂静改变开辟者对UI组件库的认知。
什么是Shadcn UI?

Shadcn UI 是一个由开辟者 shadcn 创建的开源UI组件聚集,它基于 Radix UI 和 Tailwind CSS 构建。与传统的UI库差别,Shadcn UI 并不是一个你可以通过 npm 安装的包,而是一系列可以直接复制到你项目中的组件代码。
这种独特的方式带来了几个关键优势:

  • 高度可定制:你可以完全控制组件的代码,根据必要进行修改。
  • 零运行时开销:组件直接集成到你的代码库中,不会增加额外的依靠。
  • 学习代价:通过阅读和修改组件代码,你可以学习到最佳实践。
Shadcn UI 的焦点特性

1. 基于 Radix UI 的无停滞性

Shadcn UI 底层使用了 Radix UI 的原语组件,这意味着它继续了 Radix 优秀的可访问性特性。例如,考虑一个简朴的按钮组件:
  1. import * as React from "react"
  2. import { Slot } from "@radix-ui/react-slot"
  3. import { cva, type VariantProps } from "class-variance-authority"
  4. import { cn } from "@/lib/utils"
  5. const buttonVariants = cva(
  6.   "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
  7.   {
  8.     variants: {
  9.       variant: {
  10.         default: "bg-primary text-primary-foreground hover:bg-primary/90",
  11.         destructive:
  12.           "bg-destructive text-destructive-foreground hover:bg-destructive/90",
  13.         outline:
  14.           "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
  15.         secondary:
  16.           "bg-secondary text-secondary-foreground hover:bg-secondary/80",
  17.         ghost: "hover:bg-accent hover:text-accent-foreground",
  18.         link: "text-primary underline-offset-4 hover:underline",
  19.       },
  20.       size: {
  21.         default: "h-10 px-4 py-2",
  22.         sm: "h-9 rounded-md px-3",
  23.         lg: "h-11 rounded-md px-8",
  24.         icon: "h-10 w-10",
  25.       },
  26.     },
  27.     defaultVariants: {
  28.       variant: "default",
  29.       size: "default",
  30.     },
  31.   }
  32. )
  33. export interface ButtonProps
  34.   extends React.ButtonHTMLAttributes<HTMLButtonElement>,
  35.     VariantProps<typeof buttonVariants> {
  36.   asChild?: boolean
  37. }
  38. const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
  39.   ({ className, variant, size, asChild = false, ...props }, ref) => {
  40.     const Comp = asChild ? Slot : "button"
  41.     return (
  42.       <Comp
  43.         className={cn(buttonVariants({ variant, size, className }))}
  44.         ref={ref}
  45.         {...props}
  46.       />
  47.     )
  48.   }
  49. )
  50. Button.displayName = "Button"
  51. export { Button, buttonVariants }
复制代码
这个按钮组件不仅样式丰富,而且通过使用 Radix UI 的 Slot 组件,确保了良好的可访问性和键盘导航支持。
2. Tailwind CSS 的样式灵活性

Shadcn UI 充分使用了 Tailwind CSS 的强盛功能。通过使用 Tailwind 的工具类,开辟者可以轻松地自定义组件样式,而无需编写大量的 CSS。
例如,你可以如许使用和自定义按钮:
  1. <Button variant="outline" size="lg" className="px-8 py-3">
  2.   自定义大按钮
  3. </Button>
复制代码
这种方式允许你在保持组件一致性的同时,轻松应对各种设计需求。
3. 主题体系

Shadcn UI 提供了一个强盛的主题体系,允许你轻松地切换明暗模式,或创建完全自定义的主题。这是通过 Tailwind CSS 的配置实现的:
  1. // tailwind.config.js
  2. /** @type {import('tailwindcss').Config} */
  3. module.exports = {
  4.   darkMode: ["class"],
  5.   content: [
  6.     './pages/**/*.{ts,tsx}',
  7.     './components/**/*.{ts,tsx}',
  8.     './app/**/*.{ts,tsx}',
  9.     './src/**/*.{ts,tsx}',
  10.     ],
  11.   theme: {
  12.     container: {
  13.       center: true,
  14.       padding: "2rem",
  15.       screens: {
  16.         "2xl": "1400px",
  17.       },
  18.     },
  19.     extend: {
  20.       colors: {
  21.         border: "hsl(var(--border))",
  22.         input: "hsl(var(--input))",
  23.         ring: "hsl(var(--ring))",
  24.         background: "hsl(var(--background))",
  25.         foreground: "hsl(var(--foreground))",
  26.         primary: {
  27.           DEFAULT: "hsl(var(--primary))",
  28.           foreground: "hsl(var(--primary-foreground))",
  29.         },
  30.         secondary: {
  31.           DEFAULT: "hsl(var(--secondary))",
  32.           foreground: "hsl(var(--secondary-foreground))",
  33.         },
  34.         destructive: {
  35.           DEFAULT: "hsl(var(--destructive))",
  36.           foreground: "hsl(var(--destructive-foreground))",
  37.         },
  38.         muted: {
  39.           DEFAULT: "hsl(var(--muted))",
  40.           foreground: "hsl(var(--muted-foreground))",
  41.         },
  42.         accent: {
  43.           DEFAULT: "hsl(var(--accent))",
  44.           foreground: "hsl(var(--accent-foreground))",
  45.         },
  46.         popover: {
  47.           DEFAULT: "hsl(var(--popover))",
  48.           foreground: "hsl(var(--popover-foreground))",
  49.         },
  50.         card: {
  51.           DEFAULT: "hsl(var(--card))",
  52.           foreground: "hsl(var(--card-foreground))",
  53.         },
  54.       },
  55.       borderRadius: {
  56.         lg: "var(--radius)",
  57.         md: "calc(var(--radius) - 2px)",
  58.         sm: "calc(var(--radius) - 4px)",
  59.       },
  60.       keyframes: {
  61.         "accordion-down": {
  62.           from: { height: 0 },
  63.           to: { height: "var(--radix-accordion-content-height)" },
  64.         },
  65.         "accordion-up": {
  66.           from: { height: "var(--radix-accordion-content-height)" },
  67.           to: { height: 0 },
  68.         },
  69.       },
  70.       animation: {
  71.         "accordion-down": "accordion-down 0.2s ease-out",
  72.         "accordion-up": "accordion-up 0.2s ease-out",
  73.       },
  74.     },
  75.   },
  76.   plugins: [require("tailwindcss-animate")],
  77. }
复制代码
通过修改这个配置文件,你可以完全控制整个UI的表面,包罗颜色、字体、间距等。
Shadcn UI 的使用方法

使用 Shadcn UI 的过程非常直观:

  • 访问 Shadcn UI 的官方网站。
  • 浏览可用的组件。
  • 选择你必要的组件,点击 “Copy” 按钮。
  • 将代码粘贴到你的项目中。
  • 根据必要自定义组件。
这种方法的长处是你可以只使用你必要的组件,避免了不须要的代码膨胀。同时,你可以完全控制组件的行为和表面。
Shadcn UI vs 传统组件库

与像 Material-UI 或 Ant Design 如许的传统组件库相比,Shadcn UI 有以下优势:

  • 更小的包体积:你只必要复制你使用的组件。
  • 更高的可定制性:你可以直接修改组件源码。
  • 更好的学习体验:通过阅读和修改代码,你可以学习到最佳实践。
  • 没有版本兼容性问题:组件直接集成到你的代码库中。
然而,Shadcn UI 也有一些埋伏的缺点:

  • 必要更多的初始设置:你必要本身复制和管理组件代码。
  • 可能必要更多的维护工作:如果 Shadcn UI 更新了组件,你必要手动更新你的代码。
  • 不适合快速原型开辟:相比直接使用预构建的组件库,可能必要更多的初始工作。
Shadcn UI 的最佳实践


  • 组件化:只管 Shadcn UI 提供了组件代码,但你仍然应该将这些组件封装到你本身的组件中。如许可以更好地控制和管理你的UI。
  • 主题定制:充分使用 Shadcn UI 的主题体系,创建符合你项目需求的自定义主题。
  • 保持更新:定期检查 Shadcn UI 的更新,以获取新的功能和性能改进。
  • 代码复用:对于常用的自定义修改,考虑创建你本身的工具函数或高阶组件。
  • 文档化:为你修改过的组件编写文档,这对团队协作很有资助。
Shadcn UI 的将来展望

随着前端开辟的不停发展,Shadcn UI 这种”复制粘贴”的组件库模式可能会成为一种新趋势。它为开辟者提供了更多的控制权和学习机会,同时保持了高度的灵活性。
然而,这种方法也带来了新的挑战,如怎样管理和更新这些组件。将来,我们可能会看到更多的工具和最佳实践来办理这些问题。
Shadcn UI 的成功也可能影响其他UI库的发展方向。我们可能会看到更多的库开始提供”复制粘贴”的选项,或者更加注重可定制性和透明度。
总结

Shadcn UI 通过其独特的”复制粘贴”方法,为前端开辟提供了一种新的UI组件使用范式。它结合了 Radix UI 的可访问性、Tailwind CSS 的灵活性,以及直接控制源码的优势,为开辟者提供了一种强盛而灵活的UI办理方案。只管这种方法可能不适合所有项目,但它无疑为前端开辟提供了一个有趣的新选择,值得所有开辟者关注和尝试。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表