CSS-in-JS 性能成本缓解策略

作为一种将组件逻辑链接到其样式的方式,CSS-in-JS 在某些场景中变得流行起来。 Aggelos Arvanitakis
提醒开发人员
,在某些情况下,不再能忽略 CSS-in-JS 的成本,并且提供了缓解策略。

Arvanitakis 在一篇文章中指出,尽管 CSS-in-JS 带来了 好处
,但是,它仍可能在某些应用程序中造成性能问题。Arvanitakis 把重点放在React 和两个流行的CSS-in-JS 库( styled-components
emotion
)上,他比较了相同代码的两个版本,其中只有一个版本使用了 CSS-in-JS 样式。无样式版本如下所示:


复制代码

importReactfrom'react';
constNormalDiv =props=>
const App = () => {
const [randomValue, setRandomValue] = React.useState(0);
return (

{new Array(50).fill(null).map((__, i) => (
Hello World
))}
setRandomValue(Math.random())}>Force Rerender

);
};

样式版本如下所示:


复制代码

importstyledfrom'@emotion/styled';
constStyledDiv = styled.div``;
constApp =()=>{
const[randomValue, setRandomValue] = React.useState(0);
return(

{new Array(50).fill(null).map((__, i) => (
Hello World
))}
setRandomValue(Math.random())}>Force Rerender

);
};

样式化的 CSS-in-JS 的实现比无样式版本要多花 50% 的时间在渲染上。尽管在很多情况下,很难察觉与 CSS-in-JS 相关的性能成本,但在其他情况下(如具有大型组件树),它的成本是很难忽略的。Arvantitakis 猜测使用某些库观察到的性能成本可能要归因于它们修改组件树(使用 Context 并添加 Context.Consumer 以读取样式值)以及动态地应用样式(