Files
lislgosms/docs/global-css-progressive-split-plan.md
T

17 KiB
Raw Permalink Blame History

global.css 渐进式拆分计划

更新日期:2026-07-31 适用仓库:CMPP 平台主仓库 计划编号:R12 当前状态:仅完成方案设计,暂不执行

本计划必须等当前工作区代码完成周末测试、问题修复和基线确认后再启动。 在此之前不得为了本计划移动 CSS、调整选择器、改变样式加载顺序或顺带修改页面。

1. 背景

R11 已完成基础样式、AppShell、通用组件、运营端共享样式和客户端共享样式的 本地拆分,但 R11 的完成不代表所有单页面样式已经从 src/styles/global.css 迁出。

截至 2026-07-31 的本地工作区快照:

  • src/styles/global.css 约 9049 行;
  • 页面专属样式和跨门户兼容样式仍然混合存在;
  • 当前工作区还有大量尚未提交的 R1-R11 重构及业务修改;
  • 当前代码尚待周末完成集中测试;
  • 本计划未实施、未提交、未推送、未部署。

以上数据只表示编写本计划时的快照。正式执行 R12 前必须重新统计,不能直接把 本文记录视为届时事实。

2. 目标与非目标

2.1 目标

  1. 按页面所有权逐步迁出 global.css 中的单页面样式。
  2. 每个步骤形成一个可独立构建、测试、发布、观察和回滚的版本。
  3. 保持现有页面视觉、交互、真实 API、数据库和业务行为不变。
  4. 降低继续开发新页面和新功能时对全局样式的依赖。
  5. 最终让 global.css 中每一组保留规则都有明确的全局或兼容用途。

2.2 非目标

  1. 不以一次性清空 global.css 为目标。
  2. 不以减少行数作为拆分成功的唯一标准。
  3. 不在纯 CSS 拆分步骤中重做页面视觉设计。
  4. 不在拆分时顺带修改业务功能、接口、文案或数据结构。
  5. 不为了统一命名而一次性批量修改多个页面的 className。
  6. 不把跨页面规则简单复制到多个页面文件中。

3. 启动前置条件

必须同时满足以下条件后,才能执行 R12:

  1. 当前工作区代码已经完成用户计划的周末测试。
  2. 测试中发现的 Bug 已经处理,或已经明确登记为与 CSS 拆分无关的遗留问题。
  3. 本地工作区的修改归属已经确认,不会误覆盖其他会话的改动。
  4. 已明确 R1-R11 及当前业务修改的提交、推送和部署状态。
  5. 已重新执行并记录:
    • git status --short --branch
    • git diff
    • git fetch
    • 本地 HEAD
    • origin/main
    • 预生产 .deployed-commit
  6. 已保存目标页面拆分前的桌面端和移动端视觉基线。
  7. 已确认目标页面可以使用真实后端数据进行验收。

如果周末测试仍有未定位的布局、弹窗、表格或响应式问题,应先修复这些问题,再启动 CSS 迁移,避免把原有 Bug 错误归因给拆分。

4. 核心拆分原则

4.1 每一步只拆一个页面或一个紧密子域

低风险页面可以在一个发布版本中安排两到三个,但实际代码移动仍要保持独立步骤。 中高风险页面每个版本只处理一个页面或一个子页面。

4.2 按选择器所有权拆分,不按行数硬切

迁移前必须搜索选择器的全部引用。只有确认属于目标页面的规则才能迁移。

以下情况不得直接移动:

  • 同时被运营端和客户端使用;
  • 同时被两个以上业务页面使用;
  • 选择器名称像页面专属,但实际由公共组件渲染;
  • 逗号组合选择器中包含其他页面的分支;
  • 媒体查询中混合了多个页面的响应式规则。

4.3 完整迁移一个样式族

迁移某个页面样式时,必须同时处理:

  • 默认规则;
  • hover、focus、active、disabled 等状态;
  • 加载、空数据、错误和完成状态;
  • 桌面端及全部响应式断点;
  • 页面专属动画和 @keyframes
  • 打印规则;
  • 同一组件的弹窗、抽屉、表格和分页规则。

禁止只移动桌面样式,把移动端覆盖遗留在 global.css

4.4 保持级联顺序

页面 CSS 的导入位置必须保证迁移前后的覆盖顺序一致。迁移步骤中原则上不同时做:

  • 选择器权重调整;
  • className 重命名;
  • !important 清理;
  • CSS Layers 重排;
  • 公共组件视觉改版。

如果发现迁移必须改变权重,应停止纯迁移,把权重治理拆成单独版本。

4.5 新增页面样式不得继续进入 global.css

R12 启动后建立强制约束:

  • 新页面必须有自己的页面 CSS
  • 已有页面的新专属样式写入该页面 CSS;
  • 真正公共的样式进入对应的基础、壳层、组件、运营端或客户端共享文件;
  • 暂时无法判定归属的规则必须写明使用方和保留原因。

5. 分阶段实施路线

R12.0:建立拆分基线和所有权门禁

本步骤不移动生产 CSS。

工作内容:

  1. 重新统计各样式文件行数和导入顺序。
  2. 建立 global.css 选择器所有权清单。
  3. 记录每个候选选择器在 React 源码中的引用。
  4. 标记单页面、跨页面、跨门户、公共组件和疑似无引用规则。
  5. 建立后续步骤使用的选择器归属检查脚本。
  6. 保存关键页面视觉基线和构建产物中的 CSS 顺序。

完成标准:

  • 能够明确识别已经迁出的选择器是否重新进入 global.css
  • 能够识别页面 CSS 是否缺少对应的响应式规则;
  • 不改变现有页面和生产代码行为。

第一阶段:低风险、前缀清晰的页面

R12.1:客户端短信发送明细

候选样式:

  • .send-detail-*
  • 对应媒体查询分支
  • 仅由发送明细页面使用的状态规则

目标文件:

src/apps/client/send-detail/ClientSendDetailPage.css

这是建议的第一个实际迁移步骤,原因是选择器前缀清晰、页面以只读明细为主、 交互状态少、与其他页面耦合较低。

预计迁出规模:约 120-200 行,以正式执行时重新盘点为准。

R12.2:客户端上行短信

候选样式:

  • .uplink-*
  • 页面表格、详情和响应式规则

目标文件:

src/apps/client/uplink/ClientUplinkMessagesPage.css

R12.3:客户端应用管理

候选样式:

  • .sms-app-*
  • 应用卡片、状态、操作区和响应式规则

目标文件:

src/apps/client/applications/ClientApplicationsPage.css

R12.4:运营看板首页

候选样式:

  • .admin-dashboard-*
  • .admin-workload-*
  • .admin-alert-*

目标文件:

src/apps/admin/home/AdminHome.css

第一阶段完成后,应确认拆分方法、检查脚本、加载顺序和视觉验收流程可靠,再进入 更复杂的客户端页面。

第二阶段:客户端中高风险页面

R12.5:批量任务页面

候选样式:

  • .batch-filter-*
  • .batch-table-*
  • .batch-task-*
  • .batch-progress
  • .batch-actions
  • .batch-pagination

进度条、操作区、分页以及所有响应式分支必须作为一个完整页面样式族迁移。

R12.6:客户端模板页面

只迁移模板列表页面实际拥有的样式,例如:

  • .template-toolbar
  • .template-card-grid
  • .template-card*
  • .template-content
  • .template-vars
  • .template-card-footer

以下规则不能因为名称相似而一起迁移:

  • 短信发送页使用的 .template-trigger
  • 短信发送页使用的 .template-picker-*
  • 通用组件使用的弹窗标题和表单规则。

R12.7:客户端短信发送页面

候选样式族:

  • .sms-send-*
  • .send-card
  • .receiver-*
  • .send-form-*
  • .add-recipient
  • .import-panel
  • .send-tip
  • .send-submit-*
  • .preview-*
  • .phone-preview
  • 页面专属模板选择器

本页面交互状态多,涉及号码录入、批量导入、模板选择、发送预览和移动端布局, 必须单独形成一个版本。

R12.8:企业认证页面

候选样式:

  • .enterprise-page
  • 企业认证表单和步骤状态
  • .enterprise-result*
  • 对应的全部响应式规则

该页面存在多状态切换,迁移时必须验证未认证、审核中、通过、驳回和重新提交等状态。

第三阶段:运营端企业和审核页面

R12.9:企业列表和查询区域

只处理企业列表、筛选条件、查询区域和列表卡片,不同时拆企业详情和编辑表单。

R12.10:企业详情

候选样式:

  • .admin-enterprise-detail
  • .admin-enterprise-profile
  • 企业摘要和业务页签
  • 企业应用展示区域

R12.11:企业新增和编辑表单

处理企业表单、营业执照、联系人和账户配置等页面专属样式。

R12.12:企业应用新增和编辑

候选样式:

  • .admin-app-form-*
  • 应用协议配置
  • 路由和连接相关表单
  • 页面专属开关和提示区域

此步骤涉及复杂表单,应与企业列表和详情分开。

R12.13:企业审核

迁移企业审核详情和页面专属布局,保留真正跨审核页面共享的表格、筛选、分页和 状态标志。

R12.14:短信、签名、模板和引流审核

优先按具体审核页面逐一迁移。只有确认多个审核页面的结构和视觉完全一致后, 才能把对应规则留在或迁入运营端共享样式。

第四阶段:通道和报备页面

这是 R12 风险最高的一组,不得合并成一次大迁移。

R12.15:通道组列表

只处理通道组列表、状态、基础操作和响应式布局。

R12.16:通道组表单及路由配置

处理通道组编辑、通道路由、优先级和相关动态表单。不得同时修改路由业务规则。

R12.17:通道报备列表和详情

处理通道报备列表、签名状态、详情和操作区域。

R12.18:待生成报备批次

处理“待生成资料”和“已生成批次”两个 Tab 的筛选、表格、分页和详情弹窗。 拆分时必须保持现有搜索条件宽度和统一按钮规范。

R12.19:报备资料导入、审核和预览

处理导入结果、逐行审核、勾选批量审核、整批审核、导出预览和状态修改等样式。 本步骤如果 diff 过大,应继续拆成:

  1. 导入和解析结果;
  2. 审核列表和批量操作;
  3. 导出与预览。

第五阶段:统计及其他运营页面

R12.20:签名通道发送质量

独立迁移筛选条件、质量卡片、表格、明细弹窗和运营商概览,不与其他统计页面合并。

R12.21:下游投递记录

迁移查询、记录表格、详情和响应式布局。

R12.22:恢复状态管理

迁移筛选、状态、错误信息、操作区和详情弹窗。

R12.23:网关异常及相关记录

按实际页面引用拆分异常记录、协议日志和详情样式。

R12.24:充值管理

迁移充值列表、充值操作、凭证和页面专属弹窗。公共回执组件样式不得重复复制。

R12.25:运营端上行短信

与客户端上行短信页面分别确认所有权,不能仅因业务名称相同就共用页面专属规则。

R12.26:系统用户、操作日志和安全配置

这些页面可能与客户端系统页面共用 .system-* 规则。先迁移明确的页面专属规则, 跨门户规则留到第六阶段统一治理。

R12.27:引流资料及其他剩余页面

对未覆盖页面重新进行引用盘点,继续遵循“一页一步”的原则,不设置一次性清仓步骤。

第六阶段:跨门户兼容样式治理

在所有主要单页面样式完成迁移后,再处理同时被运营端和客户端使用的历史规则,例如:

  • .system-page
  • .system-page-toolbar
  • .system-filter-row
  • .system-table-card
  • .inline-actions
  • .system-user-form
  • 其他经引用扫描确认的跨门户兼容类名

逐项采用以下处理方式之一:

  1. 确认真正公共,迁入公共组件或公共布局样式;
  2. 只有布局公共,抽取新的公共布局类;
  3. 名称相同但实际表现不同,分别改为页面专属类;
  4. 暂时不能确认,继续保留在 global.css 并注明使用方和原因。

跨门户样式必须最后处理,避免一次变化同时影响多个已拆页面。

R12.28:最终残留审计

工作内容:

  1. 删除经静态扫描和运行时验证确认无引用的规则。
  2. 合并确认声明和作用域均等价的重复规则。
  3. 检查响应式分支、关键帧、打印样式和浏览器兼容规则。
  4. 为必须保留的规则记录用途、使用方和不能下沉的原因。
  5. 启用“页面专属样式不得新增到 global.css”的持续门禁。

最终成功标准不是 global.css 变成零行,而是其剩余规则全部具有明确、可验证的 全局职责。

6. 风险分级和建议节奏

6.1 风险分级

低风险:

  • 客户端发送明细;
  • 客户端上行短信;
  • 客户端应用管理;
  • 运营看板首页。

中风险:

  • 批量任务;
  • 客户端模板;
  • 审核页面;
  • 签名通道发送质量;
  • 充值和系统页面。

高风险:

  • 客户端短信发送;
  • 企业认证;
  • 企业和应用复杂表单;
  • 通道组路由;
  • 通道报备和资料导入;
  • 下游恢复类页面。

6.2 发布节奏

  • 低风险页面:一个发布版本最多安排 2-3 个,但分别实施和验证。
  • 中风险页面:一个发布版本只处理 1 个页面。
  • 高风险页面:一个发布版本只处理 1 个页面或 1 个子页面。
  • 不在同一版本中同时拆高风险页面和修改该页面业务功能。
  • 每个版本至少稳定观察一个发布周期,再进入下一个高风险步骤。

预计整个计划约 28 个小步骤。步骤数量允许在 R12.0 重新盘点后调整,但不得通过 合并高风险页面来人为压缩版本数量。

7. 每一步的固定执行流程

7.1 开始前

  1. 检查 Git 分支、差异、未跟踪文件和其他会话修改。
  2. 记录目标页面当前 CSS 导入链。
  3. 搜索候选选择器的全部源码引用。
  4. 保存目标页面桌面端和移动端视觉基线。
  5. 明确本步骤允许移动和禁止移动的选择器清单。

7.2 实施中

  1. 新建或使用目标页面 CSS 文件。
  2. 从稳定页面入口导入页面 CSS。
  3. 迁移完整样式族和所有媒体查询分支。
  4. 遇到跨页面的逗号选择器时先拆开规则,再迁移目标分支。
  5. 不修改 API、数据库、业务判断、文案和用户操作流程。
  6. 不清理与本步骤无关的历史 CSS。

7.3 本地门禁

至少执行:

  • 目标选择器所有权检查;
  • CSS 导入顺序检查;
  • 前端 TypeScript 检查;
  • Vite 生产构建;
  • 已建立的 R0-R11 重构门禁;
  • git diff --check

CSS 拆分原则上不影响后端,但在准备形成可发布版本时仍应执行项目既定的完整发布 门禁,包括 API、Prisma、Gateway 和依赖安全检查,防止把工作区中的其他修改漏测。

7.4 页面验收

使用真实后端和真实接口,至少检查:

  • 1280px 及以上桌面端;
  • 1024px
  • 768px
  • 375px 移动端;
  • 正常数据;
  • 空数据;
  • 加载状态;
  • 错误状态;
  • 表格、分页、弹窗和抽屉;
  • 浏览器控制台;
  • 页面有无横向溢出。

不得使用 mock、静态数据或 localStorage 伪造验收结果。涉及生产环境时,不得发送 真实短信或修改真实通道、余额和连接状态。

7.5 记录和发布

  1. 更新本计划的实际进度。
  2. 同步更新相关测试用例和 docs/testing-progress.md
  3. 记录迁移前后行数、选择器数量、目标文件和验证结果。
  4. 未经明确授权不提交、不推送、不部署。
  5. 获得部署授权后,继续遵守项目既定备份、精确提交打包和发布后检查流程。

8. 必须暂停拆分的情况

出现以下任一情况,应停止当前步骤并先诊断:

  1. 迁移必须改变选择器权重才能保持视觉一致。
  2. 一个候选样式被多个未纳入本步骤的页面使用。
  3. 页面在迁移前已经存在无法解释的视觉差异。
  4. 目标页面真实后端不可用,无法完成关键状态验收。
  5. diff 已经大到无法逐段人工复核。
  6. 必须同时修改业务逻辑才能继续迁移。
  7. 发现其他会话正在修改相同页面或相同样式区段。

暂停后应把问题拆成单独 Bug 或更小的重构步骤,不能通过扩大当前版本范围继续推进。

9. 预期结果

计划完成后:

  • 页面专属样式由对应页面目录维护;
  • 公共样式按基础、壳层、组件、运营端、客户端和跨门户职责维护;
  • 新增菜单和页面不再继续膨胀 global.css
  • 修改一个页面时能够明确判断受影响范围;
  • 每次 CSS 调整都有可执行的静态门禁和真实页面回归范围;
  • global.css 即使仍有一定规模,也不再承担无法解释的页面样式集合职责。

10. 后续启动建议

周末现有代码测试完成后,按以下顺序启动:

  1. 重新确认 Git、预生产版本和测试基线;
  2. 执行 R12.0,不移动生产 CSS
  3. 评审 R12.0 生成的所有权清单;
  4. 执行 R12.1 客户端短信发送明细页;
  5. 单独完成构建、真实页面验收和发布观察;
  6. 确认方法稳定后再继续 R12.2。

在用户明确要求启动前,本计划保持“待执行”状态。