维护 css 的关键是建立清晰边界、分层责任与可持续更新机制。基础层由设计系统统一维护变量与重置;组件层禁止样式覆盖;页面层仅限布局逻辑且复用变量;通过工具约束、升级节奏和决策文档保障可追溯性。

引入 CSS 工具与框架后,维护的关键不在于“禁用”或“替换”,而在于建立清晰的边界、分层的责任和可持续的更新机制。盲目混用、随意覆盖、忽略版本演进,才是维护失控的根源。
明确技术分层与职责边界
将 CSS 体系拆解为三层,每层有明确输入源和修改权限:
- 基础层(Design Tokens + Reset):由设计系统团队统一维护,输出变量(如
--color-primary)、间距标尺、字体栈、CSS Reset。业务开发不可直接修改,仅通过变量引用。 - 组件层(ui 组件库):基于基础层构建,封装按钮、卡片、表单等。使用方只通过 props 控制状态(如
variant="outline"),禁止用 class 覆盖样式(如.btn { color: red !important })。 - 页面层(Page-Specific Styles):仅允许在页面级 scope 内写少量布局逻辑(如
.dashboard-layout > .sidebar),禁止出现颜色、圆角、阴影等视觉值——必须复用基础变量。
约束自定义样式的生效方式
工具链本身不阻止写 CSS,但需用机制降低随意性:
- 启用
postcss-discard-comments或 ESLint 插件(如stylelint-no-unknown-animations),自动拦截!important、内联style属性、未声明变量的引用。 - 约定 “定制样式三步法”:先查 Design Token → 再查组件 API 是否支持 → 最后才考虑用
data-*属性 + scoped class(如[data-theme="dark"] .card)做轻量适配。 - 所有非组件级样式必须走 CSS Modules 或
scoped(vue)/css prop(Emotion),杜绝全局污染。
建立框架与工具的升级节奏
不升级会累积技术债,乱升级会引发样式断裂。需固化流程:
立即学习“前端免费学习笔记(深入)”;
- 主框架(如 Tailwind、bootstrap)每季度评估一次新版,重点关注 breaking changes 文档与 migration script 支持度;小版本(patch)可自动合并,中版本(minor)需人工验证视觉回归。
- 本地工具链(PostCSS 插件、PurgeCSS 配置)与框架版本强绑定,例如 Tailwind v4 要求 PostCSS 8.4+,CI 流程中加入
npm ls postcss校验。 - 每次升级后,运行视觉快照测试(如 Chromatic 或 Loki),比对关键页面在主流浏览器中的渲染差异,差异图谱存档供 UI 同学确认。
沉淀可追溯的样式决策记录
很多“为什么这里用了 flex 而不是 grid”的疑问,源于缺失上下文。建议在项目中维护一个 /docs/css-decisions.md:
- 记录每个全局 class 的用途(如
.sr-only仅用于无障碍隐藏,禁止用于布局隐藏); - 说明某次覆盖样式的理由(例:“
.table th加了white-space: nowrap是因后台列表列名过长,已同步反馈给组件库 PR #1234”); - 标注已知限制(如 “Tailwind 的
aspect-square在 safari 15.4 下失效,临时用 padding-top hack 替代”)。
基本上就这些。维护不是让 CSS 变得更“安全”,而是让每一次修改都有据可依、有路可退、有人可问。