在企业级前端开发中,设计系统可以大幅提高开发效率、保证产品一致性,并为团队提供一套可复用的组件库。基于 TypeScript 构建组件不仅能够提升代码的可维护性和可读性,还能借助强类型检查减少运行时错误。同时,Storybook 作为流行的 UI 组件开发工具,可帮助团队独立开发、预览和测试组件。本文将详细介绍如何构建现代化设计系统,从环境搭建、项目结构、组件开发到 Storybook 集成,通过大量代码示例和实战经验,助你构建出高效、稳定且可扩展的组件库。
在命令行中执行以下命令创建新项目:
mkdir design-system
cd design-system
npm init -y
安装必要依赖,包括 React、TypeScript、Storybook 以及相关工具:
npm install react react-dom
npm install --save-dev typescript @types/react @types/react-dom
npx sb init --type react
生成的项目结构大致如下:
design-system/
├── .storybook/ // Storybook 配置文件夹
├── node_modules/
├── public/
├── src/
│ ├── components/ // 组件库目录
│ │ ├── Button.tsx
│ │ └── Input.tsx
│ ├── stories/ // 组件故事文件目录
│ │ ├── Button.stories.tsx
│ │ └── Input.stories.tsx
│ ├── App.tsx
│ ├── index.tsx
│ └── react-app-env.d.ts
├── package.json
├── tsconfig.json
└── README.md
在 tsconfig.json
中确保配置正确,下面是一个简单示例:
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["src"]
}
在 src/components/Button.tsx
中创建一个基础按钮组件,使用 TypeScript 编写。
// src/components/Button.tsx
import React from 'react';
export interface ButtonProps {
label: string;
onClick?: () => void;
variant?: 'primary' | 'secondary';
disabled?: boolean;
}
const Button: React.FC = ({
label,
onClick,
variant = 'primary',
disabled = false,
}) => {
return (
);
};
export default Button;
说明:
ButtonProps
接口,确保组件接收的属性类型正确。variant
属性,按钮样式会有所不同。在 src/components/Input.tsx
中创建一个简单的输入组件。
// src/components/Input.tsx
import React, { ChangeEvent } from 'react';
export interface InputProps {
value: string;
onChange: (value: string) => void;
placeholder?: string;
}
const Input: React.FC = ({ value, onChange, placeholder = '请输入文本' }) => {
const handleChange = (e: ChangeEvent) => {
onChange(e.target.value);
};
return (
);
};
export default Input;
说明:
InputProps
接口,用于指定输入框的值、事件处理函数以及占位符。Storybook 允许你在独立环境中开发、预览和测试 UI 组件。下面展示如何为按钮组件和输入组件创建 Story。
在 src/stories/Button.stories.tsx
中编写按钮组件的故事:
// src/stories/Button.stories.tsx
import React from 'react';
import { Meta, Story } from '@storybook/react';
import Button, { ButtonProps } from '../components/Button';
export default {
title: 'Example/Button',
component: Button,
} as Meta;
const Template: Story = (args) => ;
export const Primary = Template.bind({});
Primary.args = {
label: 'Primary Button',
variant: 'primary',
};
export const Secondary = Template.bind({});
Secondary.args = {
label: 'Secondary Button',
variant: 'secondary',
disabled: false,
};
export const Disabled = Template.bind({});
Disabled.args = {
label: 'Disabled Button',
variant: 'primary',
disabled: true,
};
说明:
在 src/stories/Input.stories.tsx
中编写输入组件的故事:
// src/stories/Input.stories.tsx
import React, { useState } from 'react';
import { Meta, Story } from '@storybook/react';
import Input, { InputProps } from '../components/Input';
export default {
title: 'Example/Input',
component: Input,
} as Meta;
const Template: Story = (args) => {
const [value, setValue] = useState('');
return ;
};
export const Default = Template.bind({});
Default.args = {
placeholder: 'Type something...',
};
说明:
useState
模拟数据双向绑定。本文详细介绍了如何基于 Vue3 与 Vite 构建高性能前端项目,从项目初始化、基础组件开发、路由与状态管理,到利用 Storybook 实现组件开发与调试,全流程展示了现代前端开发的最佳实践。通过大量代码示例和实践经验,你不仅掌握了 Vue3 的新特性和开发技巧,还了解了如何构建一个易于扩展和维护的设计系统。
希望这篇实战指南能为你提供有价值的经验和全新的视角,助你在前端开发中打造出高效、灵活且美观的应用,共同推动现代 Web 开发迈向更高水平!