[Frontend] shadcnui: 新一代组件库解决方案
https://risingstars.js.org/2024/en
2024 年最流行,最火热的项目排名
shadcnui:This is NOT a component library. It's a collection of re-usable components that you can copy and paste into your apps.
提供的是组件代码片段,你可以将这些组件代码片段粘贴到你的项目里面。
对比传统组件库
antd:
- 样式难以重置
- 需要等到官方维护
- 历史包袱重
- react-hooks-form
- @tanstack/react-table
- framer-motion
- embla-carousel
使用 shadcnui 时,你可以直接复制组件的源码到你的项目中,或者采用官网的 cli 工具:
npx shadcn-ui add [component]
例如
npx shadcn-ui add alert-dialog
这意味着在你的项目里面的 package.json 中,不存在 shadcnui 的依赖。
shadcnui 的核心有两大块:
- RadixUI:headlessUI,解决逻辑层问题,提供的每个组件逻辑是完善的,但是没有任何样式。
- tailwindcss:原子类 css 库
如果基于 Vite 来使用 shadcnui,还会涉及到安装 postcss、autoprefixer.
工具链核心模块
tailwindcss
这是一个原子类的 css 库,也是当年(2019年)最火的项目。一句话概括,那就是将常用的样式声明写成了类的形式,之后基本不用再写单独的样式声明,只需要在 html 标签上挂类就好了。
bootstrap、bulma 一类的 css 库
tailwindcss优点:可定制性高
tailwindcss缺点:上手需要时间
思考🤔:为什么现在流行这种 css 解决方案?
- 不用来回切换位置
- 和现代前端框架的流行有关系,现代前端框架都是使用状态来驱动视图,期望使用状态控制一切
<template>
<div id="app">
<div :class="test">xxx</div>
</div>
</template>
<script>
export default {
data(){
return {
test: {
abc: true,
def: true,
ghi: false
}
}
}
}
</script>
另外一个 css 原子类库可以关注一下,就是 unocss. 这是由 Vite 团队成员所推出的原子类 css 库。相比 tailwindcss 有这么一些特点:
-
按需生成
-
极具灵活性: unocss 对自己的定位是一个 css 引擎而非一个框架
import UnocssPlugin from '@unocss/vite' import PresetTachyons from '@unocss/preset-tachyons' import PresetBootstrap from '@unocss/preset-bootstrap' import PresetTailwind from '@unocss/preset-tailwind' import PresetWindi from '@unocss/preset-windi' import PresetAntfu from '@antfu/oh-my-cool-unocss-preset' export default { plugins: [ UnocssPlugin({ presets: [ // PresetTachyons, PresetBootstrap, // PresetTailwind, // PresetWindi, // PresetAntfu // 选择其中一个...或多个! ] }) ] }
-
简化类名属性
<button class="bg-blue-400 hover:bg-blue-500 text-sm text-white font-mono font-light py-2 px-4 rounded border-2 border-blue-200 dark:bg-blue-500 dark:hover:bg-blue-600">点击</button>
<button bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600" text="sm white" font="mono light" p="y-2 x-4" border="2 rounded blue-200"> 点击 </button>
postcss
这是一个 css 后处理器平台。
思考🤔:什么叫做后处理?
就是对 css 代码做一些收尾工作
- 添加浏览器前缀
- 压缩
- 语法降级
- ......
autoprefixer、px2rem、cssnano 以插件的形式安装到 postcss 里面
关注:lightingcss 是 postcss 的一种锈化(rustification)产品
- postcss → lightingcss
- babel → swc
- webpack → turpopack、rspack
- electron → tauri
RadixUI
RadixUI 是属于 HeadlessUI 的一种。所谓 HeadlessUI,指的是将用户界面(UI)的逻辑与显示层(视图层)解耦的组件库或工具。这类工具通常只提供功能逻辑和无样式的原始 html 结构,而不包含具体的视觉样式,让开发者可以完全自由地定制外观。
特点:
- 无样式
- 高可定制性
- 专注于功能逻辑
常见的 HeadlessUI 有:
- Headless UI :tailwind labs 推出的
- RadixUI
shadcnui快速上手
目前 shadcnui 对 React 生态更加友好,所以你看到 官网 的安装指南更多是聚焦于 React 生态的框架,例如 Next.js、Remix
我们选择 Vite 来搭建项目。跟着 官方文档 进行项目搭建即可。
storybook
Storybook 能够提供一个可交互的组件文档,不仅如此,还可以结合测试工具,运行快照测试和交互测试。
Storybook核心功能
- 组件环境: 和应用环境是隔离开的,专注于单个组件的开发和测试
- 文档化
- 交互式测试
- 插件生态
- 多框架支持:React、Vue、Angular、Svelte....
安装 storybook
npx storybook@latest init
安装后会在 src 目录下生成一个 stories 的目录,里面默认有 button、header 和 page 这三个组件,这是 storybook 提供的 3 个示例组件,方便开发人员快速上手。另外还会启动一个本地服务器,端口号 6006,打开之后就能看到这 3 个示例组件的各种演示。