给一个庞大系统做重构,最反直觉的做法莫过于用看似原始的技术去替换现代化方案。

2026年9月,GitHub 官方披露了一项历时三年的底层技术改造:github.com 核心全站以及 Primer 设计系统,已经完全剔除以 styled-components 为代表的运行时 CSS-in-JS 方案,全面转入 CSS Modules 与原生 CSS 变量体系。官方给这篇技术复盘起了一个近乎挑衅的标题:靠多发 CSS 来提升网站性能。

这并非噱头。在前端领域沉迷于开发者体验(DX)多年后,GitHub 用真金白银的性能账单完成了一次清算:把样式逻辑从 JavaScript 引擎里剥离后,代码提交路由 github/code_view / commit 的服务端渲染(SSR)耗时直接缩短了约 21.97%。

GitHub 样式去运行时化关键性能收益 -55% Primer SSR 耗时下降 基础组件层率先脱险 -21.97% Commit 路由 SSR 耗时 全站页面改善 1%~22% 400ms→165ms PR Diff 渲染开销 动态 sx 替换为静态 CSS 0 全站 sx 属性存量 从峰值 7,760 处彻底清零

繁荣背后的账单:内联对象拖垮主线程

过去数年,React 生态几乎被以内联对象和组件化封装为卖点的样式库统治。在 GitHub 内部,Primer 的 sx 属性曾是最主流的排版手段。开发者在 JSX 里顺手塞入一个 JS 对象,就能享受到 TypeScript 的类型推断和设计令牌映射。样式和业务代码就近放置,体验顺滑无缝。

内联样式计算凭空消耗两成算力,导致主线程核心业务处理严重停滞(示意图)
内联样式计算凭空消耗两成算力,导致主线程核心业务处理严重停滞(示意图)

代价在后台暗中累加。到 2023 年,GitHub 页面复杂度骤增,运行时样式引擎的物理局限彻底浮出水面。

抽象层越舒服,浏览器主线程承担的无效折损就越沉重。

根据 GitHub 内部对 Issues 页面的基准测试,CSS-in-JS 在服务端渲染期间必须额外执行样式收集流程,甚至需要进行二次预渲染,这直接在原先 1900 毫秒的基础上额外增加了约 450 毫秒的耗时,等于凭空吃掉两成服务器算力。

而在客户端,根据 Primer ADR-016 的基准数据,在 1000 个组件的渲染场景中:

  • 静态 CSS 仅耗时 96 毫秒;
  • 运行时注入 CSS 需要 242 毫秒,耗时超出近 1.5 倍;
  • 若包含动态样式,重渲染耗时更是直接飙升至 441 毫秒。

在重度依赖样式的 PR 代码差异对比场景下,动态 sx 需要耗费 400 毫秒,而静态 CSS 只需要 165 毫秒。即使在基础的仓库目录页面,仅因使用 Primer 原生 Box 组件就需耗时 3800 毫秒,改用定制静态 CSS 后耗时立即降至 3076 毫秒,直接提速 20%。

每次组件状态更新,运行时都要重新哈希计算、比对规则、动态向 DOM 插入 <style> 标签。这不仅打乱了浏览器的样式计算流水线,更让原本专司并发与交互的 JS 引擎变成了繁重的样式分发调度器。

渲染链路机制重构:运行时代价与静态化置换 旧架构:运行时 CSS-in-JS • SSR 额外收集:增加约 20% 渲染耗时 • 客户端阻塞:JS 动态解析并注入 DOM • 重绘惩罚:状态变更反复打断渲染管道 看似轻巧的 JS 对象,成为主线程隐形杀手 新架构:CSS Modules + 变量 • 零运行时开销:编译期提取静态资产 • 原生并行解析:利用 HTTP 独立长期缓存 • CSS 变量解耦:原生支撑 7 套高对比度主题 将样式职责完整交还给现代浏览器引擎

置换定律:为什么多发 CSS 反而更快

所谓的多发 CSS,本质是一次精准的算力置换。

历时三年彻底剥离七千余处杂乱内联代码,重归原生静态变量秩序(示意图)
历时三年彻底剥离七千余处杂乱内联代码,重归原生静态变量秩序(示意图)

长期以来,前端界流行一种体积执念,误以为把 CSS 压缩进 JS 就能减小网络传输压力。然而在现代浏览器架构中,文本体积不是瓶颈,主线程执行开销才是。

CSS 是声明式的,现代浏览器可以使用独立线程并行拉取、流式解析并进行高效率的全局缓存。而一旦样式被封装进 JS 运行时,网络传输后还必须经历反序列化、内存构造和样式注入。GitHub 宁可发送体积略大的独立 CSS 文件,也要将样式解析彻底赶出 JavaScript 主线程。

为了平稳完成这次跨越三年的大规模迁徙,GitHub 采取了极其克制的工程防御策略:

  1. 分层分步走Primer 基础设计系统率先在 2024 年 12 月完成 CSS Modules 改版,不仅让组件库 SSR 耗时缩减 55%,组件初始化耗时也减少了 25%。
  2. 中间垫片隔离风险为避免业务层直接崩塌,官方打包了 @primer/styled-react 兼容层,允许业务在不中断开发的前提下逐步剥离代码。
  3. 消除数千个内联属性从 2025 年 4 月立项时全站峰值约 7,760 处 sx 属性起步,8 位工程师轮换作战 6 个月消除了 6,419 处;到了 2026 年 4 月剩余 895 处时,团队配合 Copilot coding agent 在三周内完成最终收尾,于 2026 年 6 月达成全站零 sx 的终点线。
  4. 低特异性与原生变量从 Primer React v37 起,组件库要求消费端直接从 JS 引入 CSS,样式全面改由原生 CSS 变量驱动以承载全站 7 种主题方案,并严格采用低特异性(low-specificity)选择器确保样式可覆盖。
  • 结论.多发 CSS 绝不是工程倒退,而是用确定性的静态网络缓存,去置换昂贵且不可控的客户端算力。

实用主义的抉择与前端秩序回归

这场历时三年的剥离,标志着一个周期的收尾。

剥离过度定制的专有编译流水线,系统全面回归原生 Web 规范(示意图)
剥离过度定制的专有编译流水线,系统全面回归原生 Web 规范(示意图)

耐人寻味的是,GitHub 并没有选择 StyleX 或 vanilla-extract 这类兼具强类型约束与编译期静态抽取的零运行时 CSS-in-JS 框架,而是径直回退到了几乎没有类型花活的 CSS Modules。

这是一种极具现实意味的取舍。采用编译期框架确实能延续 TypeScript 的舒适感,但不可避免地要将整个构建链条与专有编译插件死锁在一起。对于 github.com 这样体量的长期基建而言,与其继续在高度定制的抽象语法树里闪转腾挪,不如退回至最靠近原生 Web 规范的标准路线。

天下皆知美之为美,斯恶已。当行业盲目追逐 DX 并试图用 JavaScript 吞噬 HTML 和 CSS 时,往往忽视了平台原生的演进速度。随着 HTTP/2+ 多路复用、原生 CSS 变量以及 React 18+ 架构的成熟,强行在客户端维持一套庞杂的动态样式引擎,早从当年的最佳实践蜕变成了系统的负资产。

  • 提醒.如果你的系统尚未拥有精细的代码分割能力,盲目堆砌全局静态 CSS 依然会诱发静态体积膨胀的次生问题。

从极尽复杂的内联抽象,到重新老老实实写 CSS 文件,这一轮兜兜转转并没有虚掷。它用最直观的渲染速度提醒所有工程师:任何违背底层硬件与浏览器运行机理的体验红利,最终都会以性能债务的形式如数索还。