-
当你接到"把按钮从蓝色改成红色"的需求时,是改一行代码,还是翻遍整个项目?
-
当你半年后再看自己写的组件,是秒懂逻辑,还是怀疑"这谁写的垃圾"?
-
当新同事拉下代码时,是立刻能上手,还是必须拉你开半小时会?
------如果答案都是后者,那我们今天的话题就值得你停两分钟:代码的灵活性与可维护性。
代码的灵活性与可维护性这两个词在前端开发里确实经常被提到,但又很抽象。如果对这两个词语没有一定的认知,写出来的代码大概率也不会考虑这两点。
一句话先给你"锚定"理解:
-
灵活性 :系统能不破坏原有结构 地适应新需求。
-
可维护性 :系统能让后来者(或未来的你)快速看懂、修改、调试。
🎯 场景设定:一个按钮组件的演进
我们从一个真实需求出发,看看"灵活性"和"可维护性"怎么体现。
🔴 阶段1:毫无灵活性、毫无可维护性的代码
javascript
// Button.tsx
export default function Button() {
return <button style={{ background: 'blue', color: 'white' }}>点击我</button>;
}
✅ 能用
❌ 不灵活:换个颜色、大小、文案、事件?都得改源码
❌ 不可维护:别人看到这个组件,根本不知道它能干啥、怎么用
🟡 阶段2:提升灵活性(但可维护性一般)
css
// Button.tsx
export default function Button({ label, color, onClick }: {
label: string;
color: string;
onClick: () => void;
}) {
return (
<button style={{ background: color, color: 'white' }} onClick={onClick}>
{label}
</button>
);
}
✅ 灵活:颜色、文案、点击事件都能从外部传
⚠️ 可维护性一般:没有默认值、没有类型约束、没有文档,别人用的时候容易踩坑
🟢 阶段3:兼顾灵活性和可维护性(前端最佳实践)
ini
// Button.tsx
import { ButtonHTMLAttributes, ReactNode } from 'react';
import clsx from 'clsx';
import styles from './Button.module.css';
type Variant = 'primary' | 'secondary' | 'danger';
type Size = 'sm' | 'md' | 'lg';
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
variant?: Variant;
size?: Size;
children: ReactNode;
}
/**
* 通用按钮组件,支持主题、尺寸、原生按钮属性
* @example
* <Button variant="primary" size="lg" onClick={handleClick}>
* 提交
* </Button>
*/
export default function Button({
variant = 'primary',
size = 'md',
className,
children,
...rest
}: ButtonProps) {
return (
<button
className={clsx(styles.button, styles[variant], styles[size], className)}
{...rest}
>
{children}
</button>
);
}
🔍 现在我们来"拆解"灵活性和可维护性
特性
体现方式
带来的好处
灵活性
支持 variant
、size
、className
、...rest
不用改组件源码,就能适应新需求(比如新增一个"警告"样式或"超大"尺寸)
可维护性
- 类型定义清晰(TypeScript)
新同事看到代码,一眼就知道怎么用,不怕改坏,不怕踩坑
🧠 再来一个"反例"加深理解
❌ 不可维护的"灵活"代码(反面教材)
javascript
// 一个"万能"组件,灵活到爆炸,但没人敢用
export default function Box(props: any) {
return <div {...props} />;
}
-
灵活吗?太灵活了,啥都能传
-
可维护吗?不可维护,没人知道该怎么用,传错了也不报错,调试地狱
✅ 总结一句话
灵活性 是"不改代码就能适应变化 ",
可维护性 是"改代码时不怕改错、不怕看不懂"。
当然编程还有很多其他原则,我个人这是最核心的编程原则之一。