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

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

公众号新闻

作者 | Bruno Couriol
译者 | 明知山
策划 | 丁晓昀

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的原因——运行时性能成本太高了。

一方面,在渲染时动态计算和更新样式可能会导致渲染变慢。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库包括Linaria、Astroturf和vanilla-extract。去年,Facebook推出了自己的构建时CSS-in-JS库stylex,开发人员仍然可以使用CSS模块和相关的生态系统(PostCSS模块、Sass模块)。

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

原文链接:

https://www.infoq.com/news/2022/10/prefer-build-time-css-js/

声明:本文为InfoQ翻译,未经许可禁止转载。

今日好文推荐

马斯克称 Twitter 可能破产;Meta 暴裁 1.1 万人,小扎承认犯了错;GitHub 年度报告:印度开发者增速超中国 | Q 资讯

动动嘴就能写代码了!Copilot测试新功能“嘿,GitHub”,告别键盘编码

再不拥抱Serverless就晚了 | Q推荐

和Rust一样好,编程更安全?三年实践、员工态度反转,英伟达用 SPARK 换掉 C

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
不影响开发体验,如何将单体 Node.js 变成 Monorepo为什么牛顿能解释天体运行,却解释不了一个毛毛虫?Spring Boot + Filter 实现 Gzip 压缩超大 json 对象,传输耗时大大减少战时CEO美股SPAC|中国SPAC Horizo​​n Space Acquisition I申请6000万美元IPO,目标新兴成长公司图学习如何可解释?首篇《图反事实解释:定义、方法、评价》综述,46页pdf165篇文献全面概述图反事实解释进展学外国要排泄其糟粕吸收其精华日子越来越难过+Costco中国香肠别再使用 JWT 作为 Session 系统!问题重重且很危险。【提示】金山铁路10月11日起调整运行时刻表,运行时长增加广州宣布:对目前在隔的次密者解除隔离!小米工程师提交优化补丁被批,Linux 内核维护者:太疯狂!Go 运行时:4 年之后元气森林不再使用防腐剂;卡乐星最后一家直营店关闭;向太抖音首秀卖出超亿元;吉宝静安中心首次剧透|联商头条广州即日起落实“20条”,次密接者解除隔离15°C 以下,多个对象多条命|48小时cp再谈上海楼市的新变化冰雪冠军,高中创业,纽大学霸...这个00后北京女孩,用运动塑造多面人生“一个人再使劲,也维持不了两个人的感情”【活动】HCSSA &amp; MITCSSA 1111 交友主题桌游夜挪威交响诗 (一)序曲一位前美联储交易员解释为什么美联储可能犯下大错突发!美国Sponsor名额再度缩紧,今年这些公司不要留学生畅游法国(17)-王储的港湾美股SPAC|中国电动汽车公司 Chijet Motor Company, Inc. 与SPAC签订业务合并协议招聘高级应用运维工程师,地点成都ACE X ACSSS X CEO |线下对话Monolith创始人、前红杉中国合伙人曹曦广州:对目前在隔的次密者解除隔离小米工程师提交优化补丁被批,Linux内核维护者:太疯狂!重大变化!这个航空公司不再提供素食飞机餐!网友怒批太荒谬!后Kubernetes时代的未来?Wasmer 3.0 发布,可在浏览器外运行 WebAssembly超级干货 | 4招教你用运营思维规划职业成长【嘉年华】重磅!ISSS 首次携手 CSSA 共同打造嘉年华活动!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。