WangShuXian6 / blog

FE-BLOG
https://wangshuxian6.github.io/blog/
MIT License
46 stars 10 forks source link

构建并发布React UI组件库到NPM / Build and Publish React UI Component Library to NPM #201

Open WangShuXian6 opened 1 month ago

WangShuXian6 commented 1 month ago

构建并发布React UI组件库到NPM / Build and Publish React UI Component Library to NPM


课程大纲:

1 - 宣传与演示

2 - 介绍

3 - 配置 Rollup 并将库发布到 npm

4 - 测试与升级

5 - 添加 Tailwind CSS

6 - 增强按钮组件

7 - Storybook

8 - 输入框 (Input)

9 - 主题提供器

10 - 选择框 (Select)

11 - 单选框 (Radio)

12 - 开关 (Switch)

13 - 模态框 (Modal)

14 - 标签页 (Tabs)

15 - 警告框 (Alert)

16 - 加载动画 (Spinner)

17 - 弹性容器 (Flex Container)

18 - 文档编写与部署


这个大纲带你从项目设置和创建第一个组件开始,一步步指导如何发布到 npm、为库编写 story 并测试、添加 Tailwind CSS 和部署最终文档,让你能够顺利完成一个完整的 UI 组件库开发项目。


1 - Promo & Demo 1 -Course promo 2 -UI Component library demo

2 - Introduction 1 -Project setup 2 -Create first component

3 - Setup rollup and publish library in npm 1 -What is rollup 2 -Rollup installation 3 -Create rollup config 4 -Build with rollup 5 -Publish to npm

4 - Testing and upgrading 1 -Test published library 2 -Upgrade published library 3 -Testing library without re-publish

5 - Adding tailwind css 1 -Add pure css and build 2 -Add tailwind css and build 3 -Add classnames library for conditional classes

6 - Enhance button component 1 -Add size and border radius props 2 -Add icon prop

7 - Storybook 1 -Storybook intro 2 -Learn what is story and how to write 3 -Write story for button component - part 1 4 -Write story for button component - part 2 5 -Write story for button component - part 3

8 - Input 1 -Input component 2 -Input stories

9 - Theme provider 1 -Create theme provider wrapper 2 -Testing theme provider

10 - Select 1 -Create select component 2 -Select component stories - part 1 3 -Select component stories - part 2 4 -Select component stories - part 3

11 - Radio 1 -Create radio component 2 -Radio component stories - part 1 3 -Radio component stories - part 3

12 - Switch 1 -Create switch component 2 -Switch component stories

13 - Modal 1 -Create modal component 2 -Modal stories and UI

14 - Tabs 1 -Tabs component 2 -Tabs component UI and stories - part 1 3 -Tabs component UI and stories - part 2

15 - Alert 1 -Alert component 2 -Alert component stories - part 1 3 -Alert component stories - part 2

16 - Spinner 1 -Spinner component 2 -Spinner component stories

17 - Flex container 1 -Flex container component 2 -Flex container stories

18 - Documentation and deployment 1 -Add documentation to stories 2 -Deploy storybook app to chromatic

WangShuXian6 commented 1 month ago

1 - 宣传与演示

1.1 - 课程宣传视频

你好,欢迎你加入课程!

你是否曾在网页开发中想过创建自己的 UI 组件库?如果你的答案是肯定的,那么你来对地方了。欢迎参加“构建和发布 React UI 组件库到 NPM”的课程。

在演示组件库之前,我会先介绍项目的技术栈和学习曲线。开发组件其实并不复杂,只要你具备 HTML、CSS 和 React 的基础知识,就可以轻松开发这些组件。然而,更具挑战的是将其发布到 NPM、维护它并将其与 Storybook 集成。所以如果你想掌握所有这些内容,就需要全面了解项目的技术栈和学习曲线。

我将这个项目的学习过程分为六个阶段,每个阶段都介绍不同的技术。现在让我们从第一阶段开始吧!

1.2 - UI 组件库演示

大家好,现在我们进入我的 Storybook 应用程序,这里包含了所有组件。在详细介绍这些组件之前,先给大家看看 npm 库。

我们进入 npm,搜索 satya ui react。可以看到,这就是我开发的库。在页面中,我们可以看到 satya ui react 的详细信息。目前已经发布了三个版本,并显示了 npm 的安装命令。在这里我每周有 34 次下载量,展示了我的项目代码库。

接下来,我们回到 Storybook,看一下所有组件。可以看到,我们有 10 个 UI 组件和一个主题提供器。组件包括:Alert(警告)、Button(按钮)、Flex Container(弹性容器)、Input(输入)、Modal(模态框)、Radio(单选按钮)、Select(选择)、Spinner(加载动画)、Switch(开关)和 Tabs(选项卡)。

首先来看 Alert 组件。点击后,你可以看到所有变体:信息、成功、错误、警告、不带图标的、可关闭的。页面顶部有文档,可以在简单的文档页中查看所有变体。可以看到:信息(蓝色背景)、成功(绿色背景)、错误、警告、不带图标、可关闭。如果点击关闭按钮,组件会关闭。

然后是 Button 组件。可以看到这是所有的属性和可用选项:按钮、轮廓、小号、中号、大号、禁用、圆角、边框半径、带图标、加载状态。如果想单独查看某个变体,可以点击该变体的按钮。

接下来是 Flex Container,它通常用于对齐项目。默认情况下,所有项目都是左对齐并靠顶部。你可以调整属性来实时查看效果,比如将项目居中、靠右等。

Input 组件支持基本、大号、错误、禁用、圆角等状态。Modal 组件包含标题和内容,还有带页脚的模式,以及无关闭按钮的模式。

Radio 单选按钮支持水平和垂直对齐。Select 下拉菜单可以显示标签和值,可以选择带图标的选项,选择后会显示相应的图标。Spinner 提供小、中、大三种尺寸。Switch 开关支持基本、水平、禁用等状态。

Tabs 组件可以显示基础的选项卡或禁用某些选项,还支持垂直排列。在每个变体中,你都可以查看代码示例。

最后,我们来看 Theme Provider(主题提供器)。通过调整主题的主色,可以统一改变按钮、输入框等组件的颜色。所有组件的颜色和边框都随着主题的调整实时更新。

这就是我们组件库的内容,总共有 10 个组件和一个主题提供器。希望你对这些组件有更深入的了解。谢谢大家,我们课程见!

WangShuXian6 commented 1 month ago

2 - 介绍

2.1 - 项目设置

欢迎回来!

在本视频中,我们将讨论 React UI 组件库的项目创建。在我的 VS Code 中,可以看到我已创建了一个名为 satya_ui 的空文件夹,这也将成为我的 UI 组件库的名称。

首先,我们需要使用 npm init 命令生成 package.json 文件。没有这个文件,我们无法在父文件夹中安装任何 npm 模块。如果希望在这里安装 npm 模块,必须先生成 package.json

点击“终端”,选择“新终端”,然后输入命令 npm init。根据提示输入包名称 satya_ui,版本号 1.0.0,描述可以留空,入口文件为 index.js,测试命令、git 仓库和关键字留空,作者填写你的名字,许可证可以留空,确认后完成创建。现在可以看到我们生成了 package.json

接下来,我们初始化 npm 模块。为了编写组件,首先需要安装 4 个 npm 模块:reacttypescript@types/react,以及 tslib。所有这些模块将作为开发依赖来安装,因此使用 --save-dev 选项。安装完成后,可以看到我们生成了 node_modules 文件夹和 package-lock.json 文件,它们会记录 npm 模块的版本信息。

接下来,我们设置 tsconfig.json 文件,因为我们将使用 TypeScript 编写组件。在文件中添加默认配置,这些配置包含 compilerOptionsinclude 两个属性。如果希望了解这些配置的详细作用,可以参考 TypeScript 的官方文档。

然后,我们创建项目的文件夹结构。在根目录中已有 tsconfigpackage.jsonnode_modules。现在创建一个 src 文件夹,并在其中创建 components 文件夹和 index.ts 作为入口点。将来我们创建的组件将会导入到这里,并通过一条语句进行导出。

为了演示,我们先创建两个组件文件夹:buttoninput。在每个文件夹中创建 index.tsx 文件,添加基本的功能组件。在 src/index.ts 中导入这些组件,并用一行代码导出它们。

在下一个视频中,我会展示如何编写一个简单的组件语法,以便可以导出和使用。我们已经完成了基本的功能组件编写,接下来将编写 UI 组件语法。

谢谢观看!

2.2 - 创建第一个组件

欢迎回来!

在本视频中,我们将开始制作按钮组件。我们将从一些基础属性和基本样式开始,待组件成功发布到 npm 后,再回过头来完善更多的属性和对应样式。

首先,我们定义接口 ButtonProps,初期只设置两个属性:titlevariant。其中,variant 属性可以有两个值:outlinedcontained

接着在组件中定义 titlevariant,并为 variant 设置默认值为 contained。然后创建一个按钮,并显示 title

目前我们不编写 CSS 文件,而是直接使用内联样式。我们将 padding 设置为上下 5px、左右 10px。接下来,根据 variant 属性来应用不同的背景颜色、文本颜色和边框样式:

将样式附加到按钮上后,组件就准备好了。由于暂时使用了内联样式,接下来我们会完成发布过程,并在后续视频中用 Tailwind CSS 替换掉内联样式。这样可以加速测试流程。

在下一个视频中,我们将使用 Rollup 库来导出此组件。

谢谢观看!

WangShuXian6 commented 1 month ago

3 - 配置 Rollup 并将库发布到 npm

3.1 - 什么是 Rollup

欢迎回来!

在本视频中,我们将讨论什么是 Rollup 以及如何将其集成到当前项目中。

首先,Rollup 是一个 JavaScript 模块打包工具,它可以将项目源代码和所有依赖项打包为单一文件。Rollup 的作用是将代码中非 JavaScript 部分转换为纯 JavaScript,从而生成适合发布的版本。具体来说,像 JSX、TS、TSX 这些浏览器无法直接理解的代码,都会被 Rollup 转换为浏览器能理解的 JavaScript。

打个比方,如果我们的项目有多个 JavaScript 文件、JSX、TSX、CSS 和图片文件,那么在使用 Rollup 构建后,它会输出一个或多个 JavaScript 文件,同时保留原有的静态资源(如图片和 CSS)。

Rollup 的主要作用就是将非 JavaScript 代码转化为 JavaScript,确保可以直接发布到 npm 上。我们在项目发布之前需要进行这样的构建,以便得到纯 JavaScript 的输出。

接下来是如何在项目中设置 Rollup:

  1. 首先,需要安装 Rollup 及其依赖模块,然后创建 rollup.config.ts 配置文件。
  2. 该配置文件用于定义 Rollup 的构建指令,包括入口文件、输出目录和格式等。
  3. 我们可以在配置文件中指定输出格式(如 CommonJS 或 ECMAScript),以及需要的插件,用来处理不同格式的文件。
  4. 最后,可以在配置中选择是否启用 TypeScript 的特性,比如类型生成和属性验证等。

在下个视频中,我们将实际操作,完成 Rollup 的安装和项目中的配置。谢谢观看!

3.2 - 安装 Rollup

欢迎回来!

在本视频中,我们将讨论在当前应用中配置 Rollup 所需安装的 NPM 模块。

基本上,为了使用 Rollup,我们需要安装并配置七个 NPM 模块。接下来,我将依次介绍每个模块的用途:

  1. Rollup:这是核心库,用于构建源代码并生成输出。没有这个库,其他 Rollup 功能都无法使用。

  2. Rollup TypeScript Plugin:这个插件处理 TypeScript 语法并将其转换为 JavaScript。可以通过 npm install @rollup/plugin-typescript 命令安装。

  3. Node Resolve Plugin:用于定位项目中的模块,并将非 JavaScript 代码转换为 JavaScript,这对于使用第三方模块很有用。

  4. CommonJS:将 CommonJS 模块转换为 ES6 语法,以便在 Rollup 构建时包含它们。如果项目包含旧版 CommonJS 模块,这个插件会将它们转换为最新的 ES6 语法。

  5. DTS:生成基于组件接口的类型文件,便于在使用时提供类型支持。

  6. Terser Plugin:这个插件用于压缩代码。它能移除未使用的变量和导入语句,生成更小的打包文件。

  7. Peer Dependencies External:用于从构建过程中排除指定的 npm 模块,避免与最终用户的应用重复加载模块。例如,如果最终用户应用中已经安装了 React,可以使用此插件防止重复打包。

接下来,我们将逐个安装这些模块,然后在下一视频中使用这些插件来编写 rollup.config.ts 配置文件。谢谢观看!

3.3 - 创建 Rollup 配置

欢迎回来!

本视频将讨论 Rollup 配置文件的设置。首先,在项目根目录下创建一个名为 rollup.config.ts 的文件。

接下来,引入上一视频中安装的插件:

在配置文件中,首先指定 inputoutput,其中 input 指向入口文件路径,output 指定为两种输出格式:CommonJS 和 ES 模块。

export default [
  {
    input: 'src/index.ts',
    output: [
      {
        file: 'dist/cjs/index.js',
        format: 'cjs',
        sourcemap: true,
      },
      {
        file: 'dist/esm/index.js',
        format: 'esm',
        sourcemap: true,
      },
    ],
    plugins: [
      peerDepsExternal(),
      resolve(),
      commonjs(),
      typescript(),
      terser(),
    ],
  },
  {
    input: 'src/index.ts',
    output: {
      file: 'dist/index.d.ts',
      format: 'es',
    },
    plugins: [dts()],
  },
];

plugins 中引入所有插件以进行不同的功能处理,例如,terser 用于压缩代码,dts 生成类型文件。对每个配置部分添加注释,以帮助理解每一部分的功能。

接下来,我们将在下节讨论 package.json 中的配置修改以生成 Rollup 构建。谢谢观看!

3.4 - 使用 Rollup 构建

欢迎回来!

本视频中将介绍如何在 package.json 中进行更改,以便使用 Rollup 生成构建。

  1. 更新主入口:将 main 属性从 index.js 更新为 dist/cjs/index.js,这与 Rollup 的 CommonJS 输出路径匹配。

  2. 添加 ECMAScript 支持:为 ECMAScript 输出添加 module 属性,指向 dist/esm/index.js,确保与 Rollup 配置中的路径一致。

  3. 类型支持:在 types 属性中指定类型文件路径,设置为 dist/index.d.ts

更改完成后,可以使用 npm run build 命令进行构建。运行 build 命令时,若 Rollup 配置文件是 TypeScript 格式,则需添加参数 bundleConfigAsCJS,以确保 Rollup 正确地编译 TypeScript。

最终,生成的 dist 文件夹将包含以下内容:

下一节将演示如何导出和导入组件。谢谢观看!

3.5 - 发布到 npm

欢迎回来!

本视频将介绍如何将 React UI 组件库发布到 npm。

  1. 创建和登录 npm 帐户:前往 npm 网站,若无账户请先注册并验证邮箱。登录账户后,在终端中使用 npm login 命令输入用户名、密码和邮箱验证代码完成登录。

  2. 更新库名称:如果库名称与现有 npm 包冲突,可以在 package.json 中修改 name 属性以避免冲突。

  3. 发布库:确保登录成功后,使用 npm publish --access public 命令将组件库发布到 npm。如果发布成功,您将在 npm 账户的 Packages 列表中看到新发布的库。

  4. 检查发布结果:发布完成后,返回 npm 账户,刷新页面即可看到新发布的库。

接下来的视频将展示如何在独立的 React 应用中安装和测试该库的功能,确保库发布成功后再继续操作。

WangShuXian6 commented 1 month ago

4 - 测试与升级

4.1 - 测试已发布的库

欢迎回来!

在上一个视频中,我们讨论了如何将 React UI 组件库发布到 npm。今天,我们将学习如何在一个独立的 React 应用中测试该发布的 npm 组件库。

  1. 创建测试项目

    • 打开终端,进入项目文件夹。
    • 使用以下命令创建新的 React 应用:npx create vite@latest satya-ui-testing
    • 选择 React 和 TypeScript 作为模板,然后进入新项目。
  2. 安装依赖

    • 运行 npm install 安装应用依赖。
    • 接着,使用 npm install satya-ui-react 安装我们发布的组件库。
  3. 启动开发服务器

    • 运行 npm run dev 启动开发服务器。
    • 在浏览器中打开 localhost:5173 确认应用正常运行。
  4. 导入组件并测试

    • 打开 App.tsx 文件,清理不必要的代码。
    • 使用 import { Button } from 'satya-ui-react' 引入 Button 组件。
    • 在组件中添加 titlevariant 属性,并观察组件渲染是否符合预期。
  5. 验证类型检查

    • 添加不存在的属性(如 size),观察 TypeScript 是否抛出错误。
    • 组件库正确验证了传入的属性,确保只接受定义的 titlevariant 属性。

本视频展示了如何在独立 React 项目中测试组件库,验证其功能和类型检查的准确性。下一步,我们将学习如何在发布更新时调整版本号。

4.2 - 升级已发布的库

欢迎回来!

在本视频中,我们将学习在 npm 库中如何进行版本升级。以下是步骤:

  1. 在组件库中做修改

    • 进入 Button 组件,添加新的 onClick 属性,并添加一个光标样式,使按钮在悬停时显示为手形。
    • 更新样式,例如 cursor: pointer,以改善用户体验。
  2. 生成最新构建

    • 打开终端并运行 npm run build,生成包含最新更改的构建文件。
  3. 更新 package.json 的版本号

    • package.json 中将版本号从 1.0.1 更新为 1.0.2
    • 保存文件并运行 npm publish,发布更新的版本到 npm。
  4. 在消费应用中更新版本

    • 在测试应用中,运行 npm install satya-ui-react@latest
    • 这样可以安装最新版本,并在应用中测试新属性和样式。
    • 重新启动开发服务器 npm run dev,确保应用加载最新库,并验证按钮组件的光标效果。

接下来的视频中,我们将介绍如何在不发布到 npm 的情况下测试组件更新,以便更快速地验证小的代码改动。

4.3 - 无需重新发布即可测试库

欢迎回来!

本视频将介绍如何在本地测试组件库的更改,而无需发布到 npm。以下是具体步骤:

  1. 创建新应用程序

    • 使用 npx create-vite@latest 创建一个新的 React 项目,如 satya-ui-testing-local,并选择 TypeScript 模板。
  2. 在组件库中使用 npm link

    • 在组件库的根目录中运行 npm link。这样,组件库将在本地全局注册,使其可以被其他应用程序引用。
  3. 在测试应用程序中链接库

    • 进入新的测试应用目录,运行 npm link satya-ui-react 以便在该应用中使用本地版本的 satya-ui-react,而无需从 npm 安装。
  4. 构建组件库并测试更改

    • 在组件库中运行 npm run build,生成最新构建。
    • 打开测试应用,导入 Button 组件并使用它来验证更改,例如添加 onClick 属性。
  5. 动态更新样式和功能

    • 可以在组件库中更改样式或逻辑(例如按钮的颜色或事件处理),重新运行 npm run build,并刷新测试应用查看效果。
  6. 完成本地测试

    • 确保所有更改在本地测试时都能按预期工作,然后再将最终版本发布到 npm。

这样,您可以高效地进行快速迭代,节省发布到 npm 的时间。完成本地验证后,就可以将更新推送到 npm 了。

WangShuXian6 commented 1 month ago

5 - 添加 Tailwind CSS

5.1 - 添加纯 CSS 并构建

欢迎回来!

在本视频中,我们将介绍如何在组件库中构建和处理 CSS 文件。具体步骤如下:

  1. 创建 CSS 文件并应用类样式

    • Button 组件目录下创建 index.css 文件,并在该文件中定义样式类。
    • 例如,btn 类定义通用样式,btn-outlinedbtn-contained 类分别应用边框样式和背景色。
    • 在组件文件中,移除行内样式,改用 className 属性引用这些类。
  2. 引入和应用 CSS 文件

    • 在组件文件顶部引入 CSS 文件:import './index.css'
    • 使用 JavaScript 动态设置 className,例如:
      let className = 'btn';
      if (variant === 'outlined') className += ' btn-outlined';
      else className += ' btn-contained';
  3. 安装和配置 Rollup 的 PostCSS 插件

    • 由于 Rollup 默认不处理 CSS 文件,我们需要安装 rollup-plugin-postcss 插件。
    • 在项目目录中运行:npm install rollup-plugin-postcss
    • rollup.config.js 中添加以下代码:
      import postcss from 'rollup-plugin-postcss';
    • postcss() 插件添加到 Rollup 配置中的插件列表。
  4. 更新 Rollup 配置以排除 CSS 类型

    • 在导出类型配置时,通过 external 属性排除 .css 文件。
    • 使用正则表达式排除:exclude: /\.css$/,从而避免 CSS 文件在类型生成阶段出现。
  5. 构建并验证输出

    • 运行 npm run build 构建项目。构建成功后,输出将包含新的 CSS 文件和应用了 CSS 类样式的组件库。
    • 在消费应用中查看效果,确保样式应用正确。

下一步,我们将介绍如何在组件库中集成 Tailwind CSS。

5.2 - 添加 Tailwind CSS 并构建

欢迎回来!

在本视频中,我们将介绍如何在组件库中安装并设置 Tailwind CSS。以下是步骤:

1. 安装 Tailwind CSS

2. 配置 Tailwind CSS

3. 修改 Tailwind 配置以兼容组件

4. 使用 Tailwind CSS 类

5. 运行构建并查看效果

通过这些步骤,您现在可以在项目中使用 Tailwind CSS 来构建样式。在下一个视频中,我们将介绍如何通过一个库来简化具有多种样式变体的类名写法。

5.3 - 添加 classnames 库以实现条件类样式

欢迎回来!

本视频我们将介绍如何使用 classnames 库来简化条件渲染类名的流程。这一库的优势在于,可以帮助我们更轻松地基于条件动态应用样式类,而不必写很多 if-else 语句。以下是操作步骤:

1. 安装 classnames 库

2. 使用 classnames 库

3. 添加更多属性

4. 构建和测试

5. 扩展应用

通过 classnames 库,您可以简化条件渲染类名的代码,使代码更简洁、更易读。如果您有任何关于 CSS 安装、Tailwind CSS 设置或 classnames 库使用的疑问,请随时提出!

WangShuXian6 commented 1 month ago

6 - 增强按钮组件

6.1 - 添加尺寸和边框半径属性

欢迎回来!

在本视频中,我们将继续完善功能完备的按钮组件,添加 大小size)和 圆角rounded)属性,并进行样式调整。

1. 定义 Size 和 Rounded 属性

2. 实现边角和大小样式

3. 测试大小和圆角属性

4. 使用 Google 字体

5. 构建并查看结果

6. 下一步

如果您对组件的 sizerounded 属性或 Tailwind CSS 的设置有任何疑问,请随时提问!

6.2 - 添加图标属性

欢迎回来!

在本视频中,我们将为按钮组件添加 图标图标大小 属性。让我们逐步实现这些新功能。

1. 定义 Icon 和 Icon Position 属性

2. 使用 Icon 和 Flex 布局

3. 安装图标库

4. 添加 Icon Size 控制

5. 构建与测试

6. 下一步

如果您对按钮组件的 iconiconSize 属性有任何疑问,或者对图标库的使用有问题,请随时提问!

WangShuXian6 commented 1 month ago

7 - Storybook

7.1 - Storybook 简介

欢迎回来!

在本视频中,我们将介绍 Storybook 的安装、设置,以及如何为组件编写 Stories。让我们一步一步实现 Storybook 集成到我们的组件库中。

1. 回顾

2. 引入 Storybook

3. 安装和设置 Storybook

4. 启动 Storybook

5. 编写 Stories

6. 运行和测试

7. 后续步骤

如果您在安装或配置过程中有任何问题,请随时提问。

7.2 - 了解 story 并学习如何编写

欢迎回来!

在上一个视频中,我们介绍了 Storybook,并完成了 Storybook 的安装和设置。今天我们将探讨 story 的概念,并演示如何移除默认的 Storybook 示例。

1. 什么是 Story?

2. Storybook 的优势

3. 组件及其变体的展示

4. 如何移除默认 Story

5. 创建自定义 Story

通过以上步骤,你现在应该理解了 Story 的概念以及它在 Storybook 中的作用。在接下来的视频中,我们将亲手编写第一个按钮组件的 Story

7.3 - 为按钮组件编写 story - 第 1 部分

欢迎回来!在本讲中,我们将学习如何为我们的按钮组件编写 story

步骤:

  1. 定位组件文件夹

    • 进入项目文件夹中的 SRC,找到 components 文件夹,并在其中找到按钮组件的文件夹。
    • 在这个按钮组件的文件夹中创建新的 story 文件: button.stories.tsx
  2. 编写基本故事

    • 在这个文件中,导入 Button 组件和 ButtonProps 接口。
    • 使用 export default 导出一个对象,其中包含 titlecomponent 字段,定义 story 的名称和组件。
  3. 编写第一个 story

    • 使用 export const 创建按钮的第一个变体 Contained
    • args 中设置按钮的属性,如 titlevariant 等。
    • 例如:title 为“Primary Button”,variant 为“Contained”。
  4. 扩展更多变体

    • 同样的方法可以创建其他变体,如 Outlined,并为不同的按钮样式指定不同的 args
    • 你可以根据需求,创建诸如 SmallMediumLarge 的大小变体,或是 Disabled 状态的按钮。
  5. 使用 Tailwind CSS

    • 如果你的项目中使用了 Tailwind CSS,还需要添加 PostCSS 插件以确保样式在 Storybook 中生效。
    • .storybook/main.js 文件中,将插件 storybook/addon-postcss 添加到 addons 中,并根据 Storybook 的文档进行配置。
    • 最后,导入 main.css 文件到 Storybook 的 preview.js 中,以确保 Tailwind CSS 能够应用到 Storybook。
  6. 运行 Storybook

    • 使用 npm run storybook 启动 Storybook,在浏览器中预览你创建的按钮故事。
    • 你可以实时修改按钮的属性(如文本、大小、状态等),观察 Storybook 界面上的效果变化。
  7. 创建更多故事

    • 根据按钮的不同 props(例如 variantsizedisabled 等),创建多个故事以展示不同的配置效果。建议创建至少 5 个变体,帮助更好地测试和展示组件。

结论

通过以上步骤,你可以使用 Storybook 为按钮组件创建多个不同的故事,实时测试和展示组件的不同状态。如果有任何疑问,请在继续前进一步交流。

7.4 - 为按钮组件编写 story - 第 2 部分

欢迎回来!在本讲中,我们将为按钮组件添加两个新的 stories:一个是处理圆角属性,另一个是处理图标属性。

1. 添加圆角故事

2. 添加带图标的故事

3. 在 Storybook 中预览

总结

我们已经成功地为按钮组件添加了两个新的变体,展示了按钮的圆角和带图标的样式。在接下来的讲座中,我们将讨论如何为按钮添加 loading 状态的故事,以进一步丰富其样式变体。如果有任何疑问,请随时提问!

7.5 - 为按钮组件编写 story - 第 3 部分

欢迎回来!在本视频中,我们将为按钮组件添加一个 loading 属性,以实现加载动画效果,并创建相应的 story。以下是实现过程:

1. 添加 Loading 属性

2. 创建 Loading 的 Story

3. 启动并查看

4. 优化和调整

总结

现在我们已经为按钮组件添加了一个 loading 效果,并创建了相应的 story。加载指示器会在加载时显示,并伴随旋转动画。您可以继续探索其他样式组合和故事以丰富组件功能!

如果有任何疑问,请随时提出!

WangShuXian6 commented 1 month ago

8 - 输入框 (Input)

8.1 - 创建 Input 组件

欢迎回来!在本视频中,我们将开始创建输入框组件,并为其添加基本的故事。以下是实现过程的关键步骤:

1. 定义输入框组件 (Input Component)

2. 创建基本故事 (Basic Story)

3. 测试和调试

4. 添加其他属性 (如错误消息、禁用状态等)

总结

我们已经创建了基本的输入框组件,并在 Storybook 中进行了测试。接下来,可以继续为该输入框组件添加更多的变体和故事,探索不同的属性组合!

如有任何疑问,欢迎随时提出!

8.2 - Input 组件的 story

本视频中,我们将为输入框组件编写不同的故事,并利用不同的属性来展示其多种变体。以下是步骤:

1. 创建不同大小的输入框故事

2. 添加错误状态故事

3. 创建禁用状态的输入框故事

4. 展示圆角属性的变体

5. 将属性组合到Storybook中以便测试

6. 下一步:主题化和颜色设置

通过这种方法,您可以创建多样化的输入框组件,并在Storybook中测试不同属性组合。接下来,我们将探索如何通过主题来统一控制组件的颜色和样式。

WangShuXian6 commented 1 month ago

9 - 主题提供器

9.1 - 创建主题提供器包装组件

本视频中,我们讨论了如何在UI组件库中实现主题(theming)功能。以下是步骤概述:

1. 创建ThemeProvider组件

2. 定义CSS变量和样式

3. 在Tailwind配置中使用CSS变量

4. 更新组件以使用主题颜色

5. 为Storybook添加ThemeProvider

6. 通过Storybook测试主题

7. 在真实项目中测试主题

通过这些步骤,您可以实现一个可配置的主题系统,使组件在不同的项目中能方便地应用不同的主题。

9.2 - 测试主题提供器

在本视频中,我们演示了如何在原始React应用中测试ThemeProvider主题提供程序的概念。以下是关键步骤:

1. 配置本地链接

2. 在消费者应用中使用ThemeProvider

3. 检查依赖冲突并配置外部依赖

4. 在应用中测试样式更新

5. 应用实践

通过这些步骤,我们成功地验证了ThemeProvider在React应用中的功能,并展示了如何通过简单的属性更改来动态更新整个应用的样式。

WangShuXian6 commented 1 month ago

10 - 选择框 (Select)

10.1 - 创建 Select 组件

在本视频中,我们介绍了如何创建并测试SelectField组件,重点在于构建一个基础选择框组件。以下是关键步骤:

1. 组件创建

2. 组件逻辑

3. Storybook测试

4. 样式优化

5. 进一步开发

通过本次实现,我们搭建了SelectField组件的基本框架,并展示了如何在React中实现带有占位符、点击展开选项、点击选项回调等基本功能的选择框。

10.2 - Select 组件的 story - 第 1 部分

在本次视频中,我们扩展了 SelectField 组件的功能,使其支持在下拉选项中显示图像,比如各个国家的国旗。以下是关键步骤:

1. 获取国旗图片

2. 在组件中显示图片

3. 组件样式优化

4. 添加下拉箭头图标

5. 功能测试

6. 后续步骤

通过这次实现,我们成功将SelectField组件扩展至包含图像,并实现了基本的样式和交互效果,使组件更加完善和实用。

10.3 - Select 组件的 story - 第 2 部分

在本次视频中,我们探索了如何在Storybook中处理组件的状态管理(如 useStateuseEffect),并在选择项更改时动态显示选中的值。以下是实现步骤:

1. 创建组件模板

2. 将模板附加到故事

3. 显示选中的标签(label)

4. 在高级故事中显示图像和标签

5. 选中项的高亮显示

6. 样式调整

7. 后续步骤

通过这些改进,组件能够动态显示选中内容,并在高级模式下显示图像,实现了更多的交互性和视觉效果。希望本视频帮助你在Storybook中更好地管理组件状态!

10.4 - Select 组件的 story - 第 3 部分

在这段视频中,我们添加了一个禁用(disabled)状态的故事给 SelectField 组件,并提出了一个小任务:为组件添加 sizerounded 属性。以下是具体步骤:

1. 禁用状态故事

2. 添加大小和圆角属性

通过这些改进,可以在使用 SelectField 组件时更好地适应不同的使用场景,包括设置组件的大小、圆角以及禁用状态。希望这些步骤对您有所帮助!

WangShuXian6 commented 1 month ago

11 - 单选框 (Radio)

11.1 - 创建 Radio 组件

在本视频中,我们开始创建 RadioField 组件及其基本样式,主要功能包括:

1. 组件初始化

2. 样式与功能

3. 交互逻辑

4. 下一步

这个组件的实现提供了良好的基础,您可以进一步使用不同的颜色和样式来提升视觉效果。如果您对组件的细节还有疑问,请随时告知。

11.2 - Radio 组件的 story - 第 1 部分

在本视频中,我们完成了 SelectField 组件的基础故事,并开始设计 RadioField 组件。主要要点如下:

1. 组件简介

2. 样式和交互

3. 状态管理

4. 故障排查

5. 下一步

本视频为基础样式和交互逻辑打下了良好基础。如果对组件设计有疑问或建议,请随时告知!

11.3 - Radio 组件的 story - 第 3 部分

在本视频中,我们完善了 RadioButton 组件的样式,并创建了相应的故事。主要步骤和改进包括:

1. 字体设置

2. 边框宽度和颜色

3. 组件布局

4. 禁用状态

5. 故事编写

6. 后续改进

本视频使 RadioButton 组件的外观更加美观,并且通过增强其状态指示和布局配置,实现了更好的用户体验。如果有更多的疑问或需求,可以继续在下一视频中探索!

WangShuXian6 commented 1 month ago

12 - 开关 (Switch)

12.1 - 创建 Switch 组件

在本视频中,我们开发了开关 (Switch) 组件的基本功能,并编写了初始的故事。以下是主要步骤和实现细节:

1. 组件的基本功能

2. 布局和样式

3. 添加故事

4. 功能验证

5. 组件优化

本视频中为 Switch 组件奠定了基础,并且初步实现了主要功能。在下一视频中,我们将进一步优化并扩展该组件的功能,以满足更多需求。

12.2 - Switch 组件的 story

在本视频中,我们进一步完善了开关 (Switch) 组件,增加了 orientationdisabled 属性,使其功能更加完整。以下是主要内容概述:

1. disabled 属性的实现

2. orientation 属性的实现

3. 编写和测试新故事

4. 问题排查

视频中为 Switch 组件引入了关键的交互属性,并通过 Storybook 展示了不同状态下的效果。若有任何疑问或需要进一步帮助,请随时提出。

WangShuXian6 commented 1 month ago

13 - 模态框 (Modal)

13.1 - 创建 Modal 组件

在本视频中,我们开始开发模型弹出框 (Modal Popup) UI 组件,以下是主要内容的概述:

1. 组件创建

2. Storybook 故事创建

3. 问题排查

4. 后续视频计划

通过本视频的学习,我们搭建了模型弹出框组件的基础架构。在后续视频中,我们将继续改进组件,使其更具功能性和美观性。

13.2 - Modal 组件的 story 和 UI

在本视频中,我们继续为弹出框 (Modal Popup) UI 组件编写模板和样式。以下是关键步骤的概述:

1. 模板和按钮设置

2. 样式设置

3. 弹出框内容

4. 尺寸调整

5. 后续视频计划

通过本视频,我们实现了弹出框组件的模板和基础样式。在下一步中,将继续改进页脚部分,使弹出框更具功能性和实用性。

WangShuXian6 commented 1 month ago

14 - 标签页 (Tabs)

14.1 - 创建 Tabs 组件

本视频中,我们开始构建一个标签 (Tabs) 组件。以下是主要的步骤:

1. 组件设置

2. 基础故事的构建

3. 下一个视频的计划

这个基础结构为标签组件的样式和功能增强打下了良好的基础,后续步骤将进一步提升其可用性和用户体验。

14.2 - Tabs 组件的 UI 和 story - 第 1 部分

本视频中,我们为标签组件 (Tabs) 添加了样式。以下是具体步骤:

1. 显示标签名称

2. 标签边框样式

3. 点击切换标签

4. 文本颜色更新

5. 内容显示

6. 主题颜色更新

下一步,我们将继续完善标签组件的功能,并为禁用的标签添加样式。

14.3 - Tabs 组件的 UI 和 story - 第 2 部分

在本视频中,我们实现了标签组件 (Tabs) 的禁用功能,并增加了垂直布局。以下是具体步骤:

1. 禁用标签

2. 实现垂直标签

3. 布局与样式的调整

4. 小调整

总结

通过本次视频的讲解,我们顺利实现了标签的禁用功能和垂直排列。我们还优化了组件的样式,使得各个布局效果在视觉上清晰直观。下个视频中,我们将继续完善标签组件的其他功能。

WangShuXian6 commented 1 month ago

15 - 警告框 (Alert)

15.1 - 创建 Alert 组件

在本视频中,我们实现了一个基础的 Alert 组件,用于向用户显示信息性消息(如成功、失败、警告或错误提示)。以下是主要步骤:

1. 创建 Alert 组件

2. 编写基本 Storybook 示例

3. 实现基础样式

4. 对 Alert 组件进行微调

总结

通过本次视频的讲解,我们实现了一个基础的 Alert 组件,涵盖了消息类型的多样化显示及基本样式。下个视频中,我们将继续为组件添加更多的故事示例,以进一步完善其功能和可用性。

15.2 - Alert 组件的 story - 第 1 部分

在本视频中,我们继续完善了 Alert 组件的不同示例,添加了多种警报类型(成功、错误、警告)以及图标支持。以下是步骤总结:

1. 定义不同类型的警报

2. 配置背景透明度

3. 添加图标支持

4. 实现图标条件渲染

5. 示例调整

总结

至此,我们已完成了 Alert 组件的不同类型和图标功能。在下个视频中,我们将添加关闭按钮的功能,使用户可以手动关闭警报消息。希望您喜欢这个演示!

15.3 - Alert 组件的 story - 第 2 部分

在本视频中,我们实现了 Alert 组件的关闭功能。以下是具体步骤:

1. 添加关闭属性

2. 修改 Storybook

3. 显示和隐藏组件

4. 实现关闭功能

最终效果

用户现在可以通过点击关闭图标来隐藏警报组件,从而实现了更好的用户交互。下一个步骤就是对这个功能进行全面测试并调整样式以确保一致性。

这就是 Alert 组件的关闭功能实现,感谢观看!

WangShuXian6 commented 1 month ago

16 - 加载动画 (Spinner)

16.1 - 创建 Spinner 组件

在本视频中,我们实现了 Spinner 组件。以下是实现步骤:

1. 创建 Spinner 组件

2. 创建故事文件

3. 实现样式和动画

4. 调整颜色和宽度

5. 检查并测试

现在,Spinner 组件可用于显示加载动画,并且可以根据需要定制尺寸和颜色。感谢观看!

16.2 - Spinner 组件的 story

在本视频中,我们为 Spinner 组件增加了辅助文本功能,用于在加载指示器下方显示文本,例如 "loading products"、"loading categories"、"loading users" 等。以下是实现步骤:

1. 添加文本属性

2. 更新组件布局

3. 测试功能

通过这些步骤,我们的 Spinner 组件现在支持在指示器下方显示自定义文本,非常适用于不同的加载场景。感谢观看!

WangShuXian6 commented 1 month ago

17 - 弹性容器 (Flex Container)

17.1 - 创建 Flex 容器组件

在这个视频中,我们实现了 Flex 容器的对齐和显示属性功能,帮助我们更灵活地控制组件的布局。以下是实现过程的概要:

1. 引入并配置 classNames 库

2. 配置方向属性

3. 水平和垂直对齐

4. 配置 Gap 属性

5. 边框调试

6. 测试属性效果

这样,我们就成功地实现了一个可以在不同方向和对齐方式之间切换的灵活布局组件。希望这个视频对你有所帮助!

17.2 - Flex 容器组件的 story

在这个视频中,我们探讨了 Flex 容器的对齐和显示属性的实现步骤。以下是要点总结:

1. 引入和设置 classNames 库

2. 方向设置

3. 对齐设置

4. 间距 (Gap) 属性

5. 边框调试

6. 测试对齐和间距效果

该视频展示了如何配置和测试 Flex 布局的对齐方式,帮助我们灵活地控制组件内容的布局。

WangShuXian6 commented 1 month ago

18 - 文档编写与部署

18.1 - 为 story 添加文档

在这个视频中,我们介绍了 Storybook 的 autodocs 功能及其在组件文档中的应用。以下是主要内容总结:

1. Autodocs 功能概述

2. 如何启用 Autodocs

3. 文档内容

4. 在所有组件中使用

5. 实际操作示例

Autodocs 功能大大提高了组件文档的可读性和用户体验,非常适合更复杂的 UI 组件。

18.2 - 将 Storybook 应用部署到 Chromatic

在本次视频中,我们讲解了如何将 Storybook 应用部署到云服务 Chromatic 上,以便轻松分享和维护组件库的文档。以下是关键步骤和内容的总结:

1. Chromatic 简介

2. 注册和登录 Chromatic

3. 创建和部署项目

4. 部署完成

5. 测试和分享

通过这几个步骤,Chromatic 让我们能够快速部署和分享组件库的 Storybook 文档,简化了组件库的可访问性和可维护性。