NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Emotion 库维护者解释为什么 Spot 公司不再使用运行时 CSS-in-JS

  • 2022-11-12
    北京
  • 本文字数:1877 字

    阅读完需:约 6 分钟

Emotion库维护者解释为什么Spot公司不再使用运行时CSS-in-JS

Sam Magura是 Spot 的软件工程师,也是活跃的Emotion库维护者。最近,他详细解释了 Spot 公司为什么放弃运行时 CSS-in-JS 库 Emotion,而选择了Sass模块——运行时开销、负载开销和服务器端渲染问题导致了较差的用户体验。


在他的博文中,Magura 首先回顾了运行时 CSS-in-JS 的好处。


今天的 Web 应用程序通常实现为一组协作的组件。在使用运行时 CSS-in-JS 库时,开发人员定义组件的样式以及组件标记和逻辑。如果以不正确的方式修改或删除了组件样式,就很难修改或删除组件代码。这解决了大型应用程序中充斥着未被检测到的过时样式规则的问题。但这样的应用程序下载和执行都比较笨重,对用户体验有负面影响。


将 CSS 规则的作用域严格限定到相关的组件就很难会无意影响到其他组件的样式。如果没有组件作用域,CSS 的级联和专一性规则可能会导致不相关组件的样式定义发生渗透。


最后,使用完备的图灵语言,如 JavaScript,开发人员可以完全自由地表达组件样式和组件逻辑之间的关系。如果组件样式不是静态的,并且需要根据用户操作或应用程序环境中的变更进行动态更新时,这样就很方便了。


不过,Magura 根据他对 Spot 代码库的研究得出结论,CSS-in-JS 的坏处大于好处:


所以,这就是我们放弃 CSS-in-JS 的原因——运行时性能成本太高了。


CSS-in-JS 可能会因其运行时和负载开销而对用户体验产生负面的影响。


一方面,在渲染时动态计算和更新样式可能会导致渲染变慢。Magura 比较了 Spot 用运行时 CSS-in-JS 库 Emotion 实现的代码库组件的渲染时间与用 Sass 模块实现的代码库组件的渲染时间(在构建时编译为普通的 CSS 文件)。对比显示,使用 Emotion 库的渲染时间几乎翻倍(27.7 毫秒对 54 毫秒)。开发人员可以从这篇博文中查看实验数据、火焰图分析等等。


另一方面,将 CSS-in-JS 库添加到应用程序代码中会加大浏览器下载的代码包,可能会降低应用程序的启动速度。Emotion 大约 8 KB(最小化后),而style-components,一个流行的 CSS-in-JS 库,是 12 KB。


有趣的是,运行时 CSS-in-JS 库执行的动态插入 CSS 样式规则可能并不总是与生态系统的其他部分很好地配合。


关于 React 18,Sebastian Markage在 GitHub Issues 中向使用 React 并发渲染功能的开发人员提出了如下的警告


这是一个 CSS 库(动态生成新规则并将它们与<style>标签插入到文档中)的升级指南,特别是目前大多数专门为 React 设计的 CSS-in-JS 库,如 styled-components、styled-jsx、react-native-web。


注意:请务必阅读“When to Insert <style> on The Client”部分。如果你现在在“渲染期间”注入样式规则,会导致你的库在并发渲染时非常慢。


运行时 CSS-in-JS 也可能影响服务器端渲染优化。在一篇关于服务器端流的文章中,Misko Hevery(Qwik框架的作者)、Taylor Hunt和 Ryan Carato写道


例如,CSS-in-JS(如 Emotion)是一种非常流行的方法。但是,如果这种方法意味着在输出样式标签之前所有组件都需要完全渲染,就会中断流,因为框架被迫缓冲整个响应。


Magura 提到,Emotion 的 GitHub 项目中记录的相当多的问题都与服务器端渲染有关(例如 React 18 的流、规则插入顺序)。报告的问题可能会产生显著的意外复杂性(即与解决方案相关的复杂性,而不是源于问题本身)。它们还可能导致负面的开发者体验。


虽然 Magura 提醒读者,他的实验仅限于 Emotion 库和 Spot 的代码库,但他预计大部分推理可能同样适用于其他运行时 CSS-in-JS 库和其他代码库。


一年前,Tomas Pustelnik提供了另一个数据点,尽管表述的方式不同,但指向的问题是相似的。Pustelnik 在他的博文“真实世界的CSS与CSS-in-JS的性能比较”中总结道:


就是这样。如你所见,运行时 CSS-in-JS 可以对网页产生明显的影响,主要针对低端设备和网络连接较慢或流量价格较高的地区。因此,也许我们应该更好地考虑使用什么工具以及如何使用工具。好的开发者体验不应该以牺牲用户体验为代价。


我认为我们(开发人员)应该更多地考虑我们为项目所选择的工具可能带来哪些影响。如果下一次我开始一个新项目,我将不再使用运行时 CSS-in-JS。我要么使用普通的 CSS,要么使用一些构建时 CSS-in-JS 替代方案。


流行的构建时 CSS-in-JS 库包括LinariaAstroturfvanilla-extract。去年,Facebook 推出了自己的构建时 CSS-in-JS 库stylex,开发人员仍然可以使用CSS模块和相关的生态系统(PostCSS模块Sass模块)。


CSS-in-JS 指的是通过 JavaScript 生成 CSS 规则,而不是在外部 CSS 文件中定义样式。运行时 CSS-in-JS 库,如Emotionstyles-component,在运行时动态修改样式,例如将样式标签注入文档。零运行时 CSS-in-JS 是一种在构建时提取所有 CSS 的模式。


查看英文原文https://www.infoq.com/news/2022/10/prefer-build-time-css-js/

2022-11-12 10:004664

评论

发布
暂无评论
发现更多内容

2021年终总结

hasWhere

华为与湖北三所高校共建首批鲲鹏&昇腾产教融合育人基地

科技热闻

资产租赁管理系统解决方案

低代码小观

资产管理 CRM 企业管理系统 融资租赁 CRM系统

一文带你了解数据库设计基础

坚果

数据库 28天写作 12月日更

Java 必看的 Spring 知识汇总!

CRMEB

当 Redis 发生高延迟时,到底发生了什么

程序员历小冰

redis 延迟 28天写作 12月日更

Nginx+IIS做站点访问负载均衡

为自己带盐

nginx dotnet 28天写作 12月日更

11月云短信报告出炉,腾讯云再次蝉联到达率冠军

博睿数据

模型黑盒|机器学习模型的“可解释性”研究

索信达控股

神经网络 机器学习 神经网络模型

Hoo虎符研究院 | 币圈后浪——Swivel Finance

区块链前沿News

Hoo虎符 虎符交易所 虎符研究院

百度CTO王海峰:AI大生产平台再升级 助力中国科技自立自强

百度大脑

人工智能

年底了,聊聊述职

CatTalk

职场

实现一个javaagent需要几步?

BUG侦探

Java javaagent IAST

项目开发架手架规划

hasWhere

世界女性科技群落(四):技术与流行文化顶格发展,日韩女性的科技暗面

脑极体

研究了一圈React学习资料,发现最好用的React教程还是这个

sai

云原生促进基础设施变革,百度“磐玉”蜂巢服务器正式发布

科技热闻

【网络安全】针对 HTTP/2 协议的HTTP Desync攻击

H

网络安全 信息安全 漏洞

AI风起荆楚,人工智能中国体系即刻启航

脑极体

设计消息队列存储消息数据的 MySQL 表格

奔奔

语音信号处理14:语音信号的特征应用

轻口味

28天写作 12月日更

Hadoop学习过程中遇到的错误及解决方法

阿丞

hadoop hdfs mapreduce YARN

忆父亲

wood

28天写作 父亲

基于kali的域控环境搭建——黑盒测试环境搭建

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

Python代码阅读(第73篇):字符串字节数

Felix

Python 编程 字符串 阅读代码 Python初学者

高性能队列Disruptor在测试中应用

FunTester

Disruptor 测试 性能测试 高性能队列 FunTester

信通院首批AIOps系统和工具评估,博睿数据获评异常检测模块“全面级”

博睿数据

Spring框架基础知识(01)

海拥(haiyong.site)

28天写作 12月日更

2021百度AI开发者大会在元宇宙举办

百度大脑

人工智能

个推漫话知识图谱:《女心理师》中的智能语音识别系统如何实现?

个推

机器学习 nlp 知识图谱

Fortinet :《2021 年OT与网络安全现状报告》 之「要点综述」

喀拉峻

网络安全

Emotion库维护者解释为什么Spot公司不再使用运行时CSS-in-JS_大前端_Bruno Couriol_InfoQ精选文章