官网上四个产品的动效演示——那个会自己切换场景的白色面板—— 最初是按标准做法用 React 组件实现的。写完能跑,也好看。

然后我们量了一下它的代价:

项目 压缩后体积
React 运行时 58.7 KB
演示本身的代码 2.2 KB
合计 60.9 KB

96% 的重量是框架本身。

这些面板到底在做什么

值得为它付这个代价吗?看一下这些场景实际做的事:

  • 画面是静态的 HTML
  • 动画全部由 CSS 关键帧驱动
  • 交互只有一件——记住「现在显示第几个场景」,到点切换

一个三态开关。为了这个背上一整套框架运行时, 等于让每一位访客先下载 58.7 KB,才能看到一个每两秒换一次的画面。

换成原生 JavaScript

我们把它重写成了一段原生 JS 控制器,功能一模一样:按时长轮播、 点标签切换、切换时重播入场动画(用「克隆整棵子树替换自己」一次性重启 几十个各带延迟的 CSS 动画),并把 React 及相关依赖从项目里整个卸载。

重写后,全站的 JavaScript 只剩一个文件、压缩后 1.1 KB, 其中还包含了导航菜单和移动端抽屉的逻辑。

React 方案 现在
动效相关的 JS 60.9 KB 1.1 KB(含导航等全部交互)
运行依赖 5 个 2 个
连开发依赖一起算 9 个 4 个

首屏体积(压缩后,本文写作时的实测值):

页面 体积
关于我们等普通页面 12.2 KB
新闻列表 / 新闻正文 13.4–13.6 KB
产品详情(一组动效演示) 19.4 KB
首页(八组动效面板 + 四条动态) 35.0 KB
首次访问另加标题字体 32.9 KB(此后长期缓存)

页面体积会随内容增减而变化,上表是本文发布时的实测数字。 JavaScript 那一项不会——它与内容无关。

首页之所以比普通页重不少,是因为「首页版位可以在后台调整」: 四个主推块和四张产品卡全部渲染进 HTML,由一小段 JS 决定显示哪个, 而不是等配置回来再渲染——那样访客会先看到一条空白。 这是为「可配置」付的钱,我们认为值,也把账算在这里。

不是反对框架,是反对不假思索

框架解决的是复杂状态管理的问题。这个官网没有这类问题: 它没有登录、没有购物车、没有需要在多个组件之间同步的状态。 一个介绍公司、把访客送去产品站点的站点,本来就该是几页静态 HTML。

所以我们给自己留了一条规矩写在项目里:要加交互时,先问一句「这真的需要框架吗」。 到目前为止,导航菜单、移动端抽屉、演示轮播、常见问题展开——全部用原生 JS 或纯 CSS 解决了。

需要这类技术判断的团队,可以看看我们的技术咨询服务